C ++中的FreeRTOS改变了任务记忆?

时间:2015-09-02 19:29:42

标签: c++ memory freertos

我有以下用于FreeRTOS任务的C ++包装器:

class Threat {
    public:
    Threat(const char* name, uint32_t stackSize, uint8_t priority):
        m_Name(name), m_StackSize(stackSize), m_Priority(priority){
        xTaskCreate(&task_function, "MYTASK", m_StackSize, this, m_Priority, &m_TaskHandle);
    }

    static void task_function(void *p){
        int i = 0;

        Threat* self = static_cast<Threat*>(p);

        while(1){
            i++;
            vTaskDelay(1000);
        }
    }

private:
    const char* m_Name;
    const uint32_t m_StackSize;
    const uint8_t m_Priority;
    TaskHandle_t m_TaskHandle;
};

在我的主要内容中:

int main(void){
    Threat task1("task1", 128, tskIDLE_PRIORITY);
    schedulerStart();
}

当我运行它时,FreeRTOS正确调用task_function,但是如果我查看函数内部的自变量,则数据已被更改。指针是正确的,但task1的数据已被更改(并且不是演员出错 - 我已经检查了内存)。

之前有人见过这个吗?我使用CoIDE和GCC嵌入式。

编辑: 这是数据在main中的外观:

enter image description here

enter image description here

在任务函数中:

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

   printf("%s\n",task1.m_name);

是在堆栈上分配的自动变量,由于它未在作用域中稍后显式引用,这意味着它的内存被回收。

您可以在全局范围内声明task1,在其声明中添加'static',或者通过引用main()底部的task1作弊,例如:

{{1}}

(这将要求您不要将m_name声明为私有)