为什么 SHELL_Main() 在 FreeRTOS 的 xTaskCreate 中不起作用?
why SHELL_Main() doesn't work in xTaskCreate in FreeRTOS?
简短问题:
这个表达式是什么意思?
if (ptr->exit)
看起来真的只是在询问struct的exit value是否为true,我不明白的是在下面描述的senario中,似乎是一个false value进入了if条件。[=19= ]
为什么要问这个
我正在阅读实用程序文件夹fsl_shell.c文件中恩智浦LPC54018 SDK的shell脚本的源代码
代码如下所示
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("start loop, context = %p\n", context);
if (context->exit)
{
printf("context->exit");
break;
}
...
我注意到这个 SHELL_Main() 在直接从 Main.c 调用时直接工作。但是,如果我将其包装在 xTaskCreate 中,然后 运行 vTaskStartScheduler(),即使传入的指针相同,也会触发退出条件。
方法 A:直接从 Main.c 调用(有效)
SHELL_Main(&context);
控制台
SHELL (build: Oct 26 2018)
Copyright (c) 2017 NXP Semiconductor
SHELL>> start loop, context = 0x2fec0
方法 B:由 FreeRTOS 任务包装,触发退出条件
xTaskCreate(
SHELL_Main,
"shell",
1024,
&context,
1,
NULL);
vTaskStartScheduler();
控制台
SHELL (build: Oct 26 2018)
Copyright (c) 2017 NXP Semiconductor
SHELL>> start loop, user_context = 0x2fec0
context->exit
为什么同一个指针会触发不同的条件?
P.S 按照 ODYN-Kon 和 Ashelly 的建议,我仔细检查了指针指向的退出值,结果对我来说没有意义...
while (1)
{
printf("start loop, context = %p\n", context);
printf("context.exit=%s", (context->exit)?"true":"false");
if (context->exit)
{
printf("wth");
break;
}
结果
Copyright (c) 2017 NXP Semiconductor
SHELL>> start loop, context = 0x2fec0
context.exit=falsewth
exit
似乎是 p_shell_context_t
结构的布尔成员。
if (context->exit)
就是看context
指向的struct中exit
的值,如果是true
,则进入if语句块,否则跳过它。
简短问题:
这个表达式是什么意思?
if (ptr->exit)
看起来真的只是在询问struct的exit value是否为true,我不明白的是在下面描述的senario中,似乎是一个false value进入了if条件。[=19= ]
为什么要问这个
我正在阅读实用程序文件夹fsl_shell.c文件中恩智浦LPC54018 SDK的shell脚本的源代码
代码如下所示
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("start loop, context = %p\n", context);
if (context->exit)
{
printf("context->exit");
break;
}
...
我注意到这个 SHELL_Main() 在直接从 Main.c 调用时直接工作。但是,如果我将其包装在 xTaskCreate 中,然后 运行 vTaskStartScheduler(),即使传入的指针相同,也会触发退出条件。
方法 A:直接从 Main.c 调用(有效)
SHELL_Main(&context);
控制台
SHELL (build: Oct 26 2018)
Copyright (c) 2017 NXP Semiconductor
SHELL>> start loop, context = 0x2fec0
方法 B:由 FreeRTOS 任务包装,触发退出条件
xTaskCreate(
SHELL_Main,
"shell",
1024,
&context,
1,
NULL);
vTaskStartScheduler();
控制台
SHELL (build: Oct 26 2018)
Copyright (c) 2017 NXP Semiconductor
SHELL>> start loop, user_context = 0x2fec0
context->exit
为什么同一个指针会触发不同的条件?
P.S 按照 ODYN-Kon 和 Ashelly 的建议,我仔细检查了指针指向的退出值,结果对我来说没有意义...
while (1)
{
printf("start loop, context = %p\n", context);
printf("context.exit=%s", (context->exit)?"true":"false");
if (context->exit)
{
printf("wth");
break;
}
结果
Copyright (c) 2017 NXP Semiconductor
SHELL>> start loop, context = 0x2fec0
context.exit=falsewth
exit
似乎是 p_shell_context_t
结构的布尔成员。
if (context->exit)
就是看context
指向的struct中exit
的值,如果是true
,则进入if语句块,否则跳过它。