ARM如何利用PMU的Cycle Counter(时钟周期)来计算出CPU的时钟频率

2023-09-13 23:10:32

本章将学习如何利用ARM PMU的Cycle Counter,来计算出CPU的时钟周期,从而计算出CPU的时钟频率。在介绍计算方法前,有必要先介绍下什么是时钟周期、机器周期以及指令周期。

一,时钟周期,机器周期以及指令周期

1.1 时钟周期(clock cycle)以及时钟频率(clock frequency)

同学们是否还记得数电里学过的同步时序逻辑电路:电路里的所有触发器都是同一个时钟脉冲源,触发器的状态会与该时钟脉冲信号同步,即一个时钟脉冲到来,所有触发器的状态就改变一次。CPU与之类似,需要给CPU灌入一个连续的时钟脉冲信号,每一次脉冲到来,CPU内的晶体管就改变一次状态,而源源不断的时钟脉冲正是CPU能够执行计算任务的关键。

在这里插入图片描述
如上图所示,脉冲信号做出周期变化的最短时间称之为震荡周期,也称为 CPU 时钟周期。它是计算机中最基本的、最小的时间单位。周期的倒数就是频率,所以我们很容易得出时钟频率和时钟周期的关系:
时钟频率 = 1 时钟周期 时钟频率=\frac{1}{时钟周期} 时钟频率=时钟周期1
一秒(1 s)内,发出的震荡脉冲个数为时钟频率
。我们经常讲某个CPU的主频是多少GHz、多少MHz,并认为CPU的频率越高,其运算性能越强。从时钟频率的原理分析可知:时钟频率越高,一秒内发出的脉冲个数越多,CPU内的晶体管状态变化次数越多,即CPU的运算速度越快。
事实上,每个CPU,或者每个芯片都有自己的正常工作频率范围(在最小工作频率和最大工作频率之间)。时钟频率越高,晶体管状态变化越频繁,当晶体管未及时更新状态,而下一个脉冲信号就已经到来时,CPU有可能进入未知的状态,不能正常工作。

1.2 机器周期(Machine Cycle)/ CPU周期(CPU Cycle)

机器周期也称为CPU周期。
在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。
例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作(注意:每一个基本操作都是由若干CPU最基本的动作组成)。完成一个基本操作所需要的时间称为机器周期。通常用内存中读取一个指令字的最短时间来规定CPU周期。(原文)
机器周期是为了实现指令流水线而引入的概念,实际上对应的是指令流水线的各个阶段,称之为流水阶段(或功能段,流水级等)。
从下图可知,一个机器周期包含了若干个时钟周期:
在这里插入图片描述

1.3 指令周期(Instruction Cycle)

CPU从存储器中取出并执行一条指令所需的全部时间称之为指令周期。一个指令周期通常用需要几个CPU周期来表示:
在这里插入图片描述
指令不同,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。
在这里插入图片描述

1.4 指令周期、机器周期以及时钟周期之间的关系

简单概括就是:一个指令周期,包含多个 CPU 周期,而一个 CPU 周期包含多个时钟周期。

二,PMU 的Cycle Counter

PMU模块里有一个64-bit 位宽的计数器cycle counter,这个cycle counter的计数频率为CPU的时钟频率。可以通过读取寄存器 PMCCNTR_EL0 或者 PMCCNTR来获取当前cycle counter里的clock cycle。

在这里插入图片描述

2.1 PMCCNTR_EL0, Performance Monitors Cycle Count Register

寄存器PMCCNTR_EL0保存着CPU的cycle counter的值,记录着CPU时钟周期数( clock cycles)。AArch64系统寄存器PMCCNTR_EL0[63:0]映射到AArch32的PMCCNTR[63:0]。
需要注意的是:

  1. 尽管arm体系结构要求PMCCNTR_EL0 或PMCCNTR的直接读取按程序顺序进行,但并不要求在两次这样的读取之间计数增加。即使cycle counter在每个时钟周期中都在增加,软件也可能需要检查两次读取计数器之间的差是否为非零。
  2. WFI 和WFE指令或造成CPU 时钟停止,进入standby模式。此时所有计数器的时钟频率也会发生变化。这意味着当时钟被WFI和WFE指令停止时,PMCCNTR_EL0是否会继续计数是受约束的,不可预测的。

使用如下指令即可读取CPU时钟周期数( clock cycles)到指定寄存器:

;AArch64:
MRS <Xt>, PMCCNTR_EL0
;AArch32:
MRC{<c>}{<q>} <coproc>, {#}<opc1>, <Rt>, <CRn>, <CRm>{, {#}<opc2>}

三,如何计算出CPU的时钟频率

我们有了上文的基础知识作为铺垫,就可以来计算CPU的时钟频率了。基本原理如下:

  1. 在固定时间T内记录下CPU经过的时钟周期数C。
  2. CPU的时钟频率F可得:
    时钟频率 F = 时钟周期数 C 固定时间 T 时钟频率F=\frac{时钟周期数C}{固定时间T} 时钟频率F=固定时间T时钟周期数C

所以我们的程序伪代码可以这样写:

cycle1 = Read_PMCCNTR();
wait(10);//wait 10s
cycle2 = Read_PMCCNTR();
freq = (cycle2-cycle1)/10;

至于延时函数wait(),可以使用ARM CPU内部的generic timer或者 system counter来实现延时。

四,参考文档

https://wenwen.sogou.com/question/q660822487.htm
https://blog.csdn.net/weixin_37641832/article/details/88920468
https://zhuanlan.zhihu.com/p/461519409

更多推荐

Linux系统--多线程

文章目录线程的概念创建线程线程退出一、线程的概念线程在进程内部执行,是OS调度的基本单位。在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都

面试系列之《Linux&Shell》(更新中)

1.用awk命令实现一个词频统计。假设文件名“data”,文件内容:ABCDACDDBCC1.1.python实现因为不熟悉awk命令,当时用python实现的:res_dict={}withopen('./data','r',encoding='utf-8')asfp:forlineinfp:foriteminlin

Android 图片加载框架Glide源码详解

我们看Glide的源码从Glide类入手,使用的时候我们先调用的with方法,源码中with有3个多载的方法:下图翻译过来就是activity用FragmentActivityApplicationcontext用with(Context)还有一个with(View)的殊途同归,最后都是调用了getRetriever(

[激光原理与应用-68]:如何消除50Hz工频干扰和差分信号应对工频干扰

目录一、什么工频干扰1.1什么工频干扰1.2工频干扰的幅度1.3工频干扰如何进入设备1.4工频干扰的负面影响二、如何消除工频干扰2.1要消除工频干扰,可以考虑以下方法:2.2要具体消除工频干扰,可以采取以下措施2.3使用差分信号消除工频干扰:三、单端信号传输和差分信号传输比较一、什么工频干扰1.1什么工频干扰50Hz的

【网络技术】计算机网络介绍

写在前面计算机网络是指将多台计算机连接起来,使它们能够相互通信和共享资源的系统。它是现代计算机科学中的重要分支之一,为全球范围内的信息交流和数据传输提供了基础。本文将介绍计算机网络的基础概念、体系结构、协议、常见问题等的知识。一、基本介绍1.计算机网络是什么?计算机网络是由若干台计算机和与之相连的通信设备组成的系统,这

记录使用Docker Compose 部署《XAPI项目》遇道的问题及解决方案

《XAPI项目》:GitHub仓库(勿打🚫小破站一个)这篇文章,主要内容是记录使用DockerCompose部署《XAPI项目》遇道的问题及解决方案目录📚本地MySQL数据如何导入到容器内的MySQL中❎解决报错:docker-xapi-backend-1|q.GetUserInfoByUserAccounterr

KMP算法

1.典型例题28.找出字符串中第一个匹配项的下标-力扣(LeetCode)题干:给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sadbut

Spring WebFlux使用未加前缀的双通配符模式绕过安全性CVE-2023-34034

文章目录0.前言漏洞漏洞介绍描述1.参考文档2.基础介绍3.解决方案3.1.升级版本4.漏洞修复源码分析5.漏洞利用示例0.前言背景:公司项目扫描到WebFlux中使用"**"作为模式会导致SpringSecurity和SpringWebFlux之间CVE-2023-34034漏洞漏洞高|2023年7月18日|CVE-

LVS+Keepalived群集

LVS+Keepalived群集一、Keepalived实现原理1、原理2、Keepalived体系主要模块及其作用3、Keepalived工具介绍4、合格的集群应该具备的特性二、Keepalived的部署三、LVS+Keepalived高可用集群部署1.部署共享存储2.配置负载调度器(主、备相同)3.配置节点服务器4

2023年亚马逊云科技中国峰会记录

前言有幸抽到了亚马逊云科技中国峰会的门票,恰好又是在上海举行的,并且看预告有很多热点内容,所以就参加了。27日一早就赶到了世博中心,此时已经排起了长队。看来与会者还是蛮多的。整体分为以下几个环节:一.上午的主题演讲二.下午的互动活动三.下午的各种分会场论坛一.主题演讲-面向未来进行构建首个环节,是主题演讲,演讲者是亚马

springboot2整合nacos云服务,配置基本类型和json类型

最近公司要搭建一个配置中心,由于不想自己运维,便选择了云服务,定的是阿里云的nacos服务,即​​​​​​​https://mse.console.aliyun.com/。这里记录一下在springboot2项目中,使用云nacos来做一些基本配置String、int等,和配置json数据映射到java对象中。1云na

热文推荐