当前位置: 首页 > news >正文

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

本章将学习如何利用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

相关文章:

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

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

56资源网系统源码搭建知识付费-含源码

内置了上万条数据资源 大致功能&#xff1a; 支持免费与付费&#xff08;增加了插件付费插件&#xff09;支持侧边栏支持添加各类型广告&#xff08;你所能用到的基本都有&#xff09;.支持网盘下载模块支持所有页面自定义支持文章页三方跳转支持添加页面支持自定义采集&#…...

【运营版】仿东郊到家上门服务app小程序开发同城美容家政预约推拿足浴SPA技师派单源码

套餐一:源码=小程序端+公众号端+APP端=280元 套餐二:全包服务 包服务器+域名+APP+认证小程序+H5+PC=1000元 后端:系统后端使用PHP语言开发 前端:前端使用uniapp进行前后端分离开发 用户端功能模块:技师选择 预约服务 优惠券 订单 技师服务...

uniapp项目实践总结(十五)使用websocket实现简易聊天室

导语:在一些社交软件中,经常可以看到各种聊天室的界面,接下来就总结一下聊天室的原理个实现方法,最后做一个简易的聊天室,包括登录/登出、加入/离开房间、发送接收聊天消息等功能。 目录 准备工作原理分析组件实现实战演练服务端搭建案例展示准备工作 在pages/index文件夹…...

论文阅读之Learning and Generalization of Motor Skills by Learning from Demonstration

论文阅读其实就是用自己的话讲一遍&#xff0c;然后理解其中的方法 0、论文基本信息 为什么阅读此篇论文&#xff1a;因为它是DMP经典论文&#xff0c;被引多次&#xff0c;学史可以明智&#xff0c;了解最初机理。 论文题目&#xff1a;Learning and Generalization of Moto…...

SpringCloud中的Eureka的集群配置

微服务框架中最为重要的就是注册中心&#xff0c;如果只是单注册中心&#xff0c;一旦出现问题&#xff0c;容易导致整个微服务环境不可用&#xff0c;所以建议注册中心集群。 目前SpringCloud框架中使用Eureka作为注册中心&#xff0c;本文简单介绍一下Eureka的集群配置&…...

10 Ubuntu下配置STMCubeMX与CLion IDE联合环境搭建(不包含下载CLion的教程)

序言 果然作为一名测控系的学生&#xff0c;纯搞视觉多少还是有点与专业脱节&#xff0c;决定入坑嵌入式。选择STM32进行入门&#xff0c;并且使用CubeMX加CLion作为我的第一个真正意义上的嵌入式开发环境&#xff08;大一的时候玩过一段时间&#xff0c;但是没什么技术&#…...

负载均衡原理及应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

视频讲解|1033含sop的配电网重构(含风光可多时段拓展)

目录 1 主要内容 程序特点 讲解重点 2 视频链接 1 主要内容 该视频为含sop的配电网重构matlab代码讲解&#xff0c;对应资源下载链接为含sop的配电网重构&#xff08;含风光|可多时段拓展&#xff09;&#xff0c;程序主要内容是&#xff1a;针对含sop的配电网重构模型&…...

uni-app监听页面滚动

在uni-app中可以通过监听页面滚动事件来实现滚动效果或响应滚动事件 在需要监听滚动的页面或组件中&#xff0c;添加一个scroll元素&#xff0c;用于容纳内容并实现滚动效果。 <template><view class"container"><scroll-view scroll-y scroll"…...

[字符串和内存函数]strcmp字符串函数的详解和模拟

strcmp函数 strcmp函数是一个用于比较两个字符串的C标准库函数。它的原型为&#xff1a; int strcmp(const char* str1, const char* str2);strcmp函数会比较str1和str2两个字符串的字符序列&#xff0c;并返回一个整数值来表示它们之间的大小关系。返回值的含义如下&#xff…...

zookeeper 常见问题处理

调整jvm参数 [rootvm-02 conf]# cat /opt/app/zookeeper-3.4.14/bin/zkEnv.sh |grep java.env -A3 -B3ZOOCFG"$ZOOCFGDIR/$ZOOCFG"if [ -f "$ZOOCFGDIR/java.env" ] then. "$ZOOCFGDIR/java.env" fiif [ "x${ZOO_LOG_DIR}" "x&…...

repo 命令

repo命令是Google开发的用于管理Android版本库的一个工具。 repo命令并不是用于取代git&#xff0c;而是用Python对git进行了一定的封装&#xff0c;简化了对多个Git版本库的管理。 repo init -u -b -m <manifest 文件名称> repo sync 相当于 git clone 获取 git remote…...

一、 计算机网络概论

一、计算机网络概论 1、计算机网络概述 1.1、概念 计算机网络是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统 是一些互连的、自治的计算机系统的集合 以能够相互共享资源的方…...

从零学习开发一个RISC-V操作系统(一)丨计算机组成原理相关知识与RISC-V指令集简介

本篇文章的内容 一、计算机组成原理的相关知识1.1 计算机的硬件组成1.2 程序的存储与执行1.3 程序语言的设计和进化1.4 存储设备的层次结构1.5 操作系统 二、RISC-V的指令集ISA简介2.1 什么是ISA2.2 复杂指令集&#xff08;CISC&#xff09;和精简指令集&#xff08;RISC&#…...

C++ - 异常介绍和使用

前言 我们在日常编写代码的时候&#xff0c;难免会出现编写错误带来程序的奔溃&#xff0c;或者是用户在使用我们编写的程序时候&#xff0c;使用错误所带来程序的奔溃。 在C 当中 可以对你觉得可能发生 错误 的地方在运行之前进行判断&#xff0c;发生错误可以给出提示。 C…...

iText实战--在现有PDF上工作

6.1 使用PdfReader读取PDF 检索文档和页面信息 D:/data/iText/inAction/chapter03/image_direct.pdf Number of pages: 1 Size of page 1: [0.0,0.0,283.0,416.0] Rotation of page 1: 0 Page size with rotation of page 1: Rectangle: 283.0x416.0 (rot: 0 degrees) Is reb…...

SQL优化--count优化

select count(*) from tb_user ;在之前的测试中&#xff0c;我们发现&#xff0c;如果数据量很大&#xff0c;在执行count操作时&#xff0c;是非常耗时的。 MyISAM 引擎把一个表的总行数存在了磁盘上&#xff0c;因此执行 count(*) 的时候会直接返回这个 数&#xff0c;效率很…...

IDEA下使用Spring MVC

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…...

2022基金从业人员资格管理及后续职业培训 部分答案(自答)

2022基金从业人员资格管理及后续职业培训 区块链在金融交易后处理中的应用私募基金行业典型违法案例分析《证券法》修订情况报告《刑法修正案&#xff08;十一&#xff09;》金融犯罪条款中国结算港股通结算业务介绍商品投资与商品配置价值气候技术&#xff1a;实现双碳目标的技…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...