You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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宏,帮助定位任务调度或内存分配类错误

内容的提问来源于stack exchange,提问作者Dodek Mardana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 07:03:20