无故触发的协处理器异常 | STM32 排错

/ 0评 / 0

长话短说:不要相信内联汇编。

仍然是任务调度的部分。自从上一次的 WWDG 无故触发后,又撞到这种非常神奇的问题。

这次的问题现象是:当 pending_service_handler 里包含任务切换的相关内联汇编时,无法进入内核。而且不会在调试器内触发 hard_fault_handler. 观察 xPSR 得知 IT 值为 3, 仍然是 HardFault. 更有趣的是,此时如果断开调试器,MCU 就会死锁,且不再响应之后的调试请求。这时候就必须从自举程序中启动才能再次刷写固件。

但最头疼的地方是:CFSR 的值几乎是随机的。每次触发异常时,CFSR 中都会是一个完全不合理的值。通常会是「协处理器未就绪」,但有些时候会同时设置「未定义指令」、「未对齐访问」等等内容。同时,LR, SPPC 的值也经常是到处乱飞。

如果注释掉 pending_service_handler 里的所有内容,那么一切正常;如果 peding_service_handler 中只有一行 __asm volatile ("nop\r\n bx lr") 那么也是一切正常。但是如果把切换代码解注释,程序就立刻崩溃。

最后,本着死马当活马医的思路,单独创建了 .s 文件并把代码填进去。然后编译器就报出了迷之错误:该指令不能在 Thumb 指令集内使用。

修复这些问题,再重新编译链接,烧写之后一切正常。所以主要的问题就在于内联汇编生成了不在指令集内的机器码,导致神秘的事情发生。

基本就是这样。

发表评论

电子邮件地址不会被公开。 必填项已用*标注