ARMv8 系统定时器

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>

系统寄存器的配置频率,对应频率模式表的第n个entry。

七、系统定时器的频率修改

可以在cpu运行中,动态的修改系统定时器的频率。如果要修改频率,有以下几个步骤:

  • 修改CNTCR.FCREQ比特,将频率修改请求,设置为频率模式表的对应entry

  • 反复读取CNTSR.FCACK比特,判断修改是否成功

此条目发表在ARM分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。