本文主要是介绍【ARMv8/v9 系统寄存 3 -- system counter CNTPCT_EL0】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- ARMv8/v9 system counter
- system counter读取函数实现
ARMv8/v9 system counter
所有使用Arm处理器的系统中都会包含一个标准化的通用定时器(Generic Timer)框架。这个通用定时器系统提供了一个系统计数器(System Counter)和一组定时器(Timer)。其结构类似下图:
系统计数器是全局唯一的,并且全局共享,对系统中的所有Arm核心进行广播。
- ARMv8.0 到 ARMv8.5(含):位宽:至少56位宽。任何64位读取的计数器值都会被零扩展到64位。频率:以固定频率递增,该频率通常在1-50MHz范围内。它可以支持一个或多个备选操作模式,在这些模式中,计数器以较大的数额递增,频率较低,通常用于节能。
- 从 ARMv8.6 开始 位宽:必须是64位宽,频率:以固定的1GHz频率递增,翻转时间:不少于40年。
这个系统计数器还是一直存在的,哪怕系统处于待机状态,所有内核都被关闭了,它仍然可以工作。
需要注意的是system counter必须实现于always-on power domian. 在 ARMv8.0 到 ARMv8.5期间,为了配合低功耗的工作,system counter 如果运行低频率下,那么每个时钟周期可以增长一个相对较大的值,例如:在10M的时候每个时钟周期增长步长为1,但是在低功耗模式下运行在20KHz的时候,每个时钟周期增长步长为500。
从ARMv8.6 开始system counter运在固定的1GHz, ARM 解释说 尽管它的时钟周期为1ns,但是这并不需要每过1ns counter的值就增加1,它的增长步长不能低于200。
system counter读取函数实现
global syscnt
syscnt:STP X29, X30, [SP, #-16]!MOV X29, SPMRS X0, CNTPCT_EL0LDP X29, X30, [SP], #16RET
这篇关于【ARMv8/v9 系统寄存 3 -- system counter CNTPCT_EL0】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!