0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

KEIL的代码运行时间功能

GReq_mcu168 来源:鱼鹰谈单片机 2020-06-05 15:48 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

鱼鹰也一直很想用上这个功能,但很不幸的是,我发现这个时间根本就不准确! 郭老师说,这个时间单位是秒(sec),是从单片机运行第一条代码开始计算的,但是当你真正用示波器验证这个时间差(因为不知道单片机什么时候才开始运行,所以只能看时间差)的时候,你会发现这个时间是不准确的。 所以以前鱼鹰在测试一段代码(比如软件延时代码)运行时间的时候,为了确保准确,都会折腾以下步骤: 1、搬来示波器(嗯,挺重的) 2、找好杜邦线(最好测试一下杜邦线的好坏) 3、测试代码前后插入端口输出高低电平代码(输出高低电平让示波器显示) 4、有时代码可能只执行一次,要么修改代码让它循环运行,要么使用示波器的单次触发功能。 当你完成了以上步骤,你才能真正开始你的测试工作。 那么请问各位道友,这些步骤做下来,需要耗费多少时间? 十分钟到半小时差不多吧,如果东西难找,时间更久! 难道没有更好的方式了吗?凭什么那些纯软件的就可以很快的测试代码运行时间,我们就不行? 所以鱼鹰一直记着这个事情,一直想要找到一种方便且简单的测量方法。 直到有一天,鱼鹰完成了 uCOS II 内核感知器的功能,喏,就是这个东西:

鱼鹰才重新思考 KEIL 的时间测量功能。 通过上图鱼鹰可以知道,这个时间相当准确,那么明明 KEIL 可以获得准确时间,为什么这个专门显示时间的功能反而不准了呢? 后来鱼鹰在 KEIL 窗口下(调试窗口)还意外看到了这个东西:

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

当你认真观察后,发现有好几个选项,但是时间还是那么不准确(单位:秒)。 而鱼鹰在完成了内核感知器的时候,又再一次测试了这个窗口,发现真准(嗯,不能说脏话)。 于此,鱼鹰明白了,不是 KEIL 不能准确显示时间,而是没有设置准确。 那么到底怎么设置呢?鱼鹰想到了《STM32调试利器之ITM》笔记中有一个关键的操作,就是设置内核时钟频率。 所以鱼鹰把默认的10 M改成了f103的72 M,并找来了示波器,一顿操作猛如虎,终于得出了结果。 真准!准到你怀疑人生!

是的,在线仿真下,你只要在常规的仿真器设置下,再加入这个设置,你就能得到你想要的时间。 而软件仿真下,你只要准确设置这个外部晶振频率,你就能很好的测量运行时间(STM32 F103,F4软件仿真效果不行)

那么又该如何测量时间呢? 在寄存器窗口显示的时间是从单片机运行第一条代码开始的时间,这个时间是累计的,如果用这个时间进行测量的话,必须在测试代码前记下时间,然后运行代码后再记录一次时间,两次时间相减,才是代码运行时间。 这个方法不错,但是鱼鹰有更好的方法。 看到那一个个选项了吗?

人家可以重置(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版本你会发现右下角的时间窗口没有显示时间或者时间不更新,一个简单的解决方法是,切换到寄存器窗口,这样时间窗口就能正常更新了(这可是宝贵的经验哦)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 示波器
    +关注

    关注

    113

    文章

    6967

    浏览量

    194686
  • keil
    +关注

    关注

    69

    文章

    1224

    浏览量

    171808
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73142

原文标题:KEIL 下如何准确测量代码执行时间?

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用Nuclei Studio IDE计算程序运行时间

    在使用Nuclei Studio IDE进行程序运行时,我们想知道我们编写的程序运行时间有多长怎么办呢?可以选择调用IDE里面时间记录函数_gettimeofday(),该函数用于记录程序运行
    发表于 10-28 08:25

    怎么实现一套容器运行时,并符合OCI规范?

    如题,怎么实现一套容器运行时,并符合OCI规范
    发表于 10-10 07:35

    装置日常运行时的安全防护检查有哪些注意事项?

    装置日常运行时的安全防护检查,核心原则是 “安全优先、不影响生产、快速识别风险”—— 既要避免因检查操作引发触电、停机等事故,也要高效捕捉运行中的动态隐患(如过热、防护松动)。以下是需重点关注的 8
    的头像 发表于 09-23 16:33 748次阅读

    rt-thread线程调用rt_thread_mdelay延时后再恢复运行时thread会变,导致mutex释放失败,怎么解决?

    代码片段如下: 运行结果: 可以看到,在线程延时后,再恢复运行时,用rt_thread_self函数获取到的值与没有延时时获取到的值不一样了,导致mutex无法释放,其它等待这个mutex的线程都无法
    发表于 09-09 08:06

    MTB如何在运行时介入Jlink调试器?

    目前我们的应用程序在运行时会偶发死机现象,有没有办法能够在CYW43907芯片不复位的情况下介入调试器,查看导致死机的问题
    发表于 07-08 07:46

    PLC设备运行时间数据采集到运维管理平台如何实现

    在工厂设备管理工作中,往往需要统计各个设备的运行时间,能够衡量其运行性能,主要为了方便管理人员对设备进行定期维护,以保障设备处于稳定高效的运行状态,减少故障停机导致生产停工的问题。 对此,物通博联
    的头像 发表于 06-20 16:02 574次阅读
    PLC设备<b class='flag-5'>运行时间</b>数据采集到运维管理平台如何实现

    步进电机在高速运行时反电动势波形与其动态响应变化

    步进电机高速运行时,反电动势幅值增大、频率升高,导致电流建立延迟、扭矩下降及动态响应滞后。所以在步进电机高速运行的方案中,我们需要通过优化电机选型(如低电感、适中极数)、升压驱动及BEMF反馈控制,可缓解高速性能衰减,避免PWM饱和导致的扭矩崩溃。
    的头像 发表于 06-10 16:06 1187次阅读
    步进电机在高速<b class='flag-5'>运行时</b>反电动势波形与其动态响应变化

    可以在运行时通过微控制器配置CCG2 C型板吗?

    我可以在运行时通过微控制器配置 CCG2 C 型板吗?
    发表于 05-07 07:24

    将ADAU1701超频到98MHZ,运行时出现爆音怎么解决?

    我将ADAU1701超频到98MHZ,我的设置是PLLmode0、1都为1,输入mclk49M,在192k采样率下执行512条指令,运行时出现爆音。
    发表于 04-15 07:58

    在Windows上安装OpenVINO™运行时遇到错误怎么解决?

    已在 Windows* 上安装OpenVINO™运行时。 配置环境变量。 遇到错误: Location is not available.
    发表于 03-05 09:13

    无法在ONNX运行时加载OpenVINO™中间表示 (IR),为什么?

    无法在 ONNX运行时加载OpenVINO™中间表示 (IR)
    发表于 03-05 09:07

    运行时OpenVINO™找不到模型优化器,为什么?

    运行时OpenVINO™找不到模型优化器,运行模型下载程序命令并收到错误消息: omz_downloader:找不到命令
    发表于 03-05 08:16

    无法在Raspberry Pi 4中通过PyPI OpenVINO™安装2022年运行时软件包,为什么?

    无法在 Raspberry* Pi 4 中通过 PyPI* 安装OpenVINO™ 2022 运行时软件包。
    发表于 03-05 07:31

    为了防止dlpc350在运行时中断,如何去校验是否还在和电脑进行连接?

    大家好, 我有2个问题想请教各位大佬 1:为了防止dlpc350在运行时中断,如何去校验是否还在和电脑进行连接? 我想做一个线程隔一段时间就去访问以下它的连接状态,求大佬指点 2:如果重连复选usb已被占用,该如何处理?使用什么方法可以重连(在不拔掉usb的情况下)?
    发表于 02-20 08:40

    智能电机控制装置如何最大限度地提高恢复能力和正常运行时间

    机器恢复能力和正常运行时间的智能电机控制装置。 这些应用中的电机控制装置必须能够控制并保护 75 马力 (HP) 至 700 马力的电机。为实现弹性运行,需要对机器进行全方位的保护,包括过载保护、接地故障保护和相位不平衡保护等。 同时还应包括触点磨损自诊断和线圈过
    的头像 发表于 01-25 16:40 1272次阅读
    智能电机控制装置如何最大限度地提高恢复能力和正常<b class='flag-5'>运行时间</b>