使用MDK默认的优化等级(default,应该不是最低级),发现运行时有问题,但单步仿真时又正常了,后来把优化等级改成level-0,就没问题了。不知道哪里的问题使优化等级不一样会出现不同的问题。
以前发现用keil C51也是一样,默认工程是优化等级8,改成0级优化就没问题了。试着一些变量前加volatile关键字也不行,我记得坛里有的大神说他们公司的程序要求开任意优化等级都不出问题,
不知道有没有这方面的书籍? 请坛友赐教下,这段时间学习提高下。
所有共享变量和全局变量尽量都要有volatile。
MDK对应的文档是ARM Compiler User Guide(详细的看Reference Guide),前者基本够用了。
这种情况下,我觉得忘掉单步和断点调试,串口打印才是终极调试方案。
2楼的方法,也可以。
但只有中断和主程序都要操作的才需要加volatile,否则影响编译器优化。
谢谢大家的热心帮助~
我刚好找到一个变量加了volatile之后就没问题了,这是个标志变量,确实是在主程序和中断里都用到,而且都会去改写这个变量。
另外我再请教下,如果多任务的程序,不是中断里用到,是两个不同的任务都用到,应该这个变量也得加关键字吧?
是我,我也回在程序中调用串口输出变量等调试信息到PC,进行辅助review
今天我又有其他想法,那就是:直接看C 编译中间结果 ,汇编代码。
目前,volatile使用在主程序和中断程序中都使用的变量,程序中关键部位添加串口打印用于调试,没有发现楼主的情况,至于所说的编译器优化等级从最低到最高编译出来运行都不能出现瑕疵,还没有测试过。期待坛友分析这方面经验!