C++ 中的 FreeRTOS 更改任务内存?

FreeRTOS in C++ changes task memory?

我有以下 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,但是如果我查看函数内部的 self 变量,数据已经被更改。指针是正确的,但 task1 的数据已更改(而且不是转换出错 - 我检查了内存)。

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

编辑: 这是数据在 main:

中的样子

在任务函数中:

   Threat task1(...);

是一个分配在栈上的自动变量,因为它在后面的作用域中没有被显式引用,这意味着它的内存被回收了。

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

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

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