长话短说:不要相信内联汇编。
仍然是任务调度的部分。自从上一次的 WWDG 无故触发后,又撞到这种非常神奇的问题。
这次的问题现象是:当 pending_service_handler
里包含任务切换的相关内联汇编时,无法进入内核。而且不会在调试器内触发 hard_fault_handler
. 观察 xPSR
得知 IT
值为 3, 仍然是 HardFault
. 更有趣的是,此时如果断开调试器,MCU 就会死锁,且不再响应之后的调试请求。这时候就必须从自举程序中启动才能再次刷写固件。
但最头疼的地方是:CFSR
的值几乎是随机的。每次触发异常时,CFSR
中都会是一个完全不合理的值。通常会是「协处理器未就绪」,但有些时候会同时设置「未定义指令」、「未对齐访问」等等内容。同时,LR
, SP
和 PC
的值也经常是到处乱飞。
如果注释掉 pending_service_handler
里的所有内容,那么一切正常;如果 peding_service_handler
中只有一行 __asm volatile ("nop\r\n bx lr")
那么也是一切正常。但是如果把切换代码解注释,程序就立刻崩溃。
最后,本着死马当活马医的思路,单独创建了 .s
文件并把代码填进去。然后编译器就报出了迷之错误:该指令不能在 Thumb 指令集内使用。
修复这些问题,再重新编译链接,烧写之后一切正常。所以主要的问题就在于内联汇编生成了不在指令集内的机器码,导致神秘的事情发生。
基本就是这样。
正在加载评论……