我正在使用 STM32F405RGT + HAL 驱动程序 + FreeRTOSv9。代码是C++。首先,我写C的代码的时候,是没有问题的。但是 C++ 出了点问题。
main.cc 中的入口点
extern "C" int main(void) {
HAL_Init();
SystemClock_Config();
xTaskCreate(startup, "startup", STARTUP_TASK_STACK, NULL, STARTUP_TASK_PRIO, NULL);
vTaskStartScheduler();
return 0;
}
而“启动”任务是
static void startup(void *param) {
Config::GetInstance().Init();
Command::GetInstance().Init();
while (1) {
trace("startup\r\n");
vTaskDelay(M2T(1000));
}
vTaskDelete(nullptr);
}
在“Command::GetInstance().Init()”中,创建另一个任务,在该任务中,只有 vTaskDelay(_500ms) 和 printf("something\r\n")。就这样。
如果我在“启动”任务中使用“HAL_Delay()”,一切正常。在控制台中,我可以看到两个字符串——“startup”和“something”。但是当我在“启动”任务中使用“vTaskDelay()”时,它应该卡在“vTaskDelay()”和系统调用“HardFault_Handler()”中。
我真的不知道为什么。
您可能不应该在中断处理程序中正确地增加 Systick。您应该检查您的中断滴答声或检查文件末尾 freertos_config.h 中的特殊定义,以使 freertos 与 hal_delay 兼容。
我是一名优秀的程序员,十分优秀!