前言

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

详细内容参考手册 “ 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通用定时器简介相关推荐

  1. 【ARMv8】通用定时器总结

    本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. 博客内容主要围绕:        5G/6G协议讲解    ...

  2. 【STM32】通用定时器(TIM2到TIM5)

    00. 目录 文章目录 00. 目录 01. 通用定时器简介 02. TIM2到TIM5主要特性 03. TIM2到TIM5功能说明 04. 时钟选择 05. 寄存器 5.1 TIMx 控制寄存器 1 ...

  3. 【正点原子STM32连载】第二十一章 通用定时器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  4. STM32 通用定时器原理介绍

    一.STM32 通用定时器简介 STM32F1 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器 (CNT)构成.STM32 的通用定时器可以被用于:测量输入信号的脉冲长度 ...

  5. 【正点原子MP157连载】第十七章 通用定时器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  6. STM32F407ZG TIM通用定时器

    STM32F407ZG开发板学习(6) 通用定时器简介 TIM2~TIM5 TIM9~TIM14 原理 TIMx控制寄存器1(TIMx_CR1) DMA/中断使能寄存器(TIMx_DIER) 预分频寄 ...

  7. STM32F103mini教程通用定时器

    一.通用定时器的基本原理 1.三种STM32定时器区别 2.通用定时器功能特点描述 (1)STM32 的通用 TIMx (TIM2.TIM3.TIM4 和 TIM5)定时器功能特点包括: ①位于低速的 ...

  8. STM32F1笔记(九)通用定时器

    STM32F1的定时器分为TIME1/8等高级定时器,TIME2~5等通用定时器,TIME6/7基本定时器.三者的区别主要参考<STM32中文参考手册>里特性的每种定时器主要特性的异同. ...

  9. STM32通用定时器输出PWM

    1 .TIMx简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成. 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM). 使用定时器预分 ...

最新文章

  1. foxmail 怎么修改存储路径_FoxMail 7.2的邮件存储目录修改
  2. POJO、VO、PO、FormBean区别:
  3. ios UI自动化测试
  4. 分布式MySQL数据库TDSQL架构分析
  5. 思想实验(逻辑思维)解题
  6. Mysql外键约束foreign key
  7. java lambda 两个冒号_java lambda 表达式中的双冒号的用法说明 ::
  8. 丢手帕问题 (约瑟夫问题)Java实现
  9. 音视频 H.264格式介绍
  10. 金蝶k3 使用两台服务器的优势,金蝶k3报价系统优势如何,电商企业应用尤为明显...
  11. pdf怎么转换成图片格式
  12. 金蝶K3WISE 销售订单序时簿即时库存的开发
  13. 第三阶段应用层——1.10 数码相册—main_page主界面的显存管理、页面规划、输入控制
  14. python 声音指纹识别,Python-samp中的Dejavu音频指纹识别
  15. cesium面积计算_Cesium面积测量之思路解析加源码
  16. 解决谷歌浏览器无法输入中文的问题
  17. Swift Literal Convertibles
  18. java用一张一元票换一分_一张一分纸币更换两张一元纸币,知道收藏价值后,你也会更换!...
  19. 置信区间与显著性水平
  20. 虚拟机玩转 Veritas NetBackup(NBU)之 Linux 配置 NBU 客户端

热门文章

  1. 实时音频混音技术在视频直播场景中的实践
  2. 使用PhoenixSuit.exe刷机失败的解决办法
  3. 使用python爬取斗破苍穹小说网
  4. 河北省张家口市谷歌高清卫星地图下载
  5. LigerUI —— 表格树的使用
  6. 网页实现文件打包下载
  7. android 定时换图片,Android 定时器实现图片的变换
  8. 皕杰报表中的图表钻取
  9. 第13届D2大会 - 参会感受和总结
  10. pythonapriori算法特点_Apriori算法介绍(Python实现)