我为PMCCNTR
正确配置了PMU,以便在运行FreeRTOS的Cortex-R5上打勾。我将省略配置代码,因为在许多其他StackOverflow问题上已经重复了该配置代码。我认为配置正确,因为我尝试运行
__asm__ volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr))
周期性地,我能够看到pmccntr
变量单调增加并在(2 ^ 32-1)之后翻转。
CPU运行速度为800Mhz,因此我希望,如果我在1Hz任务中读取PMCCNTR
,我会注意到该值会增加800Mhz。但是,在1Hz任务调用之间PMCCNTR
之间的差异更像是7200万。我还尝试过使用64时钟分频器,以确保观察结果合理。
我的数学正确吗?还是我使用了错误的数字作为CPU频率?确定PMCCNTR
应该以什么频率计数的确定方法是什么?
这是没有公开文档的定制硅片,因此800 MHz以上是标称值。
更新:根本原因是@Sean Houlihane指出的WFI
答案 0 :(得分:1)
只要未禁用计数器且内核未处于调试状态,PMCCNTR便会以内核时钟运行。如果您计算72 MHz / 1.125 MHz,那么您的内核很有可能以外部晶振频率运行,而不是内部PLL。
另一个可能的解释是,内核在大多数时间都处于WFI状态且时钟已停止-在这种情况下,您测量的结果将受到操作系统完成工作量的影响。