天天看点

ARMv8通用定时器简介前言1 Generic timer一2 Generic timer参考

前言

基于网上资料对相关概念做整理汇总,部分内容引用自文后文章。

详细内容参考手册 “ ARMv8-A Architecture reference manual-DDI0487A_g_armv8_arm.pdf  ”

个人经验总结:

(1)注意halt_on_debug处理;

(2)系统计数器的两种计数更新频率:基础更新频率+1模式和降频更新+N模式。

这里需要区分概念系统计数器的工作时钟频率、系统计数器的更新频率。

  • 工作时钟:也即系统计数器模块的时钟输入,是固定时钟1-50MHZ。
  • 系统计数器的更新频率:系统计数器数值更新变化的频率,也即多久计数值变化一次的频率。

(3)系统计数器的输出有哪些信号,这些信号是否需要同步到目标时钟域?

(4)理解物理计数器、虚拟计数器,这两个计数器都是Timer定时器内部的部件。Timer内部是没有计数器的,由三个寄存器实现。

1 Generic timer一

内容引用自文章“Linux时间子系统之(十七):ARM generic timer驱动代码分析”,链接放在文后。

1.1 system counter

ARM generic timer相关的硬件block如下图所示(用绿色标记):

ARMv8通用定时器简介前言1 Generic timer一2 Generic timer参考

ARM generic timer的硬件block主要是SOC上的System counter(多个process共享,用来记录时间的流逝)以及附着在各个processor上的Timer(用于触发timer event)组成,其他的generic timer的硬件电路主要是用来进行交流generic time event的。例如各个processor中的timer和system counter外设进行交互,各个processor中的timer进行信息交互。System counter的功能很简单,就是计算输入时钟已经过了多少个clock,开始的时候是0,每一个clock,System counter会加一。System counter的counter value需要分发到各个timer中,也就是说,从各个timer的角度看,system counter value应该是一致的。Timer其实就是定时器,它可以定义一段指定的时间,当时间到了,就会assert一个外部的输出信号(可以输出到GIC,作为一个interrupt source)。

从power domain来看,ARM generic timer分成两个部分:System counter和各个Multiprocessor系统中的Timer_x、接口电路等。之所以这么分原因很明显:功耗方面(电源管理)的考量。在power saving mode下,可以shutdown各个processor系统的供电,但是可以保持system counter的供电,这样,至少系统时间可以保持住。

和power domain类似,clock domain也是不同的,system counter和processor工作在不同的clock下,软件修改了CPU的频率也不会影响system counter的工作节奏,从而也不会改变timer的行为。

1.3 Timers

系统中每个processor都会附着多个timer,具体如下:

(1)对于不支持security extension的SOC(不支持security extension也就意味着 不支持virtualization extension),timer实际上有两个,一个是physical timer,另外一个是virtual timer。虽然有两个,不过从行为上看,virtual timer和physical timer行为一致

(2)对于支持security extension但不支持virtualization extension的SOC,每个cpu有三个timer:Non-secure physical timer,Secure physical timer和virtual timer

(3)对于支持virtualization extension的SOC,每个cpu有四个timer:Non-secure PL1 physical timer,Secure PL1 physical timer,Non-secure PL2 physical timer和virtual timer

每个timer都会有三个寄存器(我们用physical timer为例描述):

  • (1)64-bit CompareValue register。

该寄存器配合system counter可以实现一个64 bit unsigned upcounter。如果physical counter - CompareValue >= 0的话,触发中断。也就是说,CompareValue register其实就是一个64比特的upcounter,设定为一个比当前system counter要大的值,随着system counter的不断累加,当system counter value触及CompareValue register设定的值的时候,便会向GIC触发中断。

  • (2)32-bit TimerValue register。

该寄存器配合system counter可以实现一个32 bit signed downcounter(有的时候,使用downcounter会让软件逻辑更容易,看ARM generic timer的设计人员考虑的多么周到)。开始的时候,我们可以设定TimerValue寄存器的值为1000(假设我们想down count 1000,然后触发中断),向该寄存器写入1000实际上也就是设定了CompareValue register的值是system counter值加上1000。随着system counter的值不断累加,TimerValue register的值在递减,当值<=0的时候,便会向GIC触发中断

  • (3)32-bit控制寄存器。

该寄存器主要对timer进行控制,具体包括:enable或是disable该timer,mask或者unmask该timer的output signal(timer interrupt)

各个processor的各个Timer都可以产生中断,因此它和GIC有接口。当然,由于timer的中断是属于各个CPU的,因此使用PPI类型的中断,具体可以参考GIC文档。当然,如果让timer触发中断,当然要确保该timer是enable并且是umask的。

各个cpu的timer是根据system counter的值来触发timer event的,因此,系统中一定有一个机制让System counter的值广播到各个CPU的timer HW block上,同时运行在各个processor上的软件可以通过接口获取System counter的值。

处理器可以通过CNTPCT寄存器来获取system counter的当前值,我们称之physical counter。

有physical就有virtual,processor可以通过CNTVCT寄存器访问virtual counter,不过,对于不支持security extension和virtualization extension的系统,virtual counter和physical counter是一样的值。

2 Generic timer

引用文章“ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Generic timer”,链接放在文后。

2.1 概述

ARMv8通用定时器简介前言1 Generic timer一2 Generic timer参考

 2.2 完整的generic timer组件

ARMv8通用定时器简介前言1 Generic timer一2 Generic timer参考

 2.3 System Counter

ARMv8通用定时器简介前言1 Generic timer一2 Generic timer参考
ARMv8通用定时器简介前言1 Generic timer一2 Generic timer参考

2.4  AArch64 generic timer

2.4.1 Physical counter(包含system connter的count值)

ARMv8通用定时器简介前言1 Generic timer一2 Generic timer参考

 2.4.2 多个定时器

ARMv8通用定时器简介前言1 Generic timer一2 Generic timer参考

参考

1、作者 博文
Arm通用计时器简介
【ARMv8】通用定时器总结
ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Generic timer
Linux时间子系统之(十七):ARM generic timer驱动代码分析
Linux 驱动开发 三十四:Linux 内核定时器原理
ARM A64架构 DEBUG 学习(二)
ARMv7 GICv2 GenericTimer 实战演练

继续阅读