首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用硬件计数器测量ARM Cortex-A8上的执行时间

使用硬件计数器测量ARM Cortex-A8上的执行时间
EN

Stack Overflow用户
提问于 2012-03-21 05:18:20
回答 2查看 5.2K关注 0票数 7

我使用的是Exynos3110处理器(1个GHz单核ARM Cortex-A8,例如在Nexus中使用),并尝试测量特定功能的执行时间。我有一个在Nexus S上运行的Android 4.0.3。我尝试了下面的方法

1

我加载了内核模块以允许在用户模式下读取寄存器值。我正在使用以下程序来测试计数器:

代码语言:javascript
复制
static inline unsigned int get_cyclecount (void)
{
    unsigned int value;
    // Read CCNT Register
    asm volatile ("MRC p15, 0, %0, c9, c13, 0\t\n": "=r"(value));
    return value;
}


static inline void init_perfcounters (int do_reset, int enable_divider)
{
    // in general enable all counters (including cycle counter)
    int value = 1;

    // peform reset:  
    if (do_reset)
    {
        value |= 2;     // reset all counters to zero.
        value |= 4;     // reset cycle counter to zero.
    } 

    if (enable_divider)
        value |= 8;     // enable "by 64" divider for CCNT.

    value |= 16;

    // program the performance-counter control-register:
    asm volatile ("MCR p15, 0, %0, c9, c12, 0\t\n" :: "r"(value));  

    // enable all counters:  
    asm volatile ("MCR p15, 0, %0, c9, c12, 1\t\n" :: "r"(0x8000000f));  

    // clear overflows:
    asm volatile ("MCR p15, 0, %0, c9, c12, 3\t\n" :: "r"(0x8000000f));
}


int main(int argc, char **argv)
{
    int i = 0;
    unsigned int start = 0;
    unsigned int end = 0;

    printf("Hello Counter\n");

    init_perfcounters(1,0);

    for(i=0;i<10;i++)
    {
        start = get_cyclecount();
        sleep(1); // sleep one second
        end = get_cyclecount();

        printf("%u %u %u\n", start, end, end - start);
    }

    return 0;
}

根据1,计数器随着每个时钟周期递增。我将scaling_governor切换到用户空间,并将CPU频率设置为1 1GHz,以确保安卓系统不会更改时钟频率。

如果我运行该程序,将执行1秒的休眠,但计数器值在~200e6的范围内,而不是预期的1e9。这里有没有我遗漏的特定于处理器的东西?计数器的时钟频率是否与处理器的时钟频率不同?

EN

回答 2

Stack Overflow用户

发布于 2012-04-23 13:27:03

请查看这位教授的页面:,他有多个与time/periodic-timers/measuring-execution-time,有关的完整示例程序,它们是为基于ARM Cortex-M3的微控制器开发的。我希望这与您正在进行的工作没有太大的不同。我想你会对Performance.c感兴趣的

票数 1
EN

Stack Overflow用户

发布于 2013-12-09 15:39:34

您确定在Android中使用调控器进行性能管理的方式与在标准Linux中相同吗?您使用的是定制的Android镜像还是厂商提供的镜像?我假设在制造商提供的映像中有较低级别的策略(与睡眠或调制解调器活动等相关)。也可以是休眠代码直接缩放电压和频率。禁用整个CPUFreq可能是值得的,而不仅仅是策略(或调控器)。

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

https://stackoverflow.com/questions/9795132

复制
相关文章

相似问题

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