vTaskStartScheduler () перезаписывает значения параметров указателя, как этого избежать? - PullRequest
0 голосов
/ 26 октября 2018

Я создал задачу freeRTOS и передал указатель структуры в качестве параметра функции.

Я заметил, что свойство struct было изменено после vTaskStartScheduler ()

Как защитить мою структуру?

Вот код

Main

    xTaskCreate(
                        SHELL_Main, // function the task calls
                        "shell", // nametag for debug console
                        512, // assigned buffersize
                        &user_context,// Parameter passed in
                        1, // task priority
                        NULL); //task handle

    printf("exit=%i", (&user_context)-> exit);
    vTaskStartScheduler();

SHELL_Main ()

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("context.exit=%s", (context->exit)?"true\n":"false\n");
      printf("context.exit=%i", (context->exit));

        if (context->exit)
        {
            printf("wtf");
            break;
        }

...

Вот консоль

exit=0entered shell_main

SHELL (build: Oct 26 2018)
Copyright (c) 2017 NXP Semiconductor
SHELL>> context.exit=true
context.exit=253wtf

Если я вместо этого вызываю SHELL_Main () непосредственно в mainОборачивая это в задачу, вот консоль

exit=0entered shell_main

SHELL (build: Oct 26 2018)
Copyright (c) 2017 NXP Semiconductor
SHELL>> context.exit=false
context.exit=0

Я предполагаю, что где-то есть переполнение, которое перезаписывает мой context.exit после вызова vTaskStartScheduler (), но я не знаю, как защитить мою структуру.Может кто-нибудь любезно поделиться какой-нибудь идеей?

1 Ответ

0 голосов
/ 26 октября 2018

SHELL_Main - это то, что изменяет вашу структуру (context->exit = false;). Вы создаете эту задачу и передаете ей context в качестве параметра. Когда вы запускаете планировщик, эта задача запускается и задает для нее false.

На самом деле vTaskStartScheduler() никогда не возвращается. Смотрите документ здесь: https://www.freertos.org/a00132.html

Из комментариев ниже звучит, как printf_data_func() вызывает проблемы. Копай дальше в этом.

...