Sar*_*a M 1 c operating-system task freertos
我试图将一组参数传递给任务。所以我创建了一个结构并将其传递给我的任务,如下所示:
my_type_t parameters_set;
//... assigning values to parameters_set
xTaskCreate( vMyTask, "MyTask", STACK_SIZE, (void*)parameters_set, 2,
&xHandle);
Run Code Online (Sandbox Code Playgroud)
在我的任务中,我尝试执行以下操作来检索结构值:
my_type_t received_parameters = (my_type_t) pvParameters;
Run Code Online (Sandbox Code Playgroud)
任务创建行在编译时触发以下错误:“无法转换为指针类型”,结构检索行触发“请求转换为非标量类型”错误。我知道如果我使用指针而不是变量本身,它会编译,但我不能这样做,因为创建任务的函数将会终止,并且任务将引用一个不再存在的变量。最后我将使用全局结构变量。
但我真正想理解的是为什么任务接受 int 值(不是通过引用),而不接受 typedef 结构?例如,以下代码片段可以毫无问题地构建和运行:
//Inside the function that creates the task
int x = 0;
xTaskCreate( vMyTask, "MyTask", STACK_SIZE, (void*)x, 2,
&xHandle);
//Inside the Task
int received_parameter = (int) pvParameters;
Run Code Online (Sandbox Code Playgroud)
提前致谢!
您显示的代码没有将int值作为参数。您可以使用 传递参数(void*)x,这是一个将 转换int x为指针的表达式。
该函数xTaskCreate接受一个指针。您已经给了它一个指针,因此编译器不会抱怨。但是,您给它的指针不是指向的指针( x可写为),而是从 的值转换而来的&x指针。尽管编译器不会抱怨,但这通常不是传递给. xxTaskCreate
这不适用于结构的原因是,当是结构时,这(void*)parameters_set不是正确的表达式。parameters_set这是因为 C 提供了将整数转换为指针的功能,但没有提供将结构转换为指针的功能。一般来说,整数和指针之间存在天然的对应关系:在 \xe2\x80\x9cflat\xe2\x80\x9d 地址空间中,内存中的每个字节都有一个地址,这些地址本质上是来自 \xe2\ 的字节数。内存地址空间的x80\x9cstart\xe2\x80\x9d。因此整数可以用作地址,反之亦然。(在其他地址空间中,对应关系可能更复杂,但 C 仍然允许转换,但有一些规则。)因此,当您编写 时(void*)x,编译器会将整数值转换为x指针。
结构体和指针之间不存在这种对应关系,因此 C 标准没有定义任何从结构体到指针的转换,并且当您编写(void*)parameters_set.
您应该为此参数传递的是要提供给任务的一些数据的地址。如果您希望任务包含数据x,则应该通过&x。如果您希望任务包含数据parameters_set,则应该通过¶meters_set。该&运算符获取其操作数的地址,这与使用(void*)强制转换不同,后者尝试将其操作数转换为指针。
根据RTOS 文档xTaskCreate,您不应传递 \xe2\x80\x9cstack 变量 \xe2\x80\x9d 的地址,对于 C 来说,它实际上意味着一个具有自动存储持续时间的对象。换句话说,您不应该传递在没有 or 的函数中定义的xor (可能取决于 RTOS 和 C 实现的安排;我对 RTOS 不熟悉)。或者,您可以使用(或者,根据下面的注释,对于 RTOS)为参数分配空间并将其传递给.parameters_setstatic_Thread_localmallocpvPortMallocxTaskCreate