c - 如何测量 C 中 ARM Cortex-M4 处理器的运行时间?

标签 c optimization assembly time arm

<分区>

我使用的是带有 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 上执行?

最佳答案

放弃 Cortex-A8 方法。

这是大多数基于 Cortex-M 的微 Controller 的正确方法(不要使用 SysTick!):

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

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

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

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

关于c - 如何测量 C 中 ARM Cortex-M4 处理器的运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27091310/

相关文章:

关于虚拟地址空间和位置无关代码(PIC)的混淆

c++ - 如何使用 SSE 优化矩阵 3 乘 3 的点?

c - ARM 汇编中的递归打印 100

java - 为什么这种并行矩阵加法效率如此低下?

optimization - Lua挑战: Can you improve the fannkuch implementation's performance?

assembly - 为什么 x86-64 GCC 函数序言分配的堆栈比局部变量少?

c - 在 Assembly x86 中获取三个数字的最大值时出现段错误

c - 带有 LibOpenCM3 的 STM32 FreeRTOS

c - 浮点精度 C - 将参数传递给 Xively

C编程: Forward variable argument list