移植freeRTOS的小bug
FreeRTOS 跑不起来
现象: 调度器启动后进不了任务,或一跑就卡死/断言。
常见原因:
- 启动前 SysTick 优先级太高,抢在 SVC 前面,第一个任务切不进去。,应该设置最低的中断
- 外设中断里调了 FreeRTOS 的 FromISR,但中断优先级太高,触发断言停住。
记住: 内核用的中断要最“钝”;能调 FreeRTOS API 的中断不能太“尖”。
| 中断 | 建议 |
|---|---|
|
SVC
|
别改,默认 0
|
|
SysTick / PendSV
|
15(最低)
|
|
USART 等 FromISR
|
≥ 5
|
延时慢了整整 8 倍
现象: 写了延时 200ms,示波器量到约 1.6s(刚好 ×8)。握手、HAL_Delay 也会一起变慢。
原因: 多定义了 configSYSTICK_CLOCK_HZ。FreeRTOS 把 SysTick 当成“慢档(主频/8)”来跑,间隔却按“全速”去设,于是每个 tick 实际约 8ms。因为systick有两个挡位显示声明在FreeRTOS中就直接进入第二个挡位
处理: 删掉这行定义,让 SysTick 跟 CPU 同频。灯闪恢复约 200ms,时间就对了。
浙公网安备 33010602011771号