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:
如何调整此汇编代码以在ARM Cortex-M4上执行?
(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