前言 基于网上资料对相关概念做整理汇总,部分内容引用自文后文章。
1 Generic timer一 内容引用自文章“Linux时间子系统之(十七):ARM generic timer驱动代码分析”,链接放在文后。
1.1 system counter ARM generic timer相关的硬件block如下图所示(用绿色标记):
文章图片
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.2 物理计数器 各个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是一样的值。
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的。
2 Generic timer 引用文章“ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Generic timer”,链接放在文后。
2.1 概述
文章图片
2.2 完整的generic timer组件
文章图片
2.3 System Counter
文章图片
文章图片
2.4AArch64 generic timer
2.4.1 Physical counter(包含system connter的count值)
文章图片
2.4.2 多个定时器
文章图片
参考
1、作者 | 博文 |
Arm通用计时器简介 | |
【ARMv8】通用定时器总结 | |
ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Generic timer | |
Linux时间子系统之(十七):ARM generic timer驱动代码分析 | |
Linux 驱动开发 三十四:Linux 内核定时器原理 | |
ARM A64架构 DEBUG 学习(二) |
【数字IC设计|ARMv8通用定时器简介】
推荐阅读
- 安全|Apache Commons Configuration远程代码执行漏洞(CVE-2022-33980)分析&复现
- java|2022年最新阿里java面试题(java初级+中级+高级面试题(附答案))
- 控制工程|【控制工程】单位跃阶响应与传递函数
- java|Java常用类String
- 期末备考|C#、.NET实现的一个图书管理系统(大作业)
- java学习日记|2022-08-10反射
- 牛客网|【Java刷题进阶】基础入门篇⑤
- java|关于微信小程序与Java后台交互数据中中文乱码问题的讨论
- PHP毕设含lunwen|含文档+PPT+源码等]精品基于PHP实现的好物优购商城|电商小程序[包运行成功]计算机毕业设计PHP毕业设计项目源码计算机PHP毕业设计微信小程序