11064|6

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Keil C uV3编译器优化有问题 [复制链接]

最近调试了一段程序,原来编译后代码也就2K多一点,没加一段代码,我都是非常小心谨慎,都是在确保非调试部分正确无误的情况下插入新的调试码的,而且明确知道新的代码将会对其他代码所造成的影响。可忽然就出了怪事,有一天下班的时候我编写了几个读取硬件设置的函数,因为下了班,所以就没调,回去了。第二天一调,竟然乱到无法判断故障的原因,于是我就把新加的删除掉,结果还是乱,真是郁闷了,还不能还原了,设置也没做改动,后来排除了芯片问题、电路问题,最后又排除了病毒的问题,甚至对警告性问题也做了分析,竟然出现了连接系统库问题的警告。 这让我想到了以前调试的时候的一个现象。我曾经写了类似下面的一段代码: if(a) { x = y + z; } else { if(b) { x = y + z; } else { } } 结果在调试的时候,老找不到第一个x=y+z语句应该的位置,而是被优化到第二条语句里去了。一开始我非常郁闷,但是后来一看,原来是在这样没写完的语句里这样优化,尽管不合理,但是逻辑上是对的。这让我就产生了疑惑:连这样的优化都做,这Keil C是不是也太妄自尊大了?这完全破坏了我们编程序的逻辑结构嘛,甚至根本就是悖理。 所以我就怀疑我这次的问题和优化有关。于是我就做了多次尝试,最后优化级别放到1,都没有让我得到成功的喜悦。我都有些丧气了,明明前一天好好的,怎么今天就这么背呢?要是能找到错的原因还好,哪怕是致命的错误。可是现在是一头雾水呀!没办法,我都后悔用C了,除了考虑原来单片机的问题,还要不断的克服C向C51移植所带来的新障碍。 在毫无道理的情况下,我忽然决定不优化,看看结果,想来如果这样都错了,那就真是没天理了。于是我这样做了,结果让我非常地兴奋:程序非常的正常! HEX文件大了1K多了,我却并不感到难过,相反,我心里有了底,我准备在自己的下一个PROJECT里,不再使用这Keil C了,但也并不表示完全放弃,而是通过它来生成一些比较罗嗦的运算和判断的汇编代码,来提高汇编编写程序的效率。 本帖非常欢迎大家讨论和指正!谢谢!
此帖出自单片机论坛

最新回复

楼上说的有理  详情 回复 发表于 2008-1-9 20:57
点赞 关注
 

回复
举报

61

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

回复: Keil C uV3编译器优化有问题

UV3只是改了IDE的界面布而已。。。
此帖出自单片机论坛
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

回复:Keil C uV3编译器优化有问题

你可以这么试试看,在定义x变量的时候,声明它为volatile. 因为优化的时候,它认为前后两个计算产生的结果是一直的,所以给优化了。 那么你将它声明为volatile,就是告诉编译器,它是一个易变的变量。这时编译器在编译它的时候,就会对和它相关的每一个计算步骤,不做优化。 你这么试试看,看看是不是它有了正确的结果了。
此帖出自单片机论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 

回复: Keil C uV3编译器优化有问题

这个优化我测试过了,如果我在第二个x=y+z前面加任何一条语句,那么编译后的结果就是我们想要的。所以它这里的优化只管运行结果,而没有管程序条理,这样就会让人担心:是个什么算法能进行这些逻辑判断,然后把它优化了呢? 而我出错的那个程序,因为比较长,所以我没列出,也没有去仔细分析它到底错在哪里,因为最近时间太紧。但是可以肯定的是:优化级别为0时,程序非常正常,而从1到9都不正常,运行结果比较诡异。 所以我可以肯定的是:优化肯定有问题,我觉得有问题的可能性是:优化算法比较奇特,也许是一个需要验证的优化理论……
此帖出自单片机论坛
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(初级)

5
 

回复:Keil C uV3编译器优化有问题

只能说自己还不太明白C,而不能说C不好。
此帖出自单片机论坛
 
 
 

回复

43

帖子

0

TA的资源

一粒金砂(初级)

6
 

回复: Keil C uV3编译器优化有问题

逻辑是可以相互转化的,就算你自己用汇编写也会一样 比如你写的: if(a) { x = y + z; } else { if(b) { x = y + z; } else { } } 完全可以写成 if(a||b) { x = y + z; } else { } 如果用汇编的指令限制,更可能成为 JB a,DO_XYZ JB b,DO_XYZ JMP NOTHING DO_XYZ: { x = y + z; } NOTHING: else { } 碰到比较指令,又是还得转成反的逻辑,变成这样 CJNE a,#xxH,CHK_NEXT JMP DO_XYZ CHK_NEXT: CJNE b,#xxH,NOTHING DO_XYZ: { x = y + z; } NOTHING: else { } 你自己说,是不是该这样呢??? 那么,你非要写一大堆完全没必要的重复语句,然后又让Keil优化,Keil帮你优化掉了难道是Keil的错吗??? 不要随便去抱怨工具,那么多人都用的好好东西,用不好只可能是你自己不会用哦
此帖出自单片机论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复: Keil C uV3编译器优化有问题

楼上说的有理
此帖出自单片机论坛
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表