ARMv8通用定时器简介
前言
基于网上资料对相关概念做整理汇总,部分内容引用自文后文章。
详细内容参考手册 “ 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如下图所示(用绿色标记):
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 概述
2.2 完整的generic timer组件
2.3 System Counter
2.4 AArch64 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 学习(二) | |
ARMv7 GICv2 GenericTimer 实战演练 |
ARMv8通用定时器简介相关推荐
- 【ARMv8】通用定时器总结
本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. 博客内容主要围绕: 5G/6G协议讲解 ...
- 【STM32】通用定时器(TIM2到TIM5)
00. 目录 文章目录 00. 目录 01. 通用定时器简介 02. TIM2到TIM5主要特性 03. TIM2到TIM5功能说明 04. 时钟选择 05. 寄存器 5.1 TIMx 控制寄存器 1 ...
- 【正点原子STM32连载】第二十一章 通用定时器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...
- STM32 通用定时器原理介绍
一.STM32 通用定时器简介 STM32F1 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器 (CNT)构成.STM32 的通用定时器可以被用于:测量输入信号的脉冲长度 ...
- 【正点原子MP157连载】第十七章 通用定时器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- STM32F407ZG TIM通用定时器
STM32F407ZG开发板学习(6) 通用定时器简介 TIM2~TIM5 TIM9~TIM14 原理 TIMx控制寄存器1(TIMx_CR1) DMA/中断使能寄存器(TIMx_DIER) 预分频寄 ...
- STM32F103mini教程通用定时器
一.通用定时器的基本原理 1.三种STM32定时器区别 2.通用定时器功能特点描述 (1)STM32 的通用 TIMx (TIM2.TIM3.TIM4 和 TIM5)定时器功能特点包括: ①位于低速的 ...
- STM32F1笔记(九)通用定时器
STM32F1的定时器分为TIME1/8等高级定时器,TIME2~5等通用定时器,TIME6/7基本定时器.三者的区别主要参考<STM32中文参考手册>里特性的每种定时器主要特性的异同. ...
- STM32通用定时器输出PWM
1 .TIMx简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成. 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM). 使用定时器预分 ...
最新文章
- foxmail 怎么修改存储路径_FoxMail 7.2的邮件存储目录修改
- POJO、VO、PO、FormBean区别:
- ios UI自动化测试
- 分布式MySQL数据库TDSQL架构分析
- 思想实验(逻辑思维)解题
- Mysql外键约束foreign key
- java lambda 两个冒号_java lambda 表达式中的双冒号的用法说明 ::
- 丢手帕问题 (约瑟夫问题)Java实现
- 音视频 H.264格式介绍
- 金蝶k3 使用两台服务器的优势,金蝶k3报价系统优势如何,电商企业应用尤为明显...
- pdf怎么转换成图片格式
- 金蝶K3WISE 销售订单序时簿即时库存的开发
- 第三阶段应用层——1.10 数码相册—main_page主界面的显存管理、页面规划、输入控制
- python 声音指纹识别,Python-samp中的Dejavu音频指纹识别
- cesium面积计算_Cesium面积测量之思路解析加源码
- 解决谷歌浏览器无法输入中文的问题
- Swift Literal Convertibles
- java用一张一元票换一分_一张一分纸币更换两张一元纸币,知道收藏价值后,你也会更换!...
- 置信区间与显著性水平
- 虚拟机玩转 Veritas NetBackup(NBU)之 Linux 配置 NBU 客户端