我写程序是按照"稳打稳扎""步步为营"的战略,将功能要求各个分解分布实现,每一个模块逐个调试实现再继续写下一个模块.可是当代码写到40K附近时就总会出现一些莫名其妙的问题,比如原先完全正常调试通过的功能不正常了,比如软件模拟一个串行时序,时序就不对了,延时函数我开始都是用示波器观测确定的(观察此函数反汇编没有与之前不同),找了好久的问题最后尝试修改这个函数所在文件优化等级,将速度优先改为代码优先,嘿,好了.
可是后面接着写又有其它问题了,比如串口接收,每接收到一个字节都计算CRC,一帧结束后校对CRC,原本好好的,增加代码后在某一特殊情况下串口接收不正确了(在其它情况下均正常),设置断点发现计算CRC的函数返回的结果根本就不正确,在该函数内设置断点发现程序都没进入这个函数了.但是我看反汇编确实有进入此函数的代码生成.于是我再次修改此函数所在文件的优化等级,修改为0级后就一切正常了.
KEIL的默认优化级别是8级速度优先.
我就有个疑问,为什么在程序小的时候没出现问题,代码越长就出现这样那样的优化问题?更要命的时,在代码很长后写程序如果不正常怎么知道是自己写的程序本身有问题还是KEIL的优化干的坏事? |