【发布时间】: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