STM32F4XX VGT6更换后FreeRTOS仅高优先级任务运行求助
STM32F4XX VGT6更换后FreeRTOS任务异常排查求助
几天前我的STM32F4XX VGT6单片机因短路损坏,更换同型号新单片机后,运行原代码时无任务执行。随后我编写了包含两个不同优先级任务的测试代码,但仅高优先级任务能够运行。我使用Arduino IDE编写代码,生成二进制文件后通过ST-LINK Utility完成烧录,现困惑问题源于代码配置错误还是单片机损坏,特求助排查。
测试代码
#include <HardwareTimer.h> #include <STM32FreeRTOS.h> void Sensor(void *pvParameters) { while (1) { Serial.println("Sensor"); vTaskDelay(10 / portTICK_PERIOD_MS); } } void Kaki(void *pvParameters) { while (1) { Serial.println("Kaki"); vTaskDelay(1000 / portTICK_PERIOD_MS); } } void setup() { Serial.setTx(PA9); Serial.setRx(PA10); Serial.begin(9600); delay(5000); xTaskCreate(Sensor, "Sensor", 1024, NULL, 1, // 低优先级 NULL); xTaskCreate(Kaki, "Kaki", 1024, NULL, 2, // 高优先级 NULL); vTaskStartScheduler(); } void loop() { }
排查建议
- 硬件层面排查
- 检查新单片机的焊接/安装质量,确认无虚焊、短路,重点核实电源、时钟引脚的连接是否正常
- 验证烧录过程:ST-LINK烧录时是否无报错,烧录完成后可尝试读回芯片内程序,确认烧录成功
- 基础功能测试:编写一个不含FreeRTOS的简单程序(比如LED闪烁、串口持续输出),验证单片机本身能否正常工作
- 代码配置排查
- 确认FreeRTOS抢占式调度开启:检查
configUSE_PREEMPTION宏是否设为1,关闭该选项会导致低优先级任务无法抢占CPU - 修正延时计算:建议用
pdMS_TO_TICKS(10)替代10 / portTICK_PERIOD_MS,避免因系统节拍周期配置不同导致的延时错误 - 检查串口初始化时机:
delay(5000)可能没必要,可尝试移除,确保串口初始化完成后再启动任务调度器 - 验证任务创建状态:检查
xTaskCreate的返回值(如pdPASS),确认低优先级任务是否成功创建 - 调整任务栈大小:可尝试增大低优先级任务的栈空间(比如设为2048),避免因栈溢出导致任务无法运行
- 开启FreeRTOS错误检测:启用
configASSERT宏,帮助定位任务调度或内存分配类错误
- 确认FreeRTOS抢占式调度开启:检查
内容的提问来源于stack exchange,提问作者Dodek Mardana
相关产品推荐
相关产品推荐

