求助:IAR优化等级高,程序运行正确,改低后却不能正确.....
今天用富士通的单片机对DS18B20进行读写操作,发现当IAR的优化等级高时,程序正确运行,可是当把优化等级设为LOW或者NONE时,就无法对DS18B20进行操作了,很奇怪。不知道IAR优化时都做了哪些手脚?这里声明一下,我这里延时使用的是定时器进行操作的,没有用软件延时。 一般优化都是加快速度,所以很可能是时序的问题 hhxb 发表于 2013-8-10 20:20 static/image/common/back.gif一般优化都是加快速度,所以很可能是时序的问题
应该是的,在IAR优先等级设为High,我的一个记录延时时间的全局变量加上volatile标志后,不能正确运行,去掉就可以了,但是依然很奇怪,如果情况相反倒是可以接受(加上volatile可以运行)。 关键是延时参数,18b20的延时参数应该是个窗口,太大或太小都会导致读取失败的。改成软件仿真可以看到延时函数一个周期占用几个机器周期,然后计算得到大致延时时间,与18b20延时参数比对,符合就好了! IAR经常会把一些有用的语句优化掉的,用汇编补回 seuzb 发表于 2013-8-10 20:47 static/image/common/back.gif
应该是的,在IAR优先等级设为High,我的一个记录延时时间的全局变量加上volatile标志后,不能正确运行, ...
加上volatile,就是不让编译器优化变量了,这样程序就便大了,和不开优化的结果差不多,所以,问题应该是在延时方面 阿弥陀佛 发表于 2013-8-22 09:00 static/image/common/back.gif
加上volatile,就是不让编译器优化变量了,这样程序就便大了,和不开优化的结果差不多,所以,问题应该是 ...
问题找到了,我是在定时器中断中对DS18B20进行操作的,在中断服务程序最后才清除中断标识,由于APB上的写操作需要由AHB2APB桥来管理,需要一定时间才能真正完成写操作(SR 才能被清零)。那么当CPU退出中断ISR,此时SR还没有真正被清零,此时对应的pending bit仍旧置位,于是又一次触发了中断,DS18B20的操作时序自然不对了。我也是看到其他网友讨论才想起来的。
页:
[1]