良许Linux教程网 干货合集 KEIL 下如何准确测量代码执行时间?

KEIL 下如何准确测量代码执行时间?

相信看了郭天祥老师51视频的道友应该都知道,老师曾多次在视频中介绍了KEIL的代码运行时间功能:

image-20231215193929429
image-20231215193929429

鱼鹰长久以来一直期望能够实现这项功能的使用,但遗憾的是,他注意到该功能的时间准确性并不理想。

郭老师指出,该功能中的时间单位是(sec),并且是从微控制器启动并执行第一条指令时开始计算的。然而,当鱼鹰用示波器进行验证时—由于无法确切知晓微控制器实际开始运作的具体时刻,因此只能通过观察时间间隔—他发现了时间的不一致性。

因此,鱼鹰在测量代码运行时间(例如软件延时)以获取精确结果的常规流程包含以下几个步骤:

1、携带示波器到测试现场(是的,相当沉重)

2、寻找合适的杜邦线(并且检测杜邦线是否良好)

3、在代码测量的起始和结束部分加入端口电平切换的指令(这样可以通过示波器监测电平变化)

4、有时候需要多次运行代码,这要求修改代码以实现循环执行,或者依靠示波器的单次触发功能。

在完成上述准备工作后,才能正式开始测试。

想想看,大家,这整个准备流程得花多长时间呢?

大概十分钟到半个小时不等,如果工具什么的不容易找到的话,甚至需要更长时间。

难道就没有一种更加便捷、简便的测试办法吗?为何那些只涉及软件的测试能迅速完成,而我们的硬件测试却这么困难呢?

这个问题鱼鹰一直放在心上,期盼能找到一个更方便快捷的测量手段。

直到某天,鱼鹰在完成 uCOS II 操作系统的内核诊断功能后,终于找到了答案,也就是这个设备:

image-20231215193932782
image-20231215193932782

鱼鹰才重新思考 KEIL 的时间测量功能。

通过上图鱼鹰可以知道,这个时间相当准确,那么明明 KEIL 可以获得准确时间,为什么这个专门显示时间的功能反而不准了呢?

后来鱼鹰在 KEIL 窗口下(调试窗口)还意外看到了这个东西:

image-20231215193936093
image-20231215193936093

我了个去,还有一个小窗口专门显示呢,然后右击,又出现了这个:

image-20231215193938865
image-20231215193938865

当你认真观察后,发现有好几个选项,但是时间还是那么不准确(单位:秒)。

而鱼鹰在完成了内核感知器的时候,又再一次测试了这个窗口,发现真准(嗯,不能说脏话)。

于此,鱼鹰明白了,不是 KEIL 不能准确显示时间,而是没有设置准确。

那么到底怎么设置呢?鱼鹰想到了《STM32调试利器之ITM》笔记中有一个关键的操作,就是设置内核时钟频率****。

所以鱼鹰把默认的10 M改成了f103的72 M,并找来了示波器,一顿操作猛如虎,终于得出了结果。

真准!准到你怀疑人生!

image-20231215193941926
image-20231215193941926

是的,在线仿真下,你只要在常规的仿真器设置下,再加入这个设置,你就能得到你想要的时间。

软件仿真下,你只要准确设置这个外部晶****振频率,你就能很好的测量运行时间(STM32 F103,F4软件仿真效果不行)

image-20231215193945139
image-20231215193945139

那么又该如何测量时间呢?

寄存器窗口显示的时间是从单片机运行第一条代码开始的时间,这个时间是累计的,如果用这个时间进行测量的话,必须在测试代码前记下时间,然后运行代码后再记录一次时间,两次时间相减,才是代码运行时间。

这个方法不错,但是鱼鹰有更好的方法。

看到那一个个选项了吗?

image-20231215193948448
image-20231215193948448

人家可以重置(Reset)时间,比如鱼鹰现在用t1显示的时间(t0 和 寄存器窗口显示的时间一样,不信你可以看看),只要先重置一下这个t1(最上面那个),然后运行代码后暂停,t1显示的就是这段代码的运行时间了。

这样一来,你就能轻松实现代码的时间测量了。

既然得到我们想要的结果,我们就会思考以下几个问题:

1、为什么设置之后,时间就准确了呢?

2、它是怎么测量时间的?

3、它的测量精度是多少?

4、这个测量方法有什么限制没有?

其实这个几个问题都和 DWT(这个模块鱼鹰在很多笔记中写过) 这个外设模块有关。

我们知道,STM32F1 和STM32F4 系列单片机里面有一个DWT模块,这个可以简单的认为是一个定时器,而它的时基就是内核时钟!

也就是说,DWT 是由内核时钟驱动的,如果CPU内核频率是72 M,那么它就能达到 1 / 72 M 的精度,即1 / 72 微秒!

而且它是 32 位计数器,最大可测量时间 60 多秒(这个具体需要计算一下),对于单片机而言,足够了!

因为单片机的内核频率是可以设置的,而 KEIL 本身是不知道CPU在什么频率下运行,所以我们需要通过设置,告诉 KEIL CPU的运行频率,这样KIEL才能根据这个频率换算出准确的时间。

现在再说说限制问题,第一个是单片机限制。

目前已知 F1 和 F4 是有 DWT 这个外设的,所以没问题,但是 F0 应该就不行了(具体没测过)。

第二个是软件问题,首先KEIL 对于 F4 的软件仿真支持不怎么好,所以你会发现F4在软件仿真下也是无法测量的,但是不会影响在线仿真。其次就是 KEIL版本问题,5.14用的挺好,但5.20版本你会发现右下角的时间窗口没有显示时间或者时间不更新,一个简单的解决方法是,切换到寄存器窗口,这样时间窗口就能正常更新了(这可是宝贵的经验哦)。

image-20231215193951346
image-20231215193951346

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部