手臂皮质A8上的分析

时间:2013-03-20 12:55:22

标签: c linux arm profiler cortex-a8

我想对ARM处理器上的应用程序进行性能分析。我发现oprofile不起作用。几年前有人使用以下代码进行测试。循环计数器 确实有效,性能监视器计数器仍然无法正常工作。我再次测试它,它是一样的。对于以下代码,我得到循环计数: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);

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,在我的情况下,这是由于NIDENm信号拉低了。

来自ARM文档:

  

PMU仅在启用非侵入式调试时计算事件,即,在声明DBGENmNIDENm输入时。除非PMCR寄存器的DP位置1,否则无论是否启用非侵入式调试,循环计数(PMCCNTR)寄存器始终处于使能状态。

NIDENm 信号是ARM内核的输入,因此它的确切控制方式取决于内核外部处理器的各个部分。就我而言,我找到了一个控制NIDEN的寄存器。在您的情况下,它可能是寄存器或引脚,或者(可能)信号被拉低,您无法使用该功能。

同样来自ARM文档:

  

可以通过轮询DBGENmNIDENmDBGDSCR[17:16]来确定DBGDSCR[15:14]DBGAUTHSTATUS信号的值。

因此,如果您可以阅读其中一个,则可以确认问题是 NIDENm