Profling手臂Cortex_A8(Profling on arm Cortex_A8)

2019-10-29 09:26发布

我想我在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);

Answer 1:

我只是碰到了同样的问题,在我的情况下,它的是由于NIDENm信号被拉低。

从ARM文档:

该PMU仅计算已启用非侵入性的调试时,即当两个事件DBGENmNIDENm输入有效。 周期数(PMCCNTR)寄存器总是不管非侵入性调试是否启用,除非PMCR寄存器的DP位被设置启用。

也就是说NIDENm信号是输入到ARM核心,所以它究竟如何控制将取决于处理器外部的芯的部分。 就我而言,我发现了一个寄存器控制NIDEN。 在你的情况下,它可能是一个寄存器或脚,或(可能)的信号只是拉低,你不能使用该功能。

同样来自ARM文档:

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

所以,如果你可以读取其中的一个,就可以确认该问题是NIDENm。



文章来源: Profling on arm Cortex_A8