编译器优化等级提高导致的死机问题

如下图代码

 理论上执行完UART4_IROHandler_num = 0才对,-O1的时候的确如此,但是开启-O3后已进入这个中断就会HardFault。

好在停止仿真后能看出来死在了哪里

 然后就进来UART4_IRQHandler单步仿真看是哪句话导致的,定位到最后一句的赋值操作,应该赋值0的,但是每次都是个无序值。

查看汇编

 这里它直接取 R4寄存器+4地址里的值跟0x09比较,少了for循环里的赋值。

其实就是它把我们的for循环优化成了两种情况,一种是UART4_IROHandler_num ==9, 另一种我也看不懂

 所以解决也很简单,在定义处给i赋个初始值 uint8 i=0;即可。

posted @ 2024-04-17 17:54  xjxcxjx  阅读(53)  评论(0编辑  收藏  举报