seuzb 发表于 2013-8-10 20:08:01

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

今天用富士通的单片机对DS18B20进行读写操作,发现当IAR的优化等级高时,程序正确运行,可是当把优化等级设为LOW或者NONE时,就无法对DS18B20进行操作了,很奇怪。不知道IAR优化时都做了哪些手脚?这里声明一下,我这里延时使用的是定时器进行操作的,没有用软件延时。

hhxb 发表于 2013-8-10 20:20:27

一般优化都是加快速度,所以很可能是时序的问题

seuzb 发表于 2013-8-10 20:47:49

hhxb 发表于 2013-8-10 20:20 static/image/common/back.gif
一般优化都是加快速度,所以很可能是时序的问题

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

coleyao 发表于 2013-8-21 21:12:52

关键是延时参数,18b20的延时参数应该是个窗口,太大或太小都会导致读取失败的。改成软件仿真可以看到延时函数一个周期占用几个机器周期,然后计算得到大致延时时间,与18b20延时参数比对,符合就好了!

qqqq_1111 发表于 2013-8-22 08:49:52

IAR经常会把一些有用的语句优化掉的,用汇编补回

阿弥陀佛 发表于 2013-8-22 09:00:58

seuzb 发表于 2013-8-10 20:47 static/image/common/back.gif
应该是的,在IAR优先等级设为High,我的一个记录延时时间的全局变量加上volatile标志后,不能正确运行, ...

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

seuzb 发表于 2013-8-22 18:46:39

阿弥陀佛 发表于 2013-8-22 09:00 static/image/common/back.gif
加上volatile,就是不让编译器优化变量了,这样程序就便大了,和不开优化的结果差不多,所以,问题应该是 ...

问题找到了,我是在定时器中断中对DS18B20进行操作的,在中断服务程序最后才清除中断标识,由于APB上的写操作需要由AHB2APB桥来管理,需要一定时间才能真正完成写操作(SR 才能被清零)。那么当CPU退出中断ISR,此时SR还没有真正被清零,此时对应的pending bit仍旧置位,于是又一次触发了中断,DS18B20的操作时序自然不对了。我也是看到其他网友讨论才想起来的。
页: [1]
查看完整版本: 求助:IAR优化等级高,程序运行正确,改低后却不能正确.....