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

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

3天内不再提示

如何测量ARM Cortex-M MCU代码的执行时间

奈因PCB电路板设计 来源:麦克泰技术 作者:麦克泰 2021-08-26 09:20 次阅读

在许多实时应用中,如电机控制、发动机控制、无线通信等时间敏感的应用,CPU可能花费不到5%的时间执行代码。这些嵌入式系统通常用C语言编写,开发人员可能会使用到汇编语言优化代码,以满足时间期限(deadline)要求。测量部分代码的实际执行时间可以帮助我们找到代码中的时间关键点。

本文将展示如何轻松测量和显示基于Cortex-M MCU的代码片段的执行时间。

测量执行时间的方法

有很多方法可以测量代码执行时间。嵌入式工程师经常使用数字输出和示波器。我们可以在监视的代码执行之前,设置输出为高电平,代码执行后将输出设置为低电平。当然,在执行此操作之前需要进行大量设置工作:找到易于探测的输出引脚,将端口配置为输出,编写代码,编译等等。获得信号后,你可能需要对其进行一段时间的监测以查看其运行时间的最小值和最大值。

测量执行时间的另一种方法是使用具有跟踪功能的调试工具。你只需运行代码、查看跟踪、手动计算增量时间并将CPU周期转换为微秒。不幸的是,跟踪仅提供一次执行实例,你可能需要进一步查看跟踪捕获以找到最坏情况的执行时间,这可能是一个乏味的过程。

Cortex-M周期计数器

Cortex-M的处理器上的 CoreSight调试端口包含一个32位自由运行计数器,用于CPU时钟周期计数。计数器是调试监视和跟踪 (DWT) 模块的一部分,可轻松用于测量代码的执行时间。启用和初始化该功能所需的代码如下:

e2b842d0-e411-11eb-a97a-12bb97331649.png

使用DWT周期计数器测量代码执行时间

我们可以通过读取代码段前后的循环计数器的值来测量并计算代码片段的执行时间,如下所示。

e2c254fa-e411-11eb-a97a-12bb97331649.png

无符号数delta表示被测代码的实际执行时间(以CPU时钟周期为单位)。

在代码执行期间可能会发生中断,因此每次执行此序列获得时间值可能并不相同,我们也可以在测量期间禁用中断以移除中断的影响。但建议在测量中允许中断,因为它们会影响代码的时间期限。

e2ca3cd8-e411-11eb-a97a-12bb97331649.png

如果被测量的代码包含条件语句、循环或任何可能导致变化的东西,那么获得的值可能不代表最坏情况下的执行时间。要解决此问题,可以简单地添加一个峰值检测,如下所示。在进行任何测量之前,需要声明 max 并将其初始化为最小值(即 0)。

e2d42626-e411-11eb-a97a-12bb97331649.png

同样,如果需要了解最短执行时间,min只需在测量之前声明并初始化为最大计数值(即 0xFFFFFFFF)。代码如下:

e2dc8636-e411-11eb-a97a-12bb97331649.png

执行时间还取决于 CPU是否配备cache,某些Cortex-M4和Cortex-M7处理器集成了Cache。如果 系统使用了指令或数据cache,则同一代码段的多次测量结果可能会不一致。你可以考虑禁用cache来衡量最坏的情况。

大多数调试器能够实时显示这些变量值。我们可以使用Global声明显示的变量以保留其值并允许实时监控。这些值代表CPU时钟周期,但大多数调试器无法为显示目的缩放变量。假设CPU时钟速度为16 MHz,显示70.19微秒比显示1123个周期要方便得多。实际上有一种更好的方式来显示实时变量,使用μC/Probe实时监控工具,它还提供了缩放能力,以易读的形式查看变量值。

使用μC/Probe显示测量值

在应用中添加测量,监控四个代码片段的执行时间,并通过μC/Probe显示测量结果。

下图显示了使用 IAR的LiveWatch(左)和 μC/Probe 的Tree View控件(右)的原始测量值。elapsed_time_tbl[] 是一个数组,用于存储不同代码片段的测量值。

你还可以将min/max/current值分配给gauge和numeric indicator控件,如下图所示。这里的值以微秒为单位显示,示例中CPU以80 MHz 运行,使用了0.0125的缩放因子。仅显示最长执行时间。

uC/Probe还可以与Microsoft的Excel连接,从而在电子表格中显示实时值,如下图所示。

e31cca0c-e411-11eb-a97a-12bb97331649.png

总结

作为嵌入式开发人员,我们有许多工具可以用来测试和验证我们的设计。μC/Probe提供了许多功能,允许用户使用gauge、meter、numeric indictor、Excel或graph/plots来监控应用程序中的变量。基于Cortex-M处理器的DWT 周期计数器功能和μC/Probe,我们可以轻松实现Cortex-M MCU应用的设计验证工作。

责任编辑:haq

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

    关注

    145

    文章

    15992

    浏览量

    343357
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8644

    浏览量

    361663
  • 代码
    +关注

    关注

    30

    文章

    4553

    浏览量

    66667

原文标题:教你一招:在ARM Cortex-M MCU上测量代码执行时间

文章出处:【微信号:pcbgood,微信公众号:奈因PCB电路板设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问stm32cubeIDE仿真怎么看程序执行时间

    就想keil仿真那样,可以时刻监视程序执行时间,cubeide怎么在仿真debug时,监视程序时间呢?
    发表于 04-02 07:47

    如何计算AURIX微控制器指令执行时间

    对于 AURIX TC38x,在数据表中,最大 CPU 频率为 300MHz,如下所示- 因此,在此频率下,每条指令的执行时间将为:1/300 MHz = 3.33 ns。 这种理解正确吗? 否则,如何计算每条指令的执行时间或 MIPS。 这里的动机是计算特定应用的
    发表于 01-23 08:08

    如何使用STM模块测量函数的执行时间

    我想问你如何使用 STM 模块测量函数的执行时间。 是否有可能通过BSP.H库的now () 函数为两个类型为ifx_tickTimer的变量(分别为起始变量和停止变量分配分笔数)来通过BSP默认
    发表于 01-22 06:38

    基于KEIL软件的C语言编程,如何计算一段程序的执行时间呢?

    如题,一段程序执行时间怎样确定,假如是把每条语句的执行时间累加,那么每条语句的时间如何确定???有别的方法可以确定执行时间
    发表于 01-18 06:10

    Python 优化—算出每条语句执行时间

    有很多原因,并不能全把锅甩到Python身上,我们应该首先从自己的代码上找原因,找原因最快的方法就是算出自己写的语句或函数的 执行时间 。这时候,很多人都会选择用以下的形式打印出语句的执行时间: 这是一种比较低效的做法,如果你有
    的头像 发表于 11-03 11:01 234次阅读
    Python 优化—算出每条语句<b class='flag-5'>执行时间</b>

    瑞萨RX130在时钟频率32MHz时,指令最短执行时间是多少?

    瑞萨RX130在时钟频率32MHz时,指令最短执行时间是多少?
    发表于 10-28 07:01

    如何在Keil中观察程序的执行时间

    如何在Keil中观察程序的执行时间
    发表于 10-15 12:56

    请问如何确定单片机中断函数的执行时间?

    如何确定单片机中断函数的执行时间?
    发表于 10-07 08:55

    ARM Cortex-M处理器对比表

    延迟和高确定性操作。 ARM Cortex-M处理器对比表1功能Cortex-M0 Cortex-M0+Cortex-M1 Cortex-M
    发表于 08-29 07:00

    请问一条指令的执行时间是1/主频吗?

    一条指令的执行时间是1/主频吗?
    发表于 08-23 08:03

    MPC5744p如何优化程序执行时间?

    作为 MPC5744p 的新手,我遇到了一个关于如何优化程序执行时间的问题。 这是我的中断服务例程中代码行的图片。 ↓这张图片显示了执行我测试过的代码行之前的定时器值 ↓这张图片显示
    发表于 06-05 12:50

    ARM Cortex-M学习笔记:初识Systick定时器

    Cortex-M的内核中包含Systick定时器了,只要是Cortex-M系列的MCU就会有Systick,因此这是通用的,下面详细分析。
    的头像 发表于 05-15 15:01 1948次阅读
    <b class='flag-5'>ARM</b> <b class='flag-5'>Cortex-M</b>学习笔记:初识Systick定时器

    STCU在线BIST总执行时间是多少?

    我有 MPC5777C 3N45H mcu,我已经对在线 STCU 单元进行了编程。 我查看了数据表和参考手册,但找不到有关该单元总执行时间的信息。我正在做所有的 MBIST 和 LBIST。完成所有测试所需的最长时间是多少?
    发表于 05-10 09:13

    TPT19新特性之最坏情况执行时间的指示

    主机上的执行时间。 指示器显示了哪些测试和哪些测试刺激延长了执行时间。因此,您可以使用指示器作为代码变更的早期预警系统推导出测量目标板上真实WCET的相关测试。
    的头像 发表于 04-27 10:08 277次阅读
    TPT19新特性之最坏情况<b class='flag-5'>执行时间</b>的指示

    脚本执行时间过长时,lua固件重启节点,这个时间是多少?

    您好, 当脚本执行时间过长时,lua固件重启节点,这个时间是多少,我该如何更改?
    发表于 04-26 06:45