Cortex-M0+设备突发SysTick死循环导致中断失效的偶发Bug排查求助
Cortex-M0+设备突发SysTick死循环导致中断失效的偶发Bug排查求助
各位大佬好,想请教一个困扰我的偶发Bug问题:
我负责的一款嵌入式设备已经稳定运行好几年了,这段和SysTick相关的代码也从来没做过修改,但最近突然碰到了一次所有中断都失效的诡异情况。
经过一番排查,用GDB调试后发现程序卡在了一个延时函数的while循环里,就是下面这个delay_ns函数中等待COUNTFLAG的那一行:
void delay_ns(uint32_t ns) { SysTick->CTRL = 0; SysTick->VAL = 0; SysTick->LOAD = 16 * ns; // 16对应16MHz时钟 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)) // 程序卡在这里 ; SysTick->CTRL = 0; }
我本身不是专职MCU开发的,正在尽力梳理问题的来龙去脉,目前已知的关键信息:
- 设备使用的是Cortex-M0+内核
- 这个延时函数的逻辑是通过配置SysTick定时器来实现纳秒级延时,核心是等待SysTick_CTRL寄存器的COUNTFLAG位被置位,正常情况下这个逻辑一直稳定运行
想请教各位大佬:有没有碰到过类似的偶发情况?会不会是SysTick的某些异常状态导致COUNTFLAG一直无法置位?或者有没有硬件层面的因素可能触发这个问题?
备注:内容来源于stack exchange,提问作者mescande
相关产品推荐
相关产品推荐

