我想在ARM处理器上对我的应用程序进行分析。我发现侧写文件不管用。几年前有人使用下面的代码进行测试。循环计数器工作,性能监视器计数器仍然不工作。我又测试了一遍,它是一样的。对于下面的代码,我得到循环计数: 2109,性能监视器计数: 0。我已经搜索了谷歌,到目前为止,我还没有找到解决方案。有人解决了这个问题吗?
uint32_t value = 0
uint32_t count = 0;
struct timeval tv;
struct timezone tz;
// enable all counters
__asm__ __volatile__ ("mcr p15, 0, %0, c9, c12, 1" ::"r" (0x8000000f));
// select counter 0,
__asm__ __volatile__("mcr p15, 0, %0, c9, c12, 5" ::"r" (0x0));
// select event
__asm__ __volatile__ ("mcr p15, 0, %0, c9, c13, 1" ::"r"(0x57));
// reset all counters to ero and enable all counters
__asm__ __volatile__ ("mrc p15, 0, %0, c9, c12, 0" : "=r" (value));
value |= 0xF;
__asm__ __volatile__ ("mcr p15, 0, %0, c9, c12, 0" :: "r" (value));
gettimeofday(&tv, &tz);
__asm__ __volatile__("mrc p15, 0, %0, c9, c13, 0" : "=r" (count));
printf("cycle count: %d", count);
__asm__ __volatile__ ("mrc P15, 0, %0, c9, c13, 2": "=r" (count));
printf("performance monitor count: %d", count);发布于 2013-05-16 04:18:24
我只是遇到了同样的问题,在我的例子中,这是由于NIDENm信号被拉低。
来自ARM的文件:
PMU只在启用非侵入性调试时(即当断言
DBGENm或NIDENm输入时)计数事件。除非设置了PMCR寄存器的DP位,否则无论是否启用非侵入式调试,始终启用循环计数(PMCCNTR)寄存器。
NIDENm信号是ARM核的输入,因此它的精确控制将取决于处理器的核心外部部分。在我的案子里,我找到了一个控制尼登的登记簿。在您的情况下,它可能是一个寄存器,或一个引脚,或(可能)信号只是拉低,你不能使用该功能。
还来自ARM文件:
DBGENm和NIDENm信号的值可以通过轮询DBGDSCR[17:16]、DBGDSCR[15:14]或DBGAUTHSTATUS来确定。
因此,如果您能够阅读其中之一,您可以确认问题是NIDENm。
https://stackoverflow.com/questions/15524138
复制相似问题