vTaskStartScheduler() 覆盖指针参数值,如何避免?
vTaskStartScheduler() overwrites the pointer param values, how to avoid that?
我创建了一个 freeRTOS 任务,并传递了一个结构指针作为函数参数。
我注意到结构 属性 在 vTaskStartScheduler()
之后发生了变化
如何保护我的结构?
这是代码
主要
xTaskCreate(
SHELL_Main, // function the task calls
"shell", // nametag for debug console
512, // assigned buffersize
&user_context,// Parameter passed in
1, // task priority
NULL); //task handle
printf("exit=%i", (&user_context)-> exit);
vTaskStartScheduler();
SHELL_Main()
int32_t SHELL_Main(p_shell_context_t context)
{
printf("entered shell_main\n");
uint8_t ch;
int32_t i;
if (!context)
{
return -1;
}
context->exit = false;
context->printf_data_func("\r\nSHELL (build: %s)\r\n", __DATE__);
context->printf_data_func("Copyright (c) 2017 NXP Semiconductor\r\n");
context->printf_data_func(context->prompt);
while (1)
{
printf("context.exit=%s", (context->exit)?"true\n":"false\n");
printf("context.exit=%i", (context->exit));
if (context->exit)
{
printf("wtf");
break;
}
...
这里是控制台
exit=0entered shell_main
SHELL (build: Oct 26 2018)
Copyright (c) 2017 NXP Semiconductor
SHELL>> context.exit=true
context.exit=253wtf
如果我直接在 main 中调用 SHELL_Main() 而不是将其包装在任务中,这里是控制台
exit=0entered shell_main
SHELL (build: Oct 26 2018)
Copyright (c) 2017 NXP Semiconductor
SHELL>> context.exit=false
context.exit=0
我推测在调用 vTaskStartScheduler() 后某处有溢出覆盖了我的 context.exit,但我不知道如何保护我的结构。有人可以分享一些想法吗?
SHELL_Main
是修改您的结构的内容 (context->exit = false;
)。您创建该任务并将 context
作为参数传递给它。当您启动调度程序时,该任务将获得 运行 并将其设置为 false
.
事实上vTaskStartScheduler()
从来没有returns。请在此处查看文档:https://www.freertos.org/a00132.html
从下面的评论来看,问题似乎是由 printf_data_func()
造成的。深入挖掘。
我创建了一个 freeRTOS 任务,并传递了一个结构指针作为函数参数。
我注意到结构 属性 在 vTaskStartScheduler()
之后发生了变化如何保护我的结构?
这是代码
主要
xTaskCreate(
SHELL_Main, // function the task calls
"shell", // nametag for debug console
512, // assigned buffersize
&user_context,// Parameter passed in
1, // task priority
NULL); //task handle
printf("exit=%i", (&user_context)-> exit);
vTaskStartScheduler();
SHELL_Main()
int32_t SHELL_Main(p_shell_context_t context)
{
printf("entered shell_main\n");
uint8_t ch;
int32_t i;
if (!context)
{
return -1;
}
context->exit = false;
context->printf_data_func("\r\nSHELL (build: %s)\r\n", __DATE__);
context->printf_data_func("Copyright (c) 2017 NXP Semiconductor\r\n");
context->printf_data_func(context->prompt);
while (1)
{
printf("context.exit=%s", (context->exit)?"true\n":"false\n");
printf("context.exit=%i", (context->exit));
if (context->exit)
{
printf("wtf");
break;
}
...
这里是控制台
exit=0entered shell_main
SHELL (build: Oct 26 2018)
Copyright (c) 2017 NXP Semiconductor
SHELL>> context.exit=true
context.exit=253wtf
如果我直接在 main 中调用 SHELL_Main() 而不是将其包装在任务中,这里是控制台
exit=0entered shell_main
SHELL (build: Oct 26 2018)
Copyright (c) 2017 NXP Semiconductor
SHELL>> context.exit=false
context.exit=0
我推测在调用 vTaskStartScheduler() 后某处有溢出覆盖了我的 context.exit,但我不知道如何保护我的结构。有人可以分享一些想法吗?
SHELL_Main
是修改您的结构的内容 (context->exit = false;
)。您创建该任务并将 context
作为参数传递给它。当您启动调度程序时,该任务将获得 运行 并将其设置为 false
.
事实上vTaskStartScheduler()
从来没有returns。请在此处查看文档:https://www.freertos.org/a00132.html
从下面的评论来看,问题似乎是由 printf_data_func()
造成的。深入挖掘。