signed

QiShunwang

“诚信为本、客户至上”

keil5 stm32 跳不出循环while解决过程及方法

2021/6/3 16:15:35   来源:

问题现象:

在主函数main中,有等待某一状态变量改变的while循环,在调试模式下观测该状态已经发生了改变,但while判断就是过不去,在单步调试下尝试,判断是可以过去的。而全速运行过不去。

解决过程:

首先要确定程序是死在哪里了,最好的办法就是看汇编代码:view->Disassembly windows

发现程序死在了:CMP      r0,#0x00

这里的r0是cpu寄存器,其值一直为0,没有把该状态变量的值取到r0寄存器。

那么为什么没把该值存入r0寄存器呢,调试时,程序一直执行CMP命令,没有执行取值的命令,所以问题的原因就是编译器在编译时认为该状态变量只会在main函数中使用,所以只取了一次状态值到r0,然后状态值发生了变化,主函数却未能感知到,所以才出现这个问题。

印证我的猜想:在while中调用一个hal_delay(1);函数,那么当调用之后再判断时,就会再取一次状态值进行CMP。

下面就开始解决编译器的编译优化问题,走了很多弯路,改下面的配置,试了很多次,快绝望的时候,把optimization中的Level 3改为Level 0,测试后,问题解决,再改成Level 3后,问题未能复现,查看汇编时,有看到CMP后有继续取值的操作。

 

解决方法就是:把optimization中的Level 3改为Level 0