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

news2024/11/29 0:36:38

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

如何计算出CPU的时钟频率

  • 一,时钟周期,机器周期以及指令周期
    • 1.1 时钟周期(clock cycle)以及时钟频率(clock frequency)
    • 1.2 机器周期(Machine Cycle)/ CPU周期(CPU Cycle)
    • 1.3 指令周期(Instruction Cycle)
    • 1.4 指令周期、机器周期以及时钟周期之间的关系
  • 二,PMU 的Cycle Counter
    • 2.1 PMCCNTR_EL0, Performance Monitors Cycle Count Register
  • 三,如何计算出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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AP5191 DC-DC降压恒流IC LED智能控制电源芯片 线性 PWM调光

产品描述 AP5191是一款PWM工作模式,高效率、外围简单、内置功率MOS管&#xff0c;适用于4.5-150V输入的高精度降压LED恒流驱动芯片。输出最大功率150W&#xff0c;最大电流6A。AP5191可实现线性调光和PWM调光&#xff0c;线性调光脚有效电压范围0.55-2.6V.AP5191 工作频率可以…

86 # express 基本实现

koa 和 express 的区别 koa 内部原理使用 es6 来编写的&#xff08;promise async await&#xff09;&#xff0c;express 是使用 es5 来编写的&#xff0c;内部是基于回调函数来实现express 内置了很多中间件&#xff08;功能会比 koa 强大一些&#xff0c;内部集成了路由&a…

【应用笔记】Sub-1G系列产品CW32W031单片机CAD应用参考

一、功能介绍 CW32W031 的射频部分支持 CAD 中断。从 Deepsleep 进入 STB3&#xff0c;开启 CAD 功能并进入 RX 模式后&#xff0c; CW32W031 会检测信道中是否会有 ChirpIOT ™信号 , 如果存在将 CAD-IRQ 置高&#xff0c;MCU 内核可以通过一定的时间来检测 CAD-IRQ 信号是否…

DenseNet网络详解及Pytorch实现

DenseNet网络详解及Pytorch实现 DenseNet网络简介 DenseNet&#xff08;Densely Connected Convolutional Networks&#xff09;是由Gao Huang等研究人员于2017年提出的一种深度神经网络架构。DenseNet的主要思想是在网络的每一层之间建立密集的连接&#xff0c;这种密集连接…

[NLP] LLM---扩充词表LLama2-构建中文tokenization

使用SentencePiece的除了从0开始训练大模型的土豪和大公司外&#xff0c;大部分应该都是使用其为当前开源的大模型扩充词表&#xff0c;比如为LLama扩充通用中文词表&#xff08;通用中文词表&#xff0c;或者 垂直领域词表&#xff09;。那这部分工作有没有意义呢&#xff1f;…

Flutter 中的单元测试:从工作流基础到复杂场景

对 Flutter 的兴趣空前高涨——而且早就应该出现了。 Google 的开源 SDK 与 Android、iOS、macOS、Web、Windows 和 Linux 兼容。单个 Flutter 代码库支持所有这些。单元测试有助于交付一致且可靠的 Flutter 应用程序&#xff0c;通过在组装之前先发制人地提高代码质量来确保不…

【多尺度增强网络:超分】

Remote Sensing Image Super-Resolution via Multiscale Enhancement Network &#xff08;基于多尺度增强网络的遥感图像超分辨率&#xff09; 近年来&#xff0c;遥感图像因其特殊的价值而引起了人们的广泛关注。然而&#xff0c;卫星遥感图像通常是低分辨率的&#xff0c;…

案例实践丨基于SkyWalking全链路监控的微服务系统性能调优实践篇

1背景 随着开源社区和云计算的快速推进&#xff0c;云原生微服务作为新型应用系统的核心架构&#xff0c;得到了越来越广泛的应用。根据Gartner对微服务的定义&#xff1a;“微服务是范围狭窄、封装紧密、松散耦合、可独立部署且可独立伸缩的应用程序组件。” 微服务之父&…

markdown学习笔记

markdown学习笔记 1.文字&#xff08;依靠HTML&#xff09; 1.1文字缩进-空格转义符 单字符空&#xff1a;&emsp; 半字符空&#xff1a;&ensp;1.2文字对齐 「居中&#xff1a;」<center> 居中 </center> or <p align"center"> 居中 …

Java线程池中哪些事??

需要提前把线程准备好&#xff01;&#xff01;创建线程不是直接从系统申请&#xff0c;而是从池子里拿&#xff01; 等到线程不用了&#xff0c;也是还给池子&#xff01;&#xff01; 池子的目的是为了提高效率 线程的创建虽然比进程轻量&#xff0c;但是在频繁创建的情况下…

【计算机网络】图解应用层协议

图解应用层协议 1.应用层2.远程登录2.1 Telnet2.2 SSH 3.文件传输3.1 FTP3.2 TFTP 4.电子邮件4.1 通信架构4.2 邮件地址4.3 SMTP 协议4.4 POP3 协议4.5 IMAP 协议 5.WWW5.1 URI5.2 HTML5.3 HTTP 6.网络管理应用6.1 DHCP 协议6.2 DNS 协议 1.应用层 我们前面介绍过 TCP / IP 模…

【深度学习】 Python 和 NumPy 系列教程(十一):NumPy详解:3、数组数学(元素、数组、矩阵级别的各种运算)

目录 一、前言 二、实验环境 三、NumPy 0、多维数组对象&#xff08;ndarray&#xff09; 多维数组的属性 1、创建数组 2、数组操作 3、数组数学 1. 元素级别 a. 直接运算 b. 加法&#xff1a;np.add()函数 c. 减法&#xff1a;np.subtract()函数 d. 乘法&#xf…

Redis-带你深入学习数据类型zset

目录 1、zset有序集合 2、zset相关命令 2.1、添加或更新指定的元素——zadd 2.2、获取有序集合zset的元素个数相关命令&#xff1a;zcard、zcount 2.3、返回指定区间元素相关命令&#xff1a;zrange、arevrange、zrangebyscore 2.4、删除相关命令&#xff1a;zpopmax、zp…

C# 模拟button按钮批量锁住与打开

项目需求&#xff1a; 当winform界面上存在多个按钮时&#xff08;大于2个&#xff09;&#xff0c;用户需求为当点击其中一个按钮后&#xff0c;其它按钮全部为禁用&#xff0c;当被点击的按钮后台逻辑执行完成后&#xff0c;再释放所有按钮。用户可再次点击其它按钮。 此案…

Eclipse官网下载历史版本

进入官网 https://www.eclipse.org/ 进入下载页面 选择下载包 同一版本&#xff0c;又有不同类型 Eclipse IDE for Enterprise Java and Web Developers Eclipse IDE for Java Developers 任何Java开发人员必备的工具&#xff0c;包括Java IDE、Git客户端、XML编辑器、Mave…

第33章_瑞萨MCU零基础入门系列教程之DHT11温湿度获取实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

数据采集:数据挖掘的基础

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

解决gyp verb `which` failed python2 Error: not found: python2

运行老项目遇到如下报错 PS C:\Users\demo02> yarn install yarn install v1.22.19 info No lockfile found. [1/5] Validating package.json... [2/5] Resolving packages... warning axios0.18.1: Critical security vulnerability fixed in v0.21.1. For more informati…

4.1.8- Web 应用程序使用的组件进行指纹识别

Web 应用程序使用的组件进行指纹识别 IDWSTG-INFO-08 总结 毫不夸张地说&#xff0c;几乎所有可以想象的Web应用程序的想法都已经投入开发。随着全球大量自由和开源软件项目的积极开发和部署&#xff0c;应用程序安全测试很可能会遇到完全或部分依赖于这些知名应用程序或框架…

vue cli npm run build打生产环境包报错Cannot read property ‘pop‘ of undefined

问题出在webpack配置的代码拆分splitChunks 解决办法&#xff1a;每个cacheGroups中配置enforce: true;