为什么SHELL_Main()在FreeRTOS的xTaskCreate中不起作用?

时间:2018-10-26 17:42:30

标签: c pointers freertos nxp-microcontroller

简短问题

这个表达是什么意思?

if (ptr->exit)

看起来好像只是在问该结构的退出值是否为真,我不明白的是,在下面描述的senario中,似乎输入了if条件是一个错误的值。

为什么要问这个问题

我正在读取Utility文件夹中fsl_shell.c文件中的NXP LPC54018 SDK外壳程序脚本的源代码

代码看起来像这样

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;
        }

...

我注意到直接从Main.c调用时,此SHELL_Main()可直接工作。但是,如果我将其包装在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

为什么相同的指针会触发不同的条件?

ODYN-Kon和Ashelly建议的P.S,我仔细检查了指针指向的退出值,结果对我来说没有意义...

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

1 个答案:

答案 0 :(得分:1)

exit似乎是p_shell_context_t结构的布尔成员。

if (context->exit)仅表示在exit指向的结构中查看context的值,如果它是true,则输入if语句块,否则跳过它。