Keil优化导致错误频生

2020-01-17 19:04发布

我写程序是按照"稳打稳扎""步步为营"的战略,将功能要求各个分解分布实现,每一个模块逐个调试实现再继续写下一个模块.可是当代码写到40K附近时就总会出现一些莫名其妙的问题,比如原先完全正常调试通过的功能不正常了,比如软件模拟一个串行时序,时序就不对了,延时函数我开始都是用示波器观测确定的(观察此函数反汇编没有与之前不同),找了好久的问题最后尝试修改这个函数所在文件优化等级,将速度优先改为代码优先,嘿,好了.
    可是后面接着写又有其它问题了,比如串口接收,每接收到一个字节都计算CRC,一帧结束后校对CRC,原本好好的,增加代码后在某一特殊情况下串口接收不正确了(在其它情况下均正常),设置断点发现计算CRC的函数返回的结果根本就不正确,在该函数内设置断点发现程序都没进入这个函数了.但是我看反汇编确实有进入此函数的代码生成.于是我再次修改此函数所在文件的优化等级,修改为0级后就一切正常了.
    KEIL的默认优化级别是8级速度优先.
    我就有个疑问,为什么在程序小的时候没出现问题,代码越长就出现这样那样的优化问题?更要命的时,在代码很长后写程序如果不正常怎么知道是自己写的程序本身有问题还是KEIL的优化干的坏事?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
mathison
1楼-- · 2020-01-18 18:13
lovemini 发表于 2016-5-19 17:50
说明你的程序没有完全按照规范来写。 有些细节被优化掉了。
尤其是 volatile 关键字的使用。 ...

同意你的说法
dz_xinyu
2楼-- · 2020-01-18 20:51
 精彩回答 2  元偷偷看……
Immortality
3楼-- · 2020-01-18 23:51
dz_xinyu 发表于 2016-6-29 14:57
如果你不懂优化的原理,就不要使用它,否则出现问题没法解决

可以完全不使用优化,但不优化生成的烧录文件大好多。。(话说现在的优化也够吐血的,你放个变量计数什么的,它认为没用就给优化掉了。。而且Keil的优化等级默认是最狠的那种,可苦了不少同学了。。
dz_xinyu
4楼-- · 2020-01-19 00:46
Immortality 发表于 2016-6-29 17:05
可以完全不使用优化,但不优化生成的烧录文件大好多。。(话说现在的优化也够吐血的,你放个变量计数什么 ...

看来优化真得重视起来了
gamethink
5楼-- · 2020-01-19 01:16
我自从开始用keil开始,一直都用第8级优化,曾经遇到有很多故障都认为是优化问题,果然去掉优化问题不存在,但最后发现还是自己的代码不规范
zhonghua_li
6楼-- · 2020-01-19 02:03
一般说来,如果你发现优化出了问题,都是你程序写的问题。

一周热门 更多>