最近改了一个别人写的程序,但是在调试器调试过程中出现了一个奇怪的现象,代码部分如下:
Sys_Run这个函数在main函数中被无限循环调用,初始化时我会将TCENABLE这个标志位置0,通过CAN发送信息来改变他的数值。
按道理来说当我运行程序时,如果我什么都不动,程序应该一直在循环等待直至TCENABLE被置1才会进入处理过程。
但奇怪的是我在191行打个断点程序居然停了,通过Watch界面我看到TCENABLE的值仍然是0,单步执行发现程序执行了191和192两行代码。我不停地单步执行,奇怪的事情又发生了:有时候到了while判断就直接出来,有时候又会执行191和192两行,但是TCENABLE的值一直是没有变化的。
我在网上搜了好久百思不得其解,询问了老师傅一眼指出了问题所在:
这里面有个Optimization选项,因为程序原版是别人写的,应该是他认为设置为了level3。这个选项什么意思呢,简单来说就是编译器的优化等级,一共四个等级0-3等级越高优化效率越高。等级为0就是关闭优化,我们编写程序时初始化值一般都是level0。具体相关等级的优化效果可以去查keil的说明手册,我这里大概简述一下高等级的作用:优化你的代码,提高代码运行的效率。但同时代码的运行逻辑并不会如你想象的那样运行。
于是我将优化等级改为level0后程序不再乱跑。
如果你是资深玩家那么提高优化等级无疑是一件好事,因为编译器优化的只是最后执行的过程,如果你能看懂汇编就会发现并不会优化汇编部分。但是对于初学者提高优化等级会在调试过程中带来很多谜一样的问题。