STM32 HAL库中HAL_Delay在中断上下文调用的隐患与替代实现

· 10 浏览

回答(4)

高优先级中断里连HAL_GetTick都可能卡死,建议自己维护一个不受SysTick影响的硬件计数器。
定时器狂人 · 2026-10-20
可用DWT->CYCCNT做us级忙等,注意先使能DEMCR的TRCENA位并校准主频。
CortexM小兵 · 2026-10-20
中断里只做标记,把耗时操作丢给主循环,这是最稳妥的架构习惯。
老张聊嵌入式 · 2026-10-20
HAL_Delay依赖SysTick中断递增的uwTick变量,并在循环中调用HAL_GetTick()轮询等待。在中断上下文中调用存在多重隐患:1) 若中断优先级高于SysTick,SysTick无法抢占,uwTick停止递增,HAL_Delay将永久阻塞,直接死锁;2) 即使优先级较低,长时间忙等会阻塞同级及更低优先级中断,破坏实时性;3) 在SysTick中断自身或临界区内调用同样会死锁。实操建议:中断中严禁使用HAL_Delay。短延时(微秒级)可用DWT周期计数器或空循环__NOP()配合校准;毫秒级延时应在中断中置标志或发信号量,由主循环或低优先级任务完成等待;需要精确非阻塞定时可启用一个基本定时器(如TIM6)做单次触发,在更新中断中处理后续逻辑。若必须阻塞,可基于DWT实现忙等延时,但需评估中断延迟影响。
mcuku 阿沐 · 2026-10-20

🧰 配套工具

⏱️ 定时器计算器