【问题标题】:Profling on arm Cortex_A8ARM Cortex A8 上的分析
【发布时间】:2013-03-20 12:55:22
【问题描述】:

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

【问题讨论】:

  • 您正在使用androidlinux-kernel。请适当地标记您的问题。另外,提供一个版本。另见:stackoverflow.com/questions/15492120/…
  • 显然你必须在内核空间中使用asm ("MCR p15, 0, %0, C9, C14, 0\n\t" :: "r"(1)); 来启用用户模式访问。是这个问题吗?
  • 我使用的是 linux 内核 2.6.32。在用户空间启用用户模式没问题,我使用 asm volatile ("mrc p15, 0, %0, c9, c14, 0" : "=r" (价值));检查,它处于用户模式。我不需要写它。

标签: c linux arm profiler cortex-a8


【解决方案1】:

我刚刚遇到了同样的问题,就我而言,这是由于NIDENm 信号被拉低。

来自 ARM 文档:

PMU 仅在启用非侵入式调试时计数事件,即当DBGENmNIDENm 输入被断言时。循环计数 (PMCCNTR) 寄存器始终启用,无论是否启用非侵入式调试,除非设置了 PMCR 寄存器的 DP 位。

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

同样来自 ARM 文档:

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

所以,如果你能读懂其中一个,你就可以确认问题出在 NIDENm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2011-05-11
    • 2011-04-12
    • 1970-01-01
    相关资源
    最近更新 更多