这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» 单片机的编译器软件优化等级后,出现异常如何debug呢?

共9条 1/1 1 跳转至

单片机的编译器软件优化等级后,出现异常如何debug呢?

工程师
2020-02-09 20:16:26 打赏

使用MDK默认的优化等级(default,应该不是最低级),发现运行时有问题,但单步仿真时又正常了,后来把优化等级改成level-0,就没问题了。不知道哪里的问题使优化等级不一样会出现不同的问题。


以前发现用keil C51也是一样,默认工程是优化等级8,改成0级优化就没问题了。试着一些变量前加volatile关键字也不行,我记得坛里有的大神说他们公司的程序要求开任意优化等级都不出问题,


不知道有没有这方面的书籍? 请坛友赐教下,这段时间学习提高下。




关键词: 单片机 编译器 debug 优化等级 调试 查错

工程师
2020-02-09 20:31:58 打赏
2楼

所有共享变量和全局变量尽量都要有volatile。


工程师
2020-02-09 20:35:36 打赏
3楼

MDK对应的文档是ARM Compiler User Guide(详细的看Reference Guide),前者基本够用了。


工程师
2020-02-09 20:40:14 打赏
4楼

这种情况下,我觉得忘掉单步和断点调试,串口打印才是终极调试方案。


工程师
2020-02-09 20:46:18 打赏
5楼

2楼的方法,也可以。

但只有中断和主程序都要操作的才需要加volatile,否则影响编译器优化。


工程师
2020-02-09 20:49:35 打赏
6楼

谢谢大家的热心帮助~


我刚好找到一个变量加了volatile之后就没问题了,这是个标志变量,确实是在主程序和中断里都用到,而且都会去改写这个变量。


另外我再请教下,如果多任务的程序,不是中断里用到,是两个不同的任务都用到,应该这个变量也得加关键字吧?



工程师
2020-02-11 20:52:00 打赏
7楼

是我,我也回在程序中调用串口输出变量等调试信息到PC,进行辅助review


工程师
2020-02-11 21:09:36 打赏
8楼

今天我又有其他想法,那就是:直接看C 编译中间结果 ,汇编代码。


工程师
2020-02-11 21:18:39 打赏
9楼

目前,volatile使用在主程序和中断程序中都使用的变量,程序中关键部位添加串口打印用于调试,没有发现楼主的情况,至于所说的编译器优化等级从最低到最高编译出来运行都不能出现瑕疵,还没有测试过。期待坛友分析这方面经验!


共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]