我有以下用于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中的外观:
在任务函数中:
答案 0 :(得分:1)
printf("%s\n",task1.m_name);
是在堆栈上分配的自动变量,由于它未在作用域中稍后显式引用,这意味着它的内存被回收。
您可以在全局范围内声明task1,在其声明中添加'static',或者通过引用main()底部的task1作弊,例如:
{{1}}
(这将要求您不要将m_name声明为私有)