当前位置:网站首页>第四章:架构,Architecture
第四章:架构,Architecture
2022-08-03 05:55:00 【qqssss121dfd】
C o r t e x − M 3 Cortex-M3 Cortex−M3和 C o r t e x − M 4 Cortex-M4 Cortex−M4处理器是基于 A R M v 7 − M ARMv7-M ARMv7−M架构的, A R M v 7 − M ARMv7-M ARMv7−M架构的出现是因为为了开发 C o r t e x − M 3 Cortex-M3 Cortex−M3系列处理器,当 C o r t e x − M 4 Cortex-M4 Cortex−M4系列处理器出现的时候,又对 A R M v 7 − M ARMv7-M ARMv7−M架构进行了额外的指令添加以及架构特性扩充。也把对 A R M v 7 − M ARMv7-M ARMv7−M架构进行扩充了的架构叫做 A R M v 7 E − M ARMv7E-M ARMv7E−M。
C o r t e x − M 3 Cortex-M3 Cortex−M3和 C o r t e x − M 4 Cortex-M4 Cortex−M4处理器有两种操作状态和两种模式,除此之外,处理器还有特权接入级别和非特权接入级别。特权接入级别可以获取处理器的所有资源,非特权接入级别不能获取某些存储区域,也无法进行一些特定的操作。
两种操作状态:
- Debug state: When the processor is halted (e.g., by the debugger, or after hitting a breakpoint), it enters debug state and stops executing instructions.
- Thumb state: If the processor is running program code (Thumb instructions), it is in the Thumb state. Unlike classic ARM processors like ARM7TDMI, there is no ARM state because the Cortex-M processors do not support the ARM instruction
set.
两种操作模式:
- Handler mode: When executing an exception handler such as an Interrupt Service Routine (ISR). When in handler mode, the processor always has privileged access level.
- Thread mode: When executing normal application code, the processor can be either in privileged access level or unprivileged access level. This is controlled by a special register called “CONTROL.”
软件可以将处理器从特权 T h r e a d Thread Thread模式切换到非特权 T h r e a d Thread Thread模式,切换到非特权 T h r e a d Thread Thread模式之后软件无法再将处理器切换回特权 T h r e a d Thread Thread模式。如果确实有这种需求的话,可能需要用中断的机制去实现。特权接入和非特权接入的划分使得系统设计者可以设计出健壮的嵌入式系统,这是通过保护对关键存储区域的接入这种机制来实现的。例如一个包含操作系统核和一般应用程序的嵌入式系统,可以让操作系统核处于特权接入级别,让一般应用程序处于非特权接入级别,这样我们可以通过 M P U MPU MPU来设置一般应用程序对存储空间的接入范围,从而防止一般应用程序影响操作系统核和其它的一般应用程序,这样当这个一般应用程序由于某种原因崩溃的时候,操作系统核和其它的一般应用程序可以继续运行。
除了在存储空间接入权限以及一些特殊指令的使用上的不同,特权接入级别和非特权接入级别的编程者模型基本一样。所有的 N V I C NVIC NVIC寄存器都是特权接入级别。 T h r e a d Thread Thread模式和 H a n d l e r Handler Handler模式有非常相似的编程者模型。然而 T h r e a d Thread Thread模式可以切换到使用一个 s h a d o w e d shadowed shadowed堆栈指针,这是得一般的应用程序的堆栈空间和操作系统的堆栈空间可以完全区隔开来从而增加了系统的稳定性。默认情况下, C o r t e x − M Cortex-M Cortex−M处理器在开始的时候处于特权接入 T h r e a d Thread Thread模式, T h u m b Thumb Thumb状态。在一些简单的应用中,没有必要使用非特权接入 T h r e a d Thread Thread模式以及单独的 s h a d o w e d shadowed shadowed堆栈指针。 C o r t e x − M 0 Cortex-M0 Cortex−M0处理器不支持非特权接入 T h r e a d Thread Thread模式, C o r t e x − M 0 + Cortex-M0+ Cortex−M0+处理器可选。不同模式,接入水平以及状态的切换如图1所示。

和其它几乎所有处理器意一样, C o r t e x − M 3 Cortex-M3 Cortex−M3和 C o r t e x − M 4 Cortex-M4 Cortex−M4处理器在处理器内核中有一些寄存器用于数据处理和控制。这些处理器中的大部分都被聚合成一个叫做 R e g i s t e r B a n k Register\quad Bank RegisterBank的单位。每一条数据处理指令需要指明具体的操作,源寄存器和目的寄存器。在 A R M ARM ARM架构中,如果存储器中的数据需要被处理的话,它必须先被读取出来放到 R e g i s t e r B a n k Register\quad Bank RegisterBank里面的寄存器中,然后再处理器中进行处理,最后将处理完的数据再写会到存储器中原来的地方,这叫做 L a o d − S t o r e Laod-Store Laod−Store架构。有了 R e g i s t e r B a n k Register\quad Bank RegisterBank,一部分数据变量可以暂时存储在 R e g i s t e r B a n k Register\quad Bank RegisterBank中的寄存器中于此同时数据处理可以同时进行,这样就不用每次都去读去和写回到储存空间中。 C o r t e x − M 3 Cortex-M3 Cortex−M3和 C o r t e x − M 4 Cortex-M4 Cortex−M4处理器的 R e g i s t e r B a n k Register\quad Bank RegisterBank中一共有16个寄存器,它们中的13个是通用的32位寄存器,其它几个有特殊的用途,如图2所示。寄存器 R 0 R0 R0到 R 12 R12 R12是通用寄存器,寄存器 R 0 R0 R0到 R 7 R7 R7也被称为低寄存器,很多16位的指令只能接入这些寄存器,32位的指令和少部分的16位的指令可以计入寄存器 R 8 R8 R8到 R 12 R12 R12。寄存器 R 13 R13 R13是堆栈指针,可以有两个不同的堆栈指针,主堆栈指针 M a i n S t a c k P o i n t e r , M S P Main\quad Stack\quad Pointer,MSP MainStackPointer,MSP和进程堆栈指针 P r o c e s s S t a c k P o i n t e r , P S P Process\quad Stack\quad Pointer,PSP ProcessStackPointer,PSP。主堆栈指针是默认的堆栈指针,复位之后或者处于 H a n d l e r Handler Handler模式的时候都是使用的主堆栈指针,进程堆栈指针只能在 T h r e a d Thread Thread模式使用。堆栈指针的选择是通过 C O N T R O L CONTROL CONTROL这个特殊的寄存器来决定的。主堆栈指针 M a i n S t a c k P o i n t e r , M S P Main\quad Stack\quad Pointer,MSP MainStackPointer,MSP和进程堆栈指针 P r o c e s s S t a c k P o i n t e r , P S P Process\quad Stack\quad Pointer,PSP ProcessStackPointer,PSP都是32位的,它们的最低两个比特位的值都为0,这是因为堆栈的操作都是以字为单位的。在大部分情况下,如果没有嵌入式操作系统的需求的话,就没有必要用到进程堆栈指针。在有嵌入式操作系统的应用中操作系统核的堆栈和一般应用程序的堆栈是分开的。寄存器 R 14 R14 R14也被称为 L i n k R e g i s t e r Link\quad Register LinkRegister,当调用一个子函数的时候它用来存储返回地址(也就是这个子函数调用完成之后即将执行的下一个指令的地址)。当子程序调用结束的时候程序控制流可以重新回到调用函数这里,这是通过将程序计数器 P r o g r a m C o u n t e r , P C Program\quad Counter,PC ProgramCounter,PC的值赋值位当前 R 14 R14 R14寄存器的值来实现的。如果这个被调用的子函数又调用了其它的子函数,那么当前的这个 R 14 R14 R14寄存器里面的值必须被入栈保存,不然在嵌套调用第二个子函数的时候当前 R 14 R14 R14寄存器里面的值就被覆盖丢失了。比较特殊的是在进入中断函数之后 R 14 R14 R14寄存器里面的值就不是一般的返回地址了,而是一个特殊的值,再中断函数调用完的时候用这个值可以正确的找到下一条指令的地址。尽管在 C o r t e x − M Cortex-M Cortex−M处理器中返回地址的值都是偶数(比特0的值为0,指令被要求半字对齐), R 14 R14 R14寄存器的比特0位可读可写。一些分支和函数调用指令要求 R 14 R14 R14寄存器的比特0位的值为1来表示 T h u m b s t a t e Thumb\quad state Thumbstate。 R 15 R15 R15寄存器是程序计数器 P r o g r a m C o u n t e r , P C Program\quad Counter,PC ProgramCounter,PC

除了 R e g i s t e r B a n k Register\quad Bank RegisterBank里面的寄存器,还有一些特殊的寄存器,如图3所示。这些寄存器包含了处理器状态,操作状态以及中断屏蔽。在用 C C C语言这样的高级编程语言在开发简单应用的时候是不需要去访问这些特殊的寄存器的,但是在开发嵌入式操作系统以及高级中断屏蔽的时候就需要访问这些寄存器。这些寄存器是没有具体的存储空间映射地址的,要访问它们的话可以用特殊寄存器访问命令。 A P S R APSR APSR, E P S R EPSR EPSR和 I P S R IPSR IPSR这三个寄存器是程序状态寄存器,它们可以组合成一个寄存器 x P S R xPSR xPSR,各个比特位的含义如图5所示。



P R I M A S K PRIMASK PRIMASK, F A U L T M A S K FAULTMASK FAULTMASK和 B A S E P R I BASEPRI BASEPRI这三个寄存器用于中断屏蔽,这几个寄存器根据中断优先级来进行中断屏蔽的操作。这些寄存器只能在特权接入水平下进行接入。 P R I M A S K PRIMASK PRIMASK寄存器只有比特0有效,如果置1的话,所有的中断和异常(除了 N M I NMI NMI异常和 H a r d F a u l t HardFault HardFault异常)都会被屏蔽, F A U L T M A S K FAULTMASK FAULTMASK寄存器也只有比特0有效,如果置1的话,所有的中断和异常(除了 N M I NMI NMI异常)都会被屏蔽。寄存器 B A S E P R I BASEPRI BASEPRI的低8位的值表示中断或异常的优先级(注意这里不一定会用到8位,可能只用到8位中的几位,最低用到3位,这8个位在使用的时候优先使用高位),如果某个中断的优先级低于或等于这个优先级的值,那么这个中断或异常就会被屏蔽(注意:优先级的值越高,优先级越低)

C O N T R O L CONTROL CONTROL寄存器的比特位的定义如图6所示。它里面有和选择堆栈指针相关的比特位,它有配置接入水平相关的比特位,对于有单精度浮点单元的 C o r t e x − M 4 Cortex-M4 Cortex−M4处理器还有一个比特位用来指示当前的代码是否有使用浮点运算单元。各个比特位的含义如图7所示。

C O N T R O L CONTROL CONTROL寄存器只能在特权接入水平下进行修改,至于读的话特权接入水平和非特权接入水平都可以。复位之后 C O N T R O L CONTROL CONTROL寄存器的值为0,这意味着此时 T h r e a d Thread Thread模式下处于特权接入水平且使用主堆栈指针,此时可以切换到使用进程堆栈指针或者切换到非特权接入水平,但是一旦切换到非特权接入水平就不能再修改 C O N T R O L CONTROL CONTROL寄存器。一个处于非特权接入水平的程序不能将自己切换到特权接入水平,这是为了安全的需要。如果确实有需要修改的话只能先进入中断函数,然后在中断函数中修改为特权接入水平,中断函数返回之后就是处于特权接入水平的 T h r e a d Thread Thread模式了。如果有用到嵌入式操作系统的话,可以在上下文切换的时候去修改 C O N T R O L CONTROL CONTROL寄存器。在大部分不使用嵌入式操作系统的简单应用中,没有必要去修改 C O N T R O L CONTROL CONTROL寄存器的值,一直处于特权接入水平且使用主堆栈指针就够了。
C o r t e x − M 4 Cortex-M4 Cortex−M4处理器还有一个可选的单精度浮点运算单元,针对这个单元有相关的浮点数据处理,状态和控制寄存器,如图8所示。图8中 S 0 S0 S0到 S 31 S31 S31这32个32位的浮点数据处理寄存器中的每两个寄存器可以组合成一个64位的寄存器来访问,因此 S 0 S0 S0到 S 31 S31 S31这32个32位的浮点数据处理寄存器可以表示为16个64位的数据处理寄存器, D 0 D0 D0到 D 15 D15 D15。这里要明确一下 C o r t e x − M 4 Cortex-M4 Cortex−M4处理器的浮点运算单元只支持单精度运算(32位),不支持双精度计算(64位),即使两个32位的数据处理寄存器可以组合为一个64位的数据处理寄存器。

浮点运算单元的状态和控制寄存器 F P S C R FPSCR FPSCR的比特位布局如图9所示,各个比特位的含义如图10所示。 S C B SCB SCB模块中的 C P A C R CPACR CPACR寄存器中的某些位可以控制浮点单元功能的卡其与关闭,浮点单元默认是关闭的。


C o r t e x − M 3 Cortex-M3 Cortex−M3和 C o r t e x − M 4 Cortex-M4 Cortex−M4处理器有如下一些存储系统特征:
- 4 G B 4GB 4GB线性地址空间
- 架构定义的存储映射: 4 G B 4GB 4GB线性地址空间被划分为一些区域,这些区域是为提前定义的储存区域个外设准备的。 C o r t e x − M 3 Cortex-M3 Cortex−M3和 C o r t e x − M 4 Cortex-M4 Cortex−M4处理器有多个总线接口,这样就使得可以同时从代码区域中获取代码,与此同时从 S R A M SRAM SRAM或外设区域中进行数据操作。
- 可以设置使用大端或小端储存胡系统
- B i t B a n d Bit\quad Band BitBand接入(可选):
- W r i t e b u f f e r Write\quad buffer Writebuffer:如果向某个储存区域的写操作需要花费数个时钟周期的话,这样就会影响处理器的速度。可以先写入 W r i t e b u f f e r Write\quad buffer Writebuffer然后再转运到目的储存区域,这样就可以加快处理器的执行速度,因为写入 W r i t e b u f f e r Write\quad buffer Writebuffer之后处理器就可以不用管了。
- 存储保护单元, M e m o r y P r o t e c t i o n U n i t 存储保护单元,Memory\quad Protection\quad Unit 存储保护单元,MemoryProtectionUnit(可选):
- 非对齐数据传输:所有支持 A R M v 7 − M ARMv7-M ARMv7−M架构的处理器(包括 C o r t e x − M 3 Cortex-M3 Cortex−M3和 C o r t e x − M 4 Cortex-M4 Cortex−M4处理器)都支持非对齐数据传输。

C o r t e x − M Cortex-M Cortex−M处理器的 4 G B 4GB 4GB线性地址空间被划分为了多个区域,每个区域都有不同的用途,如图11所示。
边栏推荐
- UniApp scroll-view 事件不生效(@scroll、@scrolltolower、@scrolltoupper ...)
- 学会可视化大屏布局技巧,让领导都赞不绝口
- Week5
- sql中 exists的用法
- 一篇文章教你写扫雷(c语言基础版)
- ES 中时间日期类型 “yyyy-MM-dd HHmmss” 的完全避坑指南
- 单节点部署 gpmall 商城系统(一)
- empty() received an invalid combination of arguments - got (tuple, dtype=NoneType, device=NoneType),
- Embedding two implementations of the torch code
- Multi-Head-Attention原理及代码实现
猜你喜欢
随机推荐
MySQL的Replace用法详解
MySQL的on duplicate key update 的使用
volatile
微信小程序 - 监听 TabBar 切换点击事件
我的Go+语言初体验——祝福留言小系统,让她也可以感受到你的祝福
JS 预编译
npx 有什么作用跟意义?为什么要有 npx?什么场景使用?
MySQL之DQL——查询语言
Cesium加载离线地图和离线地形
sql优化常用的几种方法
MySQL的DATE_FORMAT()函数将Date转为字符串
ES6中 Symbol 的基础学习,迭代器和生成器的基本用法
pyspark df 二次排序
pyspark --- 空串替换为None
Chrome插件开发入门
unity 摄像机旋转拖拽缩放场景
Multi-Head-Attention原理及代码实现
Detailed explanation and reproduction of AlexNet network
10 common data types in MySQL
解决登录vCenter提示“当前网站安全证书不受信任“