Cortex-M4内核结构

Cortex-M4内核结构
1. 内核Core
2. 三阶流水线
3. 内核工作模式
4. 总结

Cortex-M4内核结构

Cortex-M4处理器是ARMv7-M架构的一种实现,它是一种32位精简指令集(Reduced Instruction Set Computing, RISC)的处理器,有一个三阶的指令流水线,依次对指令进行取指、 解码、执行操作。它是一种哈佛架构,可以同时获取指令和数据,使用32位的地址总线,可以访问4G的地址空间。而且它采用的是一种装载存储结构, 也就是说它不能直接操作内存空间里的数据,需要先把内存空间中的数据装载到内核寄存器中,处理完毕之后再存储到内存中。
在这里插入图片描述

上图是从《M3M4权威指南》的第62页中截取的Cortex-M4的内核结构框图。 大体上可以分为三个部分:内核、总线接口、调试系统。其中调试系统主要用于固件的调试,监视系统的运行状态。它对于我们应该如何编写程序没有影响,本文不介绍它。

内核是处理器最核心的部分。它完成了几乎所有的运算、控制着程序的运行过程,以及中断的响应服务。它通过总线接口与内存空间交互,获取指令,装载数据,驱动外设。

内核与总线接口将是我们频繁打交道的两个主要部分,对它们的理解有助于我们更好的实现嵌入式操作系统XiaoTuOS。本文将详细介绍这两个部分。

1. 内核Core

根据上边的图示,内核由5个部分构成: 中断控制器(NVIC)、系统计时器(SysTick)、三阶流水线(3-stage pipeline)、浮点单元(FPU)、指令跟踪接口(Instruction Trace Interface)。 其中指令跟踪接口主要用于调试,不再解释。

**中断控制器(NVIC)全称是Nested Vectored Interrupt Controller。**它是处理器用于响应一些特定的事件的系统,这些特定的事件包括UART接收到了一个字节、计时器溢出等等。 每当有中断信号产生的时候,处理器就会先停下当前的任务,来处理中断事件,处理完毕之后再恢复到原来的任务当中。NVIC用一个中断向量表来记录各个中断服务函数的入口, 所以说它是Vectored。另外在Cortex-M4中中断是可以嵌套的,当处理一个低优先级的中断事件过程中,产生了一个高优先级的中断,处理器将优先处理高优先级的中断, 处理完毕之后的恢复过程也是先恢复低优先级的处理程序,再恢复到原先的系统任务。所以说这个控制器是Nested。

**系统计时器(SysTick)是Cortex-M4内核中的一个计时器。**它与程序的运行过程、中断的控制没有任何关系。我们完全可以将它看作是一个计时器外设。 很多在Cortex-M4上的操作系统都会用它来实现时钟系统。也不是必须用它来实现,只是它具有比较高的可移植性。只要是Cortex-M4的内核,甚至是Cortex-M系列的内核,都可以直接移植, 而不必再额外的提供系统时钟。

**浮点单元(FPU)是Cortex-M4内核的一个可选项,支持单精度的浮点运算。**它就是一个协处理器,具有自己独立的寄存器组、执行解析和执行流水线,以及对应的浮点运算指令集。 关于浮点单元的使用,我们将有专门的文章介绍。

**三阶流水线(3-stage pipeline)可以说是处理器内核的核心。**下面我们专门用一节介绍它。

2. 三阶流水线

在这里插入图片描述

如上图所示,Cortex-M4执行一条加法指令,将寄存器R1和R3中的数据相加,并把结果放到R2寄存器的计算过程。每条指令都需要经过3个阶段:Fetch、Decode、Execute。

**取指令(Fetch)是内核通过内存接口(memory interface),获取一条指令的过程。**在这个过程中,内核根据在“寄存器银行”(Register Bank)中的指令指针寄存器PC, 来确定需要索取的指令所在内存中的位置。内存接口则需要通过处理器上的各种总线,比如I-Code,来从内存中把指令搬到内核中。

**解码(Decode)所完成的工作就是解析索取的指令。**我们知道在计算机的世界中只有’0’和’1’。那么从内存中索取的一串’0’和’1’的序列具体是一个什么指令呢? 这就是解码器要做的工作。这个’0’,'1’序列的具体含义,就是处理器的指令集需要定义的事情。

结果解码之后,内核就知道它接下来需要执行一个加法任务。加法的两个操作数分别保存在寄存器R1和R3中,计算的结果需要保存到R2中。这三个寄存器都是Register Bank中的通用寄存器。剩下要做的就是执行(Execute)这一任务。在执行过程中,除了要按照指令要求保存计算结果之外,处理器还需要根据执行的结果更新系统的状态寄存器PSR。 PSR中有很多标志位,反映了该次计算结果是否溢出、是否为零等状态。这些状态是程序用来判定条件语句是否为真的依据,进而可以控制程序的指令流程。

假设,我们有一条if (a == b)的条件语句,在汇编层面上,我们可以将它分为几个步骤来实现: 首先,把变量a和b分别装在两个通用寄存器R1和R3中, 然后通过指令SUB R2, R1, R3来对a和b求差,结果将放到寄存器R2中。最后通过条件跳转语句BNE来查询PSR中的条件标识Z,判定SUB的计算结果是否为0, 如果不为零,则说明两个数据不相等,将跳过if之后的语句。当然这种分支语句的具体实现取决于编译器,但大体的套路就是这样的。

每条语句都需要经过取指、解码、执行三个操作才能完成,也就是说最快也需要三个时钟周期才能运行一条语句。但是因为有流水线的操作,处理器可以在执行一条语句的同时, 对其它语句进行取指和解码操作,如下图1所示。那么在没有任何分支语句或者跳转的情况下,每条语句的执行就只需要1个时钟周期就可以完成。

图1 Cortex-M4流水线过程示意图
图1 Cortex-M4流水线过程示意图

3. 内核工作模式

为了满足系统的不同Cortex-M4还有一些不同的工作模式,并且在不同的工作模式下它具有privileged和unprivileged两种访问权限。其中privileged可以访问处理器的所有资源, 而unprivileged则对一些指令和内存空间不能访问。在一些资料中把具有unprivileged级访问权限的状态和模式称为用户态"User state"。 为系统划分不同的权限等级,使得开发人员能够根据需要保护一些内存和资源不被随意地访问和修改,提高了系统的安全性和鲁棒性。

正常工作时,Cortex-M4有Handler和Thread两种工作模式。当处理器进入中断服务函数,处理系统异常或者中断事件时,就会进入Handler模式。 在Handler模式下,系统总是具有privileged级访问权限。一般情况下处理器都是Thread模式,在该模式下系统的访问权限可以是privileged也可以是unprivileged,具体由控制寄存器决定。 在Thread模式下,应用程序可以自由地由privileged切换到unprivileged,但是反过来则不可以。 如果必须要从unprivileged切换到privileged,则需要借助异常和中断处理机制。

如下图2所示,我们的操作系统可以看作是工作在Privileged Thread模式和Handler模式下的软件,它具有比较高级的资源访问权限,可以管理系统资源。与外设驱动息息相关的中断服务, 也应当是操作系统内核的一部分。用户的应用程序则工作在Unprivileged Thread模式下,当由应用程序需要访问系统资源时,需要通过操作系统提供的系统调用来实现。

图2 Cortex-M4内核工作模式和权限示意图
图2 Cortex-M4内核工作模式和权限示意图

此外,Cortex-M4有Debug和Thumb两种工作状态。当调试器触发暂停或者运行到断点时,处理器就会进入Debug状态停止执行指令。 运行时加入断点或者单步调试,是一种常用的白盒调试方法,可以直接关注内存。处理器执行指令时就处于Thumb状态。ARM内核一般都支持Thumb和ARM两种指令集, 但是Cortex-M系列只支持Thumb指令集,因此只有Thumb状态。

4. 总结

本文中,我们简单介绍了Cortex-M4的内核结构,它是一种32位的具有哈佛架构的精简指令集处理器。它使用一种三阶流水线的方式来执行指令,每条指令都将经过取指、解码、执行三个操作, 并且在执行一条指令的同时可以对其它指令进行取指和解码操作,这样可以提高系统的运行效率。

此外,Cortex-M4可以工作在不同的模式下,这些各种不同的模式,具有privileged和unprivileged的访问权限。其中privileged的访问权限可以访问处理器中的所有资源, 通常操作系统具有这种权限。而unprivileged的访问权限常常用于用户的应用程序。

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

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

相关文章

飞天使-docker知识点4-harbor

文章目录 Harbor安装完成harbor 官方建议方式之后查看 images配置docker 使用harbor 仓库上传下载镜像docker 镜像结合harbor 运行 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,由 vmware 开源,其通过添加一些企业必需的功…

C++初阶-list类的模拟实现

list类的模拟实现 一、基本框架1.1 节点类1.2 迭代器类1.3 list类 二、构造函数和析构函数2.1 构造函数2.2 析构函数 三、operator的重载和拷贝构造3.1 operator的重载3.2 拷贝构造 四、迭代器的实现4.1 迭代器类中的各种操作4.1 list类中的迭代器 五、list的增容和删除5.1 尾插…

Visual Studio 2022封装C代码为x64和x86平台动态库

1.引言 本文介绍如何使用Visual Studio 2022将C语言函数封装成x64和x86平台上使用的动态链接库(dll文件)并生成对应的静态链接库(lib文件),以及如何在C程序中调用生成的dll。 程序下载: 2.示例C语言程序 假设需要开发一个动态链接库,实现复…

for-each循环优先于传统的for循环

在大多数情况下,使用 for-each 循环(也称为增强型 for 循环)比传统的 for 循环更加简洁和方便。它提供了一种更直观的方式来遍历集合或数组中的元素。以下是一个例子,展示了 for-each 循环优于传统 for 循环的情况: i…

AI智能配音助手微信小程序前后端源码支持多种声音场景选择

大家好今天给大家带来一款配音小程序 ,这款小程序支持多种不同声音和场景的选择更人性化, 比如说支持各地区的方言,英文,童声呀等等、 另外也支持男声女声的选择,反正就是模板那些非常的多 当然啦音量,语调,语速那些都是可以DIY跳转的哟,所以说这一款小程…

python每日学11:xpath的使用与调试

背景:最近在使用selenium 模拟浏览器作一些常规操作,在使用selenium的过程中接触到的一种定位方法,叫xpath, 这里说一下使用心得。 首先,我觉得如果只是简单使用的话是不用详细了解具体的语法规则的。 一、xpath怎么用&#xff1…

树莓派(Raspberry Pi)4B密码忘记了,怎么办?

树莓派长时间不用,导致密码忘记了,这可咋整? 第1步:取出SD卡 将树莓派关机,移除sd卡,使用读卡器,插入到你的电脑。 第2步:编辑 cmdline.txt 在PC上打开SD卡根目录,启动…

【星环云课堂大数据实验】kafka消息发布与订阅

文章目录 一、Kafka概述二、实验环境三、实验准备四、实验目的五、实验步骤5.1、创建Kafka Topic5.2、Kafka消息发布5.3、Kafka消息订阅 六、实验感悟 一、Kafka概述 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。该项目的目标是为处理实…

内存的管理、扩充、存储保护、地址转换、分配和回收

一、 内存的存储保护 1.1 上、下限寄存器方式: 上、下限寄存器(Limit Registers):这是一种硬件级别的内存保护机制。每个进程都有一对上、下限寄存器,用于定义该进程能够访问的内存范围。上限寄存器存储进程能够访问的…

【Android12】WindowManagerService架构分析

Android WindowManagerService架构分析 WindowManagerService(以下简称WMS) 是Android的核心服务。WMS管理所有应用程序窗口(Window)的Create、Display、Update、Destory。 因为Android系统中只有一个WMS(运行在SystemServer进程),可以称其为…

快宝技术:连接无代码开发,API集成提升电商营销和用户运营效率

无代码开发:创新的启航 快宝技术自2012年成立至今,一直是无代码开发领域的佼佼者。通过无代码开发平台,快宝技术旨在降低技术门槛,并使非技术人员能够轻松创建和部署应用程序。这不仅使得快递末端软件开发变得高效和便捷&#xf…

vue3.0项目搭建

一、安装vue3脚手架 卸载vue2脚手架 npm uninstall -g vue-cli清除缓存 npm cache clen --force安装最新脚手架 npm install -g vue/cli查看脚手架版本 vue -V 二、构建项目 创建项目 vue create 项目名选择配置 自定义配置,回车 上下键选择Linter / Formatter&a…

DC-2靶场

DC-2 下载地址:DC and Five86 Series Challenges - Downloads​编辑https://www.five86.com/downloads.html DC-2环境配置:解压后在vm虚拟机点击左上方文件-->打开-->选择解压后的DC-2。把kali和DC-2的网路适配器都改成NAT模式 flag1 首先进行主…

【教程】从零开始的ORB-SLAM3的安装与配置

引言 最近项目需求需要接触vslam,博主选择从ORB-SLAM3下手并且记录下安装的基本流程。不得不说,这安装流程就像二大娘的裹脚布。 大致环境前提:Ubuntu20.04 一、ORB-SLAM3的源码下载 1、首先,为了方便管理文件,我们…

面向对象三大特征之二:继承

继承的快速入门 什么是继承? Java中提供了一个关键字extends,用这个关键字,可以让一个类与另一个类建立起父子关系 继承的特点 子类能继承父类的非私有成员(成员变量、成员方法) 继承后对象的创建 子类的对象是由…

MyBatis Plus 大数据量查询优化

大数据量操作的场景大致如下: 数据迁移 数据导出 批量处理数据 在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理。但有些情况不需要分页的方式查询数据或分很大一页查询数据时,如果一下子将数…

RTX 40 SUPER发布时间定了!价格也有了

快科技12月16日消息,NVIDIA RTX 40 SUPER系列显卡基本确定将在2024年1月8日正式发布,也就是CES 2024大展期间,随后在1月中下旬陆续解禁上市。 RTX 4070 SUPER 1月16日解禁公版/原价丐版,1月17日解禁高价高配版,上市开…

测试架构师必备技能-Nginx安装部署实战

Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的免费开源Web和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。在高并发访问的情况下,Nginx是Apache服务器不错的替代品。官网数据显示每秒TPS高达50W左右。本文为读者朋…

FPGA设计时序约束十二、Set_Clock_Sense

目录 一、序言 二、Set Clock Sense 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 3.1 工程代码 3.2 无set_clock_sense 3.3 设置set_clock_sense 四、参考资料 一、序言 本章将介绍Set_Clock_Sense约束,在介绍约束之前&#xff0…