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 声明为私有)
我有以下 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 声明为私有)