卢骏 · 2020年06月04日

ARMv8 系统定时器

ARMv8架构中,定义了一个系统定时器(system timer),并且指定了这个系统定时器,需要实现的寄存器,以及各个寄存器的偏移。

系统寄存器中,包含一个系统计数器,以及一些控制寄存器,状态寄存器等。寄存器,包含如下:

1.png

寄存器的基地址,由 CNTControlBase 来指定。其实是由soc来决定。

一、频率模式表

系统定时器,可以通过设置,工作在不同的时钟频率下。但是在一个时刻下,系统定时器只能在一个时钟频率下工作。如下图所示:
2.png

系统定时器,提供了一个频率模式表(frequency mode table),用来保存系统定时器,可以配置的时钟频率。频率模式表,包含很多个entry(实现自定义),每个entry,保存了频率值,以HZ为单位。
3.png

要更改当前系统定时器的时钟时钟,只需要将CNTCR寄存器的FCREQ设置为频率模式表对应的entry即可。

armv8架构,最多支持1004个entry大小的频率模式表。

二、CNTCR寄存器

提供系统定时器的控制功能。关键是该寄存器的EN比特,表示是否开启系统定时器。
4.png

其中的FCREQ,见频率模式表,用于设置系统定时器的时钟频率。
5.png

三、CNTSR寄存器

提供系统定时器的状态信息。
6.png

其中的FCREQ,见频率模式表。读取FCACK,返回当前选中的频率模式表的entry项,从而可以获取到当前系统寄存器的时钟频率

四、CNTCV寄存器

保存当前系统定时器的计数值。是一个64bit的寄存器。该寄存器的值,会直接通过连线,传递给core。

五、CNTFID0

系统寄存器的基准频率,以hz为单位。对应频率模式表的第0个entry。
7.png

六、CNTFID<n>

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

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

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

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

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

系列其他篇

原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。
推荐阅读
关注数
23565
内容数
1017
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息