vTaskStartScheduler() 覆盖指针参数值,如何避免?

vTaskStartScheduler() overwrites the pointer param values, how to avoid that?

我创建了一个 freeRTOS 任务,并传递了一个结构指针作为函数参数。

我注意到结构 属性 在 vTaskStartScheduler()

之后发生了变化

如何保护我的结构?

这是代码

主要

    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

如果我直接在 main 中调用 SHELL_Main() 而不是将其包装在任务中,这里是控制台

exit=0entered shell_main

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

我推测在调用 vTaskStartScheduler() 后某处有溢出覆盖了我的 context.exit,但我不知道如何保护我的结构。有人可以分享一些想法吗?

SHELL_Main 是修改您的结构的内容 (context->exit = false;)。您创建该任务并将 context 作为参数传递给它。当您启动调度程序时,该任务将获得 运行 并将其设置为 false.

事实上vTaskStartScheduler()从来没有returns。请在此处查看文档:https://www.freertos.org/a00132.html

从下面的评论来看,问题似乎是由 printf_data_func() 造成的。深入挖掘。