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

时间:2018-10-26 19:44:19

标签: freertos

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

我注意到vTaskStartScheduler()之后struct属性已更改

如何保护我的结构?

这是代码

主要

    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,但是我不知道如何保护我的结构。有人可以分享一些想法吗?

1 个答案:

答案 0 :(得分:1)

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

实际上vTaskStartScheduler()永不返回。在此处查看文档:{​​{3}}

从下面的评论中,听起来像printf_data_func()引起了问题。进一步挖掘。