Keil在线调试程序乱跑

文章讲述了作者在调试程序时遇到的一个奇怪现象,即程序行为与预期不符。问题出在编译器的优化等级设置,原本设为level3,导致代码逻辑在高优化下运行不按预期。降低优化等级到level0后,问题解决。作者提醒,对于初学者,高优化等级可能在调试时带来困扰,而资深开发者则可以利用优化提高代码效率。
摘要由CSDN通过智能技术生成

        最近改了一个别人写的程序,但是在调试器调试过程中出现了一个奇怪的现象,代码部分如下:

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后程序不再乱跑。

        如果你是资深玩家那么提高优化等级无疑是一件好事,因为编译器优化的只是最后执行的过程,如果你能看懂汇编就会发现并不会优化汇编部分。但是对于初学者提高优化等级会在调试过程中带来很多谜一样的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值