почему SHELL_Main () не работает в xTaskCreate во FreeRTOS? - PullRequest
0 голосов
/ 26 октября 2018

Короткий вопрос :

Что означает это выражение?

if (ptr->exit)

Похоже, он просто спрашивает, является ли значение выхода структуры истиннымчто я не понимаю, так это то, что в описанном ниже сенарио неверное значение введено в условие if.

зачем спрашивать это

Я читаюисходный код для сценария оболочки для NXP LPC54018 SDK в файле fsl_shell.c в папке утилит

Код выглядит следующим образом

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, и Ашелли дважды проверил значение выхода, на которое указывает указатель, и результат не имеет смысла для меня ...

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 голосов
/ 26 октября 2018

exit представляется логическим членом p_shell_context_t struct.

if (context->exit) просто означает просмотр значения exit в структуре, на которую указывает context, и если это true, введите блок оператора if, в противном случае пропустите его.

...