困扰了我很久的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条回答
wxx116zh
1楼-- · 2020-01-01 09:09
 精彩回答 2  元偷偷看……
cbeeee
2楼-- · 2020-01-01 09:20
如果是对比汇编代码能够分析出不同来那就是优化的问题了。
这问题该赖谁呢?要么赖你没有按严格的标准写代码,要么赖编译器的优化功能。
一般人都喜欢赖后者,当然其实其中大多数其实是因为前者造成的。

另:先于errata发现哪个芯片的bug的事情我还真没碰到过
visharn
3楼-- · 2020-01-01 12:37
我觉得优化不会导致你所说的问题,  你先自己检查一下把。
visharn
4楼-- · 2020-01-01 17:44
优化可能会让编译器不给局部变量分配空间,直接分配寄存器,所以你看到的值都是不准确的,但是运行结果正确。

优化可能会让程序执行时间变短,导致一些硬件时序被破坏。

优化可能导致全局变量在外部被更改后,不能被函数发现。

优化可能使一条语句直接被优化没了。

解决优化后变量问题的一个解决方法是   在变量声明前面假如 volatile关键字,指明该变量不优化。

关键是 自己的代码一定要够强壮
xingliu
5楼-- · 2020-01-01 21:42
我觉得这个优化随着CPU越来越快,渐渐的会不需要优化。
所以我一般都不选择优化,优化后麻烦很多。花些时间去找这个错误很累。
宁愿多花点钱,用好一点的CPU。
qwerttt
6楼-- · 2020-01-02 02:12
 精彩回答 2  元偷偷看……

一周热门 更多>