为什么 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语句块,否则跳过它。