У меня есть следующая оболочка C ++ для задачи FreeRTOS:
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.
РЕДАКТИРОВАТЬ:
Вот как данные выглядят в основном:
И в функции задачи:
Threat task1(...);
это автоматическая переменная, размещенная в стеке, и, поскольку на нее позже явно не ссылаются, это означает, что ее память восстановлена.
Вы можете объявить task1 в глобальной области видимости, добавить «static» к его объявлению или использовать чит, ссылаясь на task1 в нижней части main (), например,
printf("%s\n",task1.m_name);
(Это потребует, чтобы вы не объявляли m_name частным)