6654|13

732

帖子

2

TA的资源

纯净的硅(中级)

楼主
 

这是个坑--编译器优化 [复制链接]

 
最近正在弄CC2530,在IAR编译器上进行程序设计,前几天遇到一个funny的问题,软件延时无效果,嗯,好玩,写了那么多年程序了,一个软件延时都写不出来么??我开始怀疑人生,怀疑世界,1分钟后想想,算了吧,debug吧,因为之前我用的都是KEIL进行单片机程序设计的,IAR的属性不是很清楚。debug的时候问题显现了,二话不说上图:
看见了么,for循环那连断点都打不上,反汇编部分尽然是个跳转指令,返回主函数了,额好吧,被优化了。。。
原来IAR默认的优化等级这么高,KEIL貌似没那么狠啊,两种方法解决,第一个在工程的option中修改optimize等级,第二种是在函数前面加上一行话,上图:

加上之后编译器就不会再优化my_delay函数了,断点也可以打,反汇编后也正常。
其实我知道大家都知道这个毛病,呲呲
此帖出自单片机论坛

最新回复

恩,因为你是在写例子,所以必须这样写,如果你写的是i=0;i  详情 回复 发表于 2016-10-20 14:15
点赞 关注(1)
个人签名亚里士缺德
 

回复
举报

1976

帖子

1

TA的资源

五彩晶圆(初级)

沙发
 
你可以使用while
此帖出自单片机论坛
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

板凳
 
楼主在这里将断点打在for循环的目的是?其实 也有偶尔用iar,但是还真没有调到delay的for循环中去debug过,惭愧。
此帖出自单片机论坛

点评

断点检查运行啊。。。。有的时候需要延时几个微秒,就用软件延时了。  详情 回复 发表于 2016-9-23 22:39
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

4
 
huaiqiao 发表于 2016-9-23 21:54
楼主在这里将断点打在for循环的目的是?其实 也有偶尔用iar,但是还真没有调到delay的for循环中去debug过, ...

断点检查运行啊。。。。有的时候需要延时几个微秒,就用软件延时了。
此帖出自单片机论坛

点评

我知道你说的断点运行,说实话,我没跑到delay里面去过。除了32的delay,O(∩_∩)O哈哈~  详情 回复 发表于 2016-9-23 23:23
 
个人签名亚里士缺德
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

5
 
汤权 发表于 2016-9-23 22:39
断点检查运行啊。。。。有的时候需要延时几个微秒,就用软件延时了。

我知道你说的断点运行,说实话,我没跑到delay里面去过。除了32的delay,O(∩_∩)O哈哈~
此帖出自单片机论坛
 
 
 

回复

1377

帖子

2

TA的资源

五彩晶圆(初级)

6
 
什么都不做的循环,是个编译器都该给优化去掉。真要这么写,也要在循环体里面用一个nop啊。
延时的正统做法是用Timer定时+sleep指令,除非不在乎CPU功耗。例外的情况是延时很短,或需要精确的指令周期,只能写汇编了。
此帖出自单片机论坛

点评

Timer定时+sleep,说的很好,受教了。其实我现在是用硬件定时,但是没有用睡眠降低功耗。不过51单片机一般用for循环延时,之前在keil中这样是没有被优化的好像,到了IAR上就被优化了,而且51单片机资源比较少用定时器  详情 回复 发表于 2016-9-25 16:19
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

7
 
cruelfox 发表于 2016-9-25 08:48
什么都不做的循环,是个编译器都该给优化去掉。真要这么写,也要在循环体里面用一个nop啊。
延时的正统做 ...

Timer定时+sleep,说的很好,受教了。其实我现在是用硬件定时,但是没有用睡眠降低功耗。不过51单片机一般用for循环延时,之前在keil中这样是没有被优化的好像,到了IAR上就被优化了,而且51单片机资源比较少用定时器的话会比较吃紧。我这里的程序只是我临时写出来实验给大家看的,不是我用的程序。。。
此帖出自单片机论坛
 
个人签名亚里士缺德
 
 

回复

143

帖子

0

TA的资源

一粒金砂(中级)

8
 
这种指令一般要用汇编啦
此帖出自单片机论坛
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(中级)

9
 
我也遇到过类似的情况,
好像是和泰的编译器,for循环没有直接跳出来,而是把循环的累加变量直接赋值到判断的边界,比如说楼主这个i,编译器优化的结果是,把i直接赋值到100.循环结束。
解决方法是在函数前边加上   volatile  关键字。
此帖出自单片机论坛

点评

嗯嗯,可以的,方法很多,  详情 回复 发表于 2016-9-26 16:42
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

10
 
堕落小生 发表于 2016-9-26 16:38
我也遇到过类似的情况,
好像是和泰的编译器,for循环没有直接跳出来,而是把循环的累加变量直接赋值到判 ...

嗯嗯,可以的,方法很多,
此帖出自单片机论坛
 
个人签名亚里士缺德
 
 

回复

6040

帖子

196

TA的资源

版主

11
 
看到楼主的代码也是醉了。。。。太容易误导人了,你的my_delay函数参数,明显没用到,哪天你写了个my_delay(1000)延时,发现跟100一样,你会不会很诧异。。。
此帖出自单片机论坛

点评

这只是我为了展示我之前遇到的问题临时编写的一个例子代码而已,的确这个参数a好像是没用上,疏忽了。不过我不会傻到还用my_delay这种教科书上的命名方式来写程序的吧。。。。现在都是用操作系统  详情 回复 发表于 2016-10-20 13:28
这只是我为了展示我之前遇到的问题临时编写的一个例子代码而已,我不会傻到还用my_delay这种教科书上的命名方式来写程序的吧。。。。现在都是用操作系统延时或者裸奔时用硬件定时器做精确延时的啊  详情 回复 发表于 2016-10-20 13:27
 
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

12
 
lcofjp 发表于 2016-10-20 13:01
看到楼主的代码也是醉了。。。。太容易误导人了,你的my_delay函数参数,明显没用到,哪天你写了个my_delay ...

这只是我为了展示我之前遇到的问题临时编写的一个例子代码而已,我不会傻到还用my_delay这种教科书上的命名方式来写程序的吧。。。。现在都是用操作系统延时或者裸奔时用硬件定时器做精确延时的啊。
此帖出自单片机论坛
 
个人签名亚里士缺德
 
 

回复

732

帖子

2

TA的资源

纯净的硅(中级)

13
 
本帖最后由 汤权 于 2016-10-20 13:29 编辑
lcofjp 发表于 2016-10-20 13:01
看到楼主的代码也是醉了。。。。太容易误导人了,你的my_delay函数参数,明显没用到,哪天你写了个my_delay ...

这只是我为了还原我之前遇到的问题临时编写的一个例子代码而已,的确这个参数a好像是没用上,疏忽了。不过我不会傻到还用my_delay这种教科书上的命名方式来写程序的吧。。。。现在都是用操作系统延时或者裸奔时用硬件定时器做精确延时的啊。
此帖出自单片机论坛

点评

恩,因为你是在写例子,所以必须这样写,如果你写的是i=0;i  详情 回复 发表于 2016-10-20 14:15
 
个人签名亚里士缺德
 
 

回复

6040

帖子

196

TA的资源

版主

14
 
汤权 发表于 2016-10-20 13:28
这只是我为了还原我之前遇到的问题临时编写的一个例子代码而已,的确这个参数a好像是 ...

恩,因为你是在写例子,所以必须这样写,如果你写的是i=0;i
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表