困扰了我很久的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条回答
Alexkey
1楼-- · 2019-12-29 07:11
money_2011,要买个动车票给你坐坐么
money_2011
2楼-- · 2019-12-29 08:34
好啊。记得买高铁的。留个电话,下次要坐时让你代买。

说哪么多,是要批驳你散播不正确的解决问题思想。有事没事就先怀疑芯片,怀疑工具有问题。
这就是菜鸟的表现。看到不少贴子就是这样,难道新生代的工程师就这鸟水平,不是指技术,是指态度。
Alexkey
3楼-- · 2019-12-29 13:37
真是无语了,还新生代,TIM1的每个寄存器的每一位我都研究过了,要是没有相当的调试手段我根本就得不出这个结论,你以为用个jlink单步执行一下程序,看看寄存器的变化就能把所有问题都解决了?程序在全速执行的时候跟单步执行是不完全一样的,仿真工具能给调试程序带来方便,但很多时候只会把问题掩盖掉,经常发生的事情就是单步跑程序是对的,全速跑程序就不对了。
我说的这个现象,是可以完全重现的,同样的程序不同优化级别编译出来汇编代码是完全不一样的,你在这跟我扯什么寄存器,你懂不懂哦,上面已经有人提到了要查看汇编代码,我只是说现在没时间,已经知道是编译器把部分不该优化的代码给优化了,只是我还没找到是哪一部分,你在这跟我瞎扯什么呀,自己水平差还以为别人水平都差,08年STM32刚出来的时候我就开始用STM32开发项目了,STM32的参考手册我都快背下来了,自己水平菜还不谦虚。
我不自认为自己水平有多高,但至少遇到的所有问题我都通过各种手段查到了原因,并解决了问题,你在这扯来扯去的,这问题丢给你,你倒是给我解决看看,真是莫名其妙!
kevin_ares
4楼-- · 2019-12-29 17:36
我也被优化害过.....

毕竟电脑不是人,它优化是根据规则来的,所以有可能得到不想要的效果

别理那个 money_2011

明显是没做过复杂东西 ,只会夸夸其谈想当然的

不过也要检查一些变量是不是加上了volatile
hetao7241
5楼-- · 2019-12-29 19:06
 精彩回答 2  元偷偷看……
yinqiu009
6楼-- · 2019-12-29 21:32
回复【16楼】kevin_ares  
-----------------------------------------------------------------------
兄弟,你要不加"不过也要检查一些变量是不是加上了volatile  ",我就要拍你了。
你那根本不是被优化等级害了,你是被自己害的,好伐?

另外money_2011 说的很对。
从我从业至今,我没有找出过任何一个芯片的bug,也没有找出过任何一个工具的bug。很多次我都以为我成功的发现了它,但是慢慢都被时间证明是我自己的理解错了、看资料不仔细或者超常规使用造成的。
另外说句题外话,我对高度依赖仿真器持排斥态度,特别是基于多级流水线的高级cpu上,只要串口及其他输出信息端口打通,我就会停止使用仿真器调试后面程序。

一周热门 更多>