ARM Cortex-A8处理器中的程序执行时间

ARM Cortex-A8处理器中的程序执行时间,arm,cortex-a8,time-measurement,performancecounter,Arm,Cortex A8,Time Measurement,Performancecounter,我正在使用ARM Cortex-A8并试图通过汇编代码读取CCNT时间计数器的值。我正在关注这个帖子。根据它,在我可以从定时器读取值之前,我必须启用计数器,启用64位除法器并清除溢出。这些操作通过写入适当的寄存器(例如,PMCR(性能监视器控制寄存器))来执行。因此,我在循环中打印计数器值以跟踪溢出是如何发生的,我有以下行为: 1           (starts to incrementing after it was reset to zero) 4650 4858 4943 5023 .

我正在使用ARM Cortex-A8并试图通过汇编代码读取CCNT时间计数器的值。我正在关注这个帖子。根据它,在我可以从定时器读取值之前,我必须启用计数器,启用64位除法器并清除溢出。这些操作通过写入适当的寄存器(例如,PMCR(性能监视器控制寄存器))来执行。因此,我在循环中打印计数器值以跟踪溢出是如何发生的,我有以下行为:

1           (starts to incrementing after it was reset to zero)
4650
4858
4943
5023
...
...        (incrementing...)
...
4293939054
4293939128       (overflow happens)
1602570          
1602703
1602788
...
...
4293522911
4293522987
4293523062
4293523137
1186243
1186367
1186453
1186536
1186612
1186686
...
4293536300
4293536377
4293536456
4293536533
4293536612
1199090
1199209
1199295
1199373
1199453
1199530
….
and so forth.
因此,我有一系列问题:

a) Linux内核使用哪一个或上述寄存器?(进一步内核版本的信息有多可靠)。他们的价值观变化有多安全

b) CCNT频率的准确值是多少?如何获得?不幸的是,我在处理器规范中找不到这个值

[ 0.000000] OMAP clocksource: GPTIMER2 at 24000000 Hz
[ 0.000000] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956ms
[ 0.132855] Switching to clocksource gp timer
但是根据时钟时间手动识别它,给了我7兆赫的频率。那么,为什么它不像预期的那样是24兆赫呢

c) 根据我的第一个输出,为什么溢出后不是从零开始,而是从大约1 mil开始

d) 为什么没有64除法器我会得到错误的结果?该值开始以这种方式跳转:

...
134110099
134114934
134119656
302352300
302361825
302367135
…
2885588930
2885593776
2885598630
3053958670
3053966752
3053972232
…
261130096
261134909
429343853
429351487
429356735
我非常感谢你的帮助。谢谢

a)Linux内核的perf子系统可以使用PMU regs(通过perf userspace工具访问)

b) CCNT频率是Cortex-A9 CPU周期计数器,如果启用除法器,则为周期/64。因此,7MHz的分频器将是一个平均CPU时钟约450兆赫。这与24 MHz系统时钟是分开的

c) 也许你的过程已经安排好了。这是一个低级别的周期计数器,用于整个CPU,而不仅仅是进程。它将在内核或其他进程中继续运行。另一方面,如果您的进程迁移到另一个CPU,那么您将访问该CPU的周期计数器(它甚至可能没有相同的除法器设置)。如果您想要一致的计数,您应该将进程固定到一个CPU上


d) 与(c)的答案类似,您可能看到了进程调度和迁移的效果。

感谢您的快速响应。关于b)-我的问题是为什么我得到7兆赫(450兆赫)?我以为CCNT就是那个系统时钟,我得到了它的24MHz频率值?我的目标是避免系统调用并访问内核的优先时钟,我认为这就是CCNT。如果没有,如何访问系统时钟?否,CCNT由CPU周期驱动(可能除以64)。CPU时钟频率可能随DVFS(动态电压/频率缩放)而变化。如果要读取以恒定频率运行的计时器,则需要访问全局计时器,而不是CCNT。