搜索
bottom↓
回复: 6

求助:IAR优化等级高,程序运行正确,改低后却不能正确.....

[复制链接]

出0入0汤圆

发表于 2013-8-10 20:08:01 | 显示全部楼层 |阅读模式
今天用富士通的单片机对DS18B20进行读写操作,发现当IAR的优化等级高时,程序正确运行,可是当把优化等级设为LOW或者NONE时,就无法对DS18B20进行操作了,很奇怪。不知道IAR优化时都做了哪些手脚?这里声明一下,我这里延时使用的是定时器进行操作的,没有用软件延时。

出0入17汤圆

发表于 2013-8-10 20:20:27 | 显示全部楼层
一般优化都是加快速度,所以很可能是时序的问题

出0入0汤圆

 楼主| 发表于 2013-8-10 20:47:49 | 显示全部楼层
hhxb 发表于 2013-8-10 20:20
一般优化都是加快速度,所以很可能是时序的问题

应该是的,在IAR优先等级设为High,我的一个记录延时时间的全局变量加上volatile标志后,不能正确运行,去掉就可以了,但是依然很奇怪,如果情况相反倒是可以接受(加上volatile可以运行)。

出0入0汤圆

发表于 2013-8-21 21:12:52 来自手机 | 显示全部楼层
关键是延时参数,18b20的延时参数应该是个窗口,太大或太小都会导致读取失败的。改成软件仿真可以看到延时函数一个周期占用几个机器周期,然后计算得到大致延时时间,与18b20延时参数比对,符合就好了!

出0入0汤圆

发表于 2013-8-22 08:49:52 | 显示全部楼层
IAR经常会把一些有用的语句优化掉的,用汇编补回

出0入0汤圆

发表于 2013-8-22 09:00:58 | 显示全部楼层
seuzb 发表于 2013-8-10 20:47
应该是的,在IAR优先等级设为High,我的一个记录延时时间的全局变量加上volatile标志后,不能正确运行, ...

加上volatile,就是不让编译器优化变量了,这样程序就便大了,和不开优化的结果差不多,所以,问题应该是在延时方面

出0入0汤圆

 楼主| 发表于 2013-8-22 18:46:39 | 显示全部楼层
阿弥陀佛 发表于 2013-8-22 09:00
加上volatile,就是不让编译器优化变量了,这样程序就便大了,和不开优化的结果差不多,所以,问题应该是 ...

问题找到了,我是在定时器中断中对DS18B20进行操作的,在中断服务程序最后才清除中断标识,由于APB上的写操作需要由AHB2APB桥来管理,需要一定时间才能真正完成写操作(SR 才能被清零)。那么当CPU退出中断ISR,此时SR还没有真正被清零,此时对应的pending bit仍旧置位,于是又一次触发了中断,DS18B20的操作时序自然不对了。我也是看到其他网友讨论才想起来的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 05:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表