首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >arm Cortex_A8的开发

arm Cortex_A8的开发
EN

Stack Overflow用户
提问于 2013-03-20 12:55:22
回答 1查看 1.3K关注 0票数 0

我想在ARM处理器上对我的应用程序进行分析。我发现侧写文件不管用。几年前有人使用下面的代码进行测试。循环计数器工作,性能监视器计数器仍然不工作。我又测试了一遍,它是一样的。对于下面的代码,我得到循环计数: 2109,性能监视器计数: 0。我已经搜索了谷歌,到目前为止,我还没有找到解决方案。有人解决了这个问题吗?

代码语言:javascript
复制
    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);
EN

回答 1

Stack Overflow用户

发布于 2013-05-16 04:18:24

我只是遇到了同样的问题,在我的例子中,这是由于NIDENm信号被拉低。

来自ARM的文件:

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

NIDENm信号是ARM核的输入,因此它的精确控制将取决于处理器的核心外部部分。在我的案子里,我找到了一个控制尼登的登记簿。在您的情况下,它可能是一个寄存器,或一个引脚,或(可能)信号只是拉低,你不能使用该功能。

还来自ARM文件:

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

因此,如果您能够阅读其中之一,您可以确认问题是NIDENm

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15524138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档