ARMv8架构中,定义了一个系统定时器(system
timer),并且指定了这个系统定时器,需要实现的寄存器,以及各个寄存器的偏移。
系统寄存器中,包含一个系统计数器,以及一些控制寄存器,状态寄存器等。寄存器,包含如下:
寄存器的基地址,由 CNTControlBase 来指定。其实是由soc来决定。
一、频率模式表
系统定时器,可以通过设置,工作在不同的时钟频率下。但是在一个时刻下,系统定时器只能在一个时钟频率下工作。如下图所示:
系统定时器,提供了一个频率模式表(frequency mode table),用来保存系统定时器,可以配置的时钟频率。频率模式表,包含很多个entry(实现自定义),每个entry,保存了频率值,以HZ为单位。
要更改当前系统定时器的时钟时钟,只需要将CNTCR寄存器的FCREQ设置为频率模式表对应的entry即可。
armv8架构,最多支持1004个entry大小的频率模式表。
二、CNTCR寄存器
提供系统定时器的控制功能。关键是该寄存器的EN比特,表示是否开启系统定时器。
其中的FCREQ,见频率模式表,用于设置系统定时器的时钟频率。
三、CNTSR寄存器
提供系统定时器的状态信息。
其中的FCREQ,见频率模式表。读取FCACK,返回当前选中的频率模式表的entry项,从而可以获取到当前系统寄存器的时钟频率
四、CNTCV寄存器
保存当前系统定时器的计数值。是一个64bit的寄存器。该寄存器的值,会直接通过连线,传递给core。
五、CNTFID0
系统寄存器的基准频率,以hz为单位。对应频率模式表的第0个entry。
六、CNTFID
系统寄存器的配置频率,对应频率模式表的第n个entry。
七、系统定时器的频率修改
可以在cpu运行中,动态的修改系统定时器的频率。如果要修改频率,有以下几个步骤:
◾修改CNTCR.FCREQ比特,将频率修改请求,设置为频率模式表的对应entry
◾反复读取CNTSR.FCACK比特,判断修改是否成功