困扰了我很久的TIM1时钟走慢的问题终于找到原因了

2019-12-27 18:41发布

在使用STM32的过程中,经常发现TIM1定时器莫名奇妙的走慢,以前一句一句的查看代码,怕晶振没起振,拿示波器看,都没有发现问题,但TIM1就是走慢了,后来只能尽量避免使用TIM1,今天再次下定决心要找到原因,最后终于发现是MDK的优化造成的。
如果默认使用Level 2 (-O2)优化级别,勾选Optimize for Time 和One ELF Section per Function ,TIM1就会变慢很多,其他定时器都正常。
使用Level 0 (-O0)优化级别,勾选Optimize for Time 和One ELF Section per Function
或者使用Level 2 (-O2)优化级别,只勾选One ELF Section per Function ,则TIM1能正常工作,目前虽然能解决问题了,但是还没有仔细研究不同的优化之间的区别,到底编译器把哪部分代码给优化掉了,才造成TIM1定时器走慢呢,这个还有待进一步研究,现在要忙手头上的项目,暂且先放一放吧。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
59条回答
ljy99731
1楼-- · 2020-01-04 00:31
从来都是开最高优化,有几次也是发现开最高优化会导致程序不正常,开低就好,最后证明是因为优化后有些程序执行太快,而导致后面时序或配置等待时间不够,配置的信息不够时间更新进去。相信不是因为优化导致程序出错,而是某些细节没注意到,导致的优化后的程序没按自己意图一步步执行
hd12
2楼-- · 2020-01-04 02:50
从来都是O3优化的路过,有时在调试阶段O3优化会打乱程序顺序不方便调试,改成O2或者O0,调试好又改成O3的

如果用寄存器编程,一般是不太可能出现被优化掉操作的问题,因为,这些寄存器在定义时都被正确的增加volatile标志

但是用库的话就未必了,库函数内部有很多花样,未必会直接操作寄存器,如果不熟悉参考手册的话很容易就掉坑里了
myxiaonia
3楼-- · 2020-01-04 05:05
 精彩回答 2  元偷偷看……
RAMILE
4楼-- · 2020-01-04 08:26
吓死宝宝了,还好宝宝用定时器习惯性不用TIM1
beihai326
5楼-- · 2020-01-04 14:23
重来都是开最高优化的路过!!!!你要说优化可以是程序时间执行变慢或者快,还可以相信,但是Time是硬件!!!除非硬件出现问题,否则不可能变慢!!!!当然了正如58楼所说的,使用库开优化的时候,或许某些时间配置没有按照自己的意思来!!!!

一周热门 更多>