-2

简短的问题

这个表达是什么意思?

if (ptr->exit)

看起来它真的只是在询问结构的退出值是否为真,我不明白的是,在下面描述的场景中,似乎有一个假值进入了 if 条件。

为什么要问这个

我正在阅读实用程序文件夹中 fsl_shell.c 文件中 NXP 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

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

PS按照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
4

1 回答 1

1

exit似乎是p_shell_context_tstruct 的布尔成员。

if (context->exit)简单来说就是查看exitin struct 所指向的值,context如果是true,则进入 if 语句块,否则,跳过它。

于 2018-10-26T17:45:10.573 回答