Keil优化导致错误频生

2020-01-17 19:04发布

我写程序是按照"稳打稳扎""步步为营"的战略,将功能要求各个分解分布实现,每一个模块逐个调试实现再继续写下一个模块.可是当代码写到40K附近时就总会出现一些莫名其妙的问题,比如原先完全正常调试通过的功能不正常了,比如软件模拟一个串行时序,时序就不对了,延时函数我开始都是用示波器观测确定的(观察此函数反汇编没有与之前不同),找了好久的问题最后尝试修改这个函数所在文件优化等级,将速度优先改为代码优先,嘿,好了.
    可是后面接着写又有其它问题了,比如串口接收,每接收到一个字节都计算CRC,一帧结束后校对CRC,原本好好的,增加代码后在某一特殊情况下串口接收不正确了(在其它情况下均正常),设置断点发现计算CRC的函数返回的结果根本就不正确,在该函数内设置断点发现程序都没进入这个函数了.但是我看反汇编确实有进入此函数的代码生成.于是我再次修改此函数所在文件的优化等级,修改为0级后就一切正常了.
    KEIL的默认优化级别是8级速度优先.
    我就有个疑问,为什么在程序小的时候没出现问题,代码越长就出现这样那样的优化问题?更要命的时,在代码很长后写程序如果不正常怎么知道是自己写的程序本身有问题还是KEIL的优化干的坏事?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
xdata
1楼-- · 2020-01-17 21:18
好经验啊,学习了,关于编译器优化的问题我也遇到过的
d-link
2楼-- · 2020-01-18 01:44
我也有这个问题,程序 10k 以下都正常,达到 33k 每次开关机都会造成EEPROM 乱写东西,将优化降到 3 就正常..
变量不优化都已经处理,不知道为什么会乱写..
ioro55555
3楼-- · 2020-01-18 02:10
 精彩回答 2  元偷偷看……
d-link
4楼-- · 2020-01-18 06:36
我用 W77E516B 优化(8)都正常,使用STC12C5A60S2只能优化到(3)...
另外发现一个问题,如果将电源快速开开关关,STC会乱跳程序..甚至将一个没用的程序居然跑进去运行??
为什么W77E516B都不会?
vaneno
5楼-- · 2020-01-18 08:01
确实,优化这个东西你要是水平不够还发现不了。
lovemini
6楼-- · 2020-01-18 12:46
本帖最后由 lovemini 于 2016-5-19 17:51 编辑

说明你的程序没有完全按照规范来写。 有些细节被优化掉了。
尤其是 volatile 关键字的使用。

一周热门 更多>