This question already has answers here:
Closed 4 years ago.
Cycle counter on ARM Cortex M4 (or M3)?
(5个答案)
我用的是带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上执行?

最佳答案

去掉皮质-A8法。
对于大多数基于Cortex-M的微控制器来说,这是正确的方法(不要使用SysTick!):
设置一个定时器,其运行速度与CPU相同。
不要在计时器上附加中断。
在开始测量之前,使用一条LDR指令轮询计时器值。
执行NOP指令,然后运行要测量的代码。
执行NOP指令,然后在结束测量时使用单个LDR指令轮询计时器值。
NOP说明是为了确保准确性,以确保流水线不会干扰您的结果。
这在Cortex-M3上是必要的,因为一个LDR指令需要两个时钟周期两个连续的LDR指令可以流水线,因此它们总共只需要3个时钟周期。
有关指令集计时的更多信息,请参阅ARM信息中心的Cortex-M4 Technical Reference Manual
当然,您应该从内部SRAM运行您的代码,以确保它不会被慢速闪存减慢速度。
我不能保证这将是100%周期准确的所有设备,但它应该得到非常接近(见下面克里斯的评论)您还应该知道,这是为了在没有中断的环境中使用。

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

10-11 22:32