Короткий вопрос :
Что означает это выражение?
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