【问题标题】:How to measure elapsed time on ARM Cortex-M4 processor in C? [duplicate]如何在 C 语言中测量 ARM Cortex-M4 处理器的运行时间? [复制]
【发布时间】:2015-01-21 08:48:09
【问题描述】:

我正在使用带有 ARM Cortex-M4 处理器的 STM32F429。我假设我不知道ARM的汇编,但我需要优化代码。我阅读了

的解决方案

How to measure program execution time in ARM Cortex-A8 processor?

这是我需要的,但该解决方案适用于 Cortex-A8。一时兴起,我尝试在我的代码上实现上面的链接代码,但此时我获得了一个 SEGV:

if (enable_divider)
    value |= 8;     // enable "by 64" divider for CCNT.

  value |= 16;

  // program the performance-counter control-register:
  asm volatile ("MCR p15, 0, %0, c9, c12, 0\t\n" :: "r"(value));  /*<---Here I have SEGV error*/

  // enable all counters:  
  asm volatile ("MCR p15, 0, %0, c9, c12, 1\t\n" :: "r"(0x8000000f));  

  // clear overflows:
  asm volatile ("MCR p15, 0, %0, c9, c12, 3\t\n" :: "r"(0x8000000f));

如何调整此汇编代码以在 ARM Cortex-M4 上执行?

【问题讨论】:

  • 嗨,克里斯。我在链接上阅读了答案。在 Throwback1986 给出的另一个链接中,他建议使用 DWT_CYCCNT。好的。但是,看到解决方案,我不明白如何在我的代码上实现(使用我的问题的代码)。打扰一下,我是ARM处理器组装的新手:(
  • 大多数MCR p15 说明假定您未处于用户模式。另外,如果这适用于您的 CPU,那也没关系;大多数MCR p15 指令必须特定于您的 CPU(Cortex-M 或 Cortex-M3)。
  • SEGV(我认为这是一个硬故障)可能是由于在没有打开时钟电源的情况下访问了某些硬件。由于您是 ARM 新手,您应该知道微控制器以低功耗模式启动。这意味着您必须自己打开外围设备。如果您尝试访问外围设备而不先打开它,您会遇到异常(例如崩溃)。请参阅我在下面我的回答下的评论中提到的手册。

标签: c optimization assembly time arm


【解决方案1】:

放弃 Cortex-A8 方法。

对于大多数基于 Cortex-M 的微控制器来说,这是正确的方法(不要使用 SysTick!):

  1. 设置一个定时器,它的运行速度与 CPU 相同。
  2. 不要将中断附加到定时器。
  3. 在开始测量之前,使用单个 LDR 指令轮询计时器值。
  4. 执行NOP 指令,然后运行您要测量的代码。
  5. 执行NOP 指令,然后在结束测量时使用单个LDR 指令轮询计时器值。

NOP 说明是为了准确,以确保流水线不会干扰您的结果。 这在 Cortex-M3 上是必需的,因为一条LDR 指令需要两个时钟周期。两条连续的LDR 指令可以流水线化,因此它们总共只需要 3 个时钟周期。 有关指令集时序的更多信息,请参阅 ARM 信息中心的Cortex-M4 Technical Reference Manual

当然,您应该从内部 SRAM 运行您的代码,以确保它不会被慢速闪存拖慢。

我不能保证这在所有设备上都是 100% 周期准确的,但应该非常接近。 (见下面克里斯的评论)。您还应该知道,这是在没有中断的环境中使用的。

【讨论】:

  • 嗨吃豆人!我从理论上理解你的答案,但我是 ARM 处理器组装的新手。您可以为此目的发布示例代码吗?
  • 很遗憾,我无法发布 STM 的示例代码,因为我无法验证它。 (STM 是一个很好的产品,但我正在研究其他 Cortex-M3 MCU)。不过,我可以说,您需要在开始配置定时器之前打开定时器的时钟电源,否则您会遇到 HardFault 崩溃。您可以使用 C 函数设置计时器(那里没问题),如果您不需要周期精确的结果,您还可以使用 C 函数读取 Timer Counter 寄存器。
  • (对于那些使用STM设备的人,请随意实现上述并发布代码作为答案)
  • 如果芯片的其他部分处于活动状态并且能够触发总线仲裁器,则访问外围总线上的定时器可能没有固定成本。
  • @Chris Stratton:我相信你是对的。不幸的是,也不能保证微控制器也有定时器(但大多数 ARM 幸运的是 Cortex-M 有)。由于 STM 具有秒表功能,我需要更改我的答案。 ;)
猜你喜欢
  • 2018-12-04
  • 1970-01-01
  • 2015-07-19
  • 2020-01-10
  • 1970-01-01
  • 2019-06-27
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多