我是一个电子产品的人,请好好对待我.
我读到这一篇关于实时操作系统的8位微控制器.我遇到了一个奇怪的观点,我遇到了这个函数.我无法理解它在做什么.我知道这void意味着"没有类型".我猜这(*Task)是铸造.我真的不知道那之后那些括号是做什么的.
这个函数的论点包括什么?
另外,我无法理解做*(int*)((NewTCB->Stack) + (STACK_DEPTH-2)) = (int)Task;什么?

void (*Task)()实际上是一个函数指针.基本上它是说:"参数名称是Task,它是一个返回的函数void和(因为这是c而不是c ++)需要任意数量的参数.
所以你可以这样称呼它:
void my_task() {
/* do something */
}
TaskCreate(my_task);
Run Code Online (Sandbox Code Playgroud)
当然,写作也是安全的void my_task(void) {.编码c时,我个人更喜欢明确说"没有参数"
最后,*(int*)((NewTCB->Stack) + (STACK_DEPTH-2)) = (int)Task;正在做一些施法魔法.
让我们来区分它:
(int)Task首先转换Task为int(这是有问题的,但可能对你的特定架构/操作系统没问题.就个人而言,我会使用a long来保证安全).
((NewTCB->Stack) + (STACK_DEPTH-2))只是做一些简单的算术NewTCB->Stack来获得指向TCB堆栈中位置的指针.
*(int*)说"将其转换为a int *然后deference(读取或写入)它指向的位置.
我们可以更简单地写这个如下:
int f = (int)Task;
int s = ((NewTCB->Stack) + (STACK_DEPTH-2)); /* I don't know the type of `NewTCB->Stack`, so we'll pretend 'int' for now */
int *stack_ptr = (int*)s;
*stack_ptr = f;
Run Code Online (Sandbox Code Playgroud)
这可能更清楚.
关注:我想指出我如何使用倾向于使用函数指针,因为语法有时会有点混乱.我发现这种方法非常有用.基本上我喜欢typedef为函数指针创建一个并使用它,我发现它更容易正确:
例如:
/* typedef func_t to be a pointer to a function taking no arguments and returning void */
typedef void (*func_t)(void);
Run Code Online (Sandbox Code Playgroud)
然后......
void CreateTask(func_t task) {
/* same work as your example, just a little easier to read */
}
Run Code Online (Sandbox Code Playgroud)