计算机原理与应用 第二章——ARM处理器

第二章——ARM微处理器

一、ARM微处理器特点及功能结构

1.ARM微处理器主要特点

(1)ARM7系列采用冯诺依曼结构(输入输出、控制器、存储器、处理器),ARM9~11采用哈佛体系结构(存储器分为程序存储器和数据存储器)
(2)属于RISC型处理器结构(简单指令集),在简化处理器结构,减少复杂功能指令的同时,搞了处理器的速度。(这种是处理器简单,因为复杂指令由简单指令合成,所有编译器复杂)
(3)定义了多种处理器工作模式,提高了处理器工作效率
(4)具有ARM和Thumb两种处理器工作状态,可以很好地兼容8位、16位器件
(5)大量使用寄存器,大多数操作都在寄存器内完成
(6)具有灵活方便的接口

2.指令集方面的主要特点

(1)采用固定长度的指令格式
(2)只有LOAD和STORE指令存取内存,其他的操作都只能对寄存器中的操作数进行运算
(3)嵌入了在线仿真ICE-RT逻辑,省去了价格昂贵的在线仿真器
(4)低功耗,同时因为低功耗,更常用地应用在手持式嵌入式系统中

关于Thumb-2指令集
(1)Thumb-2中16位Thumb指令和32位ARM指令并存,处理器执行程序没有切换的额外开销,可节省执行时间和指令空间,代码密度更高,也就对存储器的需求更少。
(2)不需要将源码分成ARM和Thumb来编译,不需要花时间来切换于32位ARM状态和16位Thumb状态之间,无需反复求证和测试状态何时切换,程序效率高,易开发。这简化了软件开发和代码维护,使产品面市更快。
在这里插入图片描述 在这里插入图片描述

3.Cortex系列处理器特点

Cortex是基于ARMv7架构的最新的ARM处理器。

ARMv7架构定义了三大分工明确的系列:A——面向尖端性能好,R——针对实时系统,M——针对微控制器(简单)。(Cortex-M3和M4是应用较多的)
在这里插入图片描述
特点
在这里插入图片描述
①基于哈佛架构,取指令和数据访问可以同时进行
②使用三级流水线设计(取指、译码、执行)
32位寻址,可支持4GB存储器空间
④基于ARM AMBA计数的片上接口,支持高吞吐量的流水线总线操作
内嵌的嵌套向量中断控制负责中断处理,自动处理中断优先级、中断屏蔽、中断嵌套和系统异常处理。
⑥支持可选择的MPU,提供了存储器保护特性
⑦通过位段特性支持两个特定储存器区域中的位数据访问
⑧寄存器组和某些编程模式与经典ARM微处理器有所不同
⑨从经典ARM微处理器仅支持ARM Thumb指令,扩展到可同时支持16位和32位指令的Thumb-2版本。

关于Cortex-M4

①支持单指令多数据操作
②运算器操作数只能从寄存器输入/输出
③支持饱和运算指令,可以避免出现溢出时,计算结果产生大的畸变
④支持可选择的浮点指令——桶式位移器BS

桶式位移器BS:
是高速微处理器中的常用部件
能在单周期内完成多种方式、各种位数的移位操作。 
用于实现移位指令、浮点计算中的小数点对齐等。

在这里插入图片描述
(循环左移i位等价于右移 32-i 位)

4.ARM处理器功能结构

单片机(单片微型计算机),也称为微控制器,下面是微控制器组成示意图。

  • 处理器是微控制器的核心。除了处理器外,微控制器还需要有存储器、时钟生成和分配逻辑、系统总线以及外设等支撑模块。
  • 外设模块包括I/O接口单元、定时器、模数转换器ADC和数模转换器DAC等,这些外设模块可为检测、控制提供输入输出通道。
    在这里插入图片描述

微控制器的核心就是处理器。下面是Cortex-M3/M4微处理器的功能模块:(实线模块为必要的,虚线模块为可选)
在这里插入图片描述

(1)处理器顶层有多个总线接口:

  • I-CODE总线:指令总线,用来访问程序储存器获取指令
  • D-CODE总线:数据总线,用来访问程序储存器读取立即数,以及进行调试器访问操作
  • 系统总线:访问RAM和外设,以进行读写数据
  • 私有外设总线(PPB总线):使用先进结构协议来访问外设

(2)处理器内核

处理器内核主要涉及流水线操作、寄存器组和存储器接口,是实现RISC指令集的硬件架构基础。
(PC是程序计数器,指向被取指的指令,也就是正在译码的指令的下一条指令,是正在执行的指令的下两条指令)
在这里插入图片描述
(3)嵌套向量中断控制器是为低延迟实现异常处理处理提供了方便。

  • 主要有以下特征:
    • 可配置1~240个外部中断
    • 可配置优先级位数3~8位
    • 支持电平和脉冲(边沿)中断
    • 可以动态重新分配中断优先级
    • 优先级分组
    • 支持尾链中断
    • 进入中断时,处理器状态自动保存,退出中断时状态自动恢复,无额外指令开销

二、经典ARM处理器编程模型

编程模型——从开发者角度来看的处理器结构。编程模型涉及处理器的工作状态、工作模式、寄存器组等。

1.ARM处理器工作状态

ARM是32位微处理器,但是兼容16位指令集和数据类型。从编程角度,ARM微处理器有两种工作状态,在程序的执行中可以切换(ARM微处理器在开始执行代码时,应该处于ARM状态),切换不影响处理器的工作模式和相应寄存器中的内容:

  • ARM状态:处理器执行32位的ARM指令集,即执行字方式的ARM指令。
  • Thumb状态:处理器执行16位的Thumb指令集,即执行半字方式的ARM指令

ARM指令集有良好的执行效率,支持ARM体系架构的所有功能;而 Thumb指令集是ARM指令集的子集,具有良好的代码密度。Thumb指令低密度及在窄存储器时性能高的特点使得它在大多数基于C代码的系统中有非常广泛的应用。

只能使用ARM指令

  • 如果对于速度有比较高的要求,ARM指令在宽存储器中会提供更高的性能;
  • 某些功能只能由ARM指令来实现 ,比如:访问CPSR寄存器来使能/禁止中断或者改变处理器工作模式;访问协处理器CP15;执行C代码不支持的DSP算术指令;
  • 异常中断(Exception)处理。在进入异常中断后,内核自动切换到ARM状态。 即在异常中断处理程序入口的一些指令是ARM指令,然后根据需要程序可以切换到Thumb状态,在异常中断处理程序返回前,程序再切换到ARM状态。
  • ARM处理器总是从ARM状态开始执行 。因而,如果要在调试器中运行Thumb程序,必须为该Thumb程序添加一个ARM程序头,然后再切换到Thumb状态,调用该Thumb程序。

切换
Thumb—ARM

  • BX Rn(操作数寄存器Rm的状态位bit[0]为0
  • 如果处理器进行异常处理,在此情况下,把PC放入异常模式链接寄存器LR中,从异常向量地址开始执行也可以进入ARM状态

ARM—Thumb

  • BX Rn(操作数寄存器Rm的状态位bit[0]为1
  • 如果处理器在Thumb状态进入异常,则当异常处理返回时,自动切换到Thumb状态。
CODE32 //ARM状态下的代码
LDR R0, =Into_Thumb+1//产生跳转地址并且设置最低位
BX R0//Branch Exchange 进入Thumb状态
…
CODE16 //Thumb状态下的子函数
…
LDR R3, =Back_to_ARM//产生字对齐的跳转地址,最低位被清除
BX R3//Branch Exchange 返回到ARM状态
…
CODE32 //ARM状态下的子函数

2.ARM处理器工作模式

在这里插入图片描述

处理器模式何时为该模式应用和注意重点
用户模式(User,usr)正常的程序执行模式,大部分任务执行在这种模式下它运行在操作系统的用户状态,它没有权限去操作其它硬件资源,只能执行处理自己的数据,也不能切换到其它模式下,要想访问硬件资源或切换到其它模式只能通过软中断或产生异常。用户程序的工作模式
快速中断模式(FIQ,fiq)用于比较紧急的中断处理。即当一个高优先级中断请求产生时进入这种模式一般用于高速数据传输或通道处理紧急中断模式
外部中断模式(IRQ,irq)用于通常的、一般的中断处理。即当一个低优先级中断请求产生时进入这种模式通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统硬件资源。普通中断模式
管理模式(Supervisor,sve)复位或软中断指令执行时进入这种模式在该模式下主要用来做系统的初始化,软中断处理也在该模式下,当用户模式下的用户程序请求使用硬件资源时通过软件中断进入该模式。操作系统使用的保护模式CPU上电后默认模式
数据访问中止模式(Abort,abt)存取数据异常时进入这种模式,更细节地说,就是当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式常用于虚拟存储及存储保护,linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的。
未定义指令中止模式(Undefined,und)执行未定义指令时进入这种模式,即CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式可用于支持硬件协处理器的软件仿真
系统模式(System,sys)运行具有特权级的操作系统任务的工作模式用户模式和系统模式共用一套寄存器,操作系统在该模式下可以方便的访问用户模式的寄存器,但不受用户模式的限制,可以使用这个模式访问一些受控的资源。。而该模式需要避免使用与异常模式有关的附加寄存器,以保证在任何异常出现时,都不会使任务的状态不可靠。

关于切换
当需要切换运行模式时,应用程序可以产生异常中断,在异常处理过程中切换运行模式,这种体系结构可使操作系统控制整个系统的资源。当应用程序产生异常中断时,处理器进入相应的异常模式,在每一种异常模式中都有一组寄存器,供相应的异常处理程序使用,这样就保证了在进入异常模式时不会破坏用户模式下的寄存器。ARM在任何一种运行模式下,可访问的寄存器包括15个通用寄存器(R0-R14)、1~2个状态寄存器和程序计数器PC。

3.数据类型和存储格式

数据类型

ARM微处理器中支持字节(8位)、半字(16位)、字(32位)三种数据类型.。

数据类型ARM处理器体系结构中8/16位处理器体系结构中对齐(为保证数据读写的正确进行)
字节8位8位没有要求,最低为可以是0或1
半字16位16位“半字对齐”或“2字节对齐”:要求数据地址的低一位是0
32位16位“字对齐”或“4字节对齐”:要求数据地址的低两位是00
  • 对存储器进行数据读写操作时,可以按字节,也可以按半字、字进行。按照不同方式读写时,要遵守不同的对齐方式。
  • 所有的数据操作(如ADD)都是以字为单位的。
    在这里插入图片描述
    存储格式
  • ARM体系结构具有32位地址线,所支持的最大寻址空间为4GB(2^32字节)
  • ARM体系结构将存储器看成是以字节为单位的线性组合,存储单元地址从0x00000000开始编址。字节0到3保存第1个存储的字数据,字节4到7保存第2个存储的字数据,依此类推。每个字数据占4个字节单元,每个半字数据占2个字节单元。
  • ARM可按 大端格式(高位放到低地址,低位放到高地址)和小端格式(高位放到高地址,低位放到低地址) 两种方式存储字数据。
  • 在ARM指令集中不包含任何直接选择大小端的指令(butPPT里后面又说“可以使用指令来完成端模式的转换”),一个同时支持大小端模式的ARM芯片可以通过硬件配置(一般使用芯片的引脚来配置)来匹配存储器系统所使用的规则。一个基于ARM内核的芯片可以只支持大端模式或小端模式,也可以两者都支持。
  • 必须使用小端模式:小端模式是ARM处理器的默认模式,指令预取必须使用小端模式,在配置控制存储空间的访问时也必须使用小端模式,外部私有总线地址区0xE0000000 至0xE00FFFFF 也必须使用小端模式。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    (注意,对于地址来说,左边是高位,即0x12是高位,0x78是低位;对于地址来说,相当于是一个“栈”,0x00000000是低位,0x00000003是高位)

4.ARM处理器的寄存器

寄存器是CPU内部用来暂时存放参与运算的数据和运算结果的小型存储区域。 寄存器本身是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由N个锁存器或触发器构成的。 寄存器是CPU的组成部分之一,是有限存储容量的高速存储部件,所以数据在寄存器之间的传送速度是非常快的。

ARM寄存器划分为两大类:通用寄存器和状态寄存器
通用寄存器:用于保存数据和地址
状态寄存器:用来标识CPU的工作状态和程序的运行状态。
经典ARM处理器中,共有37个 32位寄存器,其中有31个通用寄存器6个状态寄存器

这些寄存器不能同时访问,具体哪些寄存器可以编程访问取决于处理器的工作状态和具体的运行模式。ARM状态下的寄存器组织如下图:
可以看到31个通用寄存器为下表格中R0-15(16个)、R8_fiq-R14_fiq(7个)、R13_svc、R13_abt…R14_svc、R14_abt…(8个)。
6个状态寄存器为下表格中CPSR、SPSR_svc、SPSR_abt、SPSR_und、SPSR_irq、SPSR_fiq(6个)
在这里插入图片描述

通用寄存器

  • 未分组寄存器R0-R7:在所有运行模式下,这些未分组寄存器都指向各自对应的同一个32位的物理寄存器,他们未被系统用作特殊的用途,因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的32位物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。

  • 分组寄存器R8-R14:对于分组寄存器,他们每一次所访问的物理寄存器与处理器当前的运行模式有关。(几乎所有允许使用通用寄存器的指令都允许使用分组寄存器

    • R8-R12对应2个不同的物理寄存器,一个是通用(除了FIQ模式)的寄存器RX,一个是用于快速中断模式(FIQ模式)的寄存器RX_fiq。
    • R13、R14每个寄存器对应6种不同的物理寄存器,如R13,其中一个是用户模式与系统模式共有(usr和sys)的R13,另外5个物理寄存器对应于其他5种不同的运行模式。采用以下记号来区分:R13_(mode为svc、abt、und、irq、fiq)
  • 程序计时器R15(PC,Program counter)。在ARM状态下,位[1:0]为0,位[31:2]用于保存PC;在Thumb状态下,位[0]为0,位[31:1]用于保存PC。
    上面也提到过,由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节(ARM状态下一条指令为4个字节,即32位)。
    同时,需要注意:R15虽然也可用作通用寄存器,但一般不这么使用,因为对R15的使用有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。

关于R13 的使用——堆栈指针(SP):寄存器R13在ARM指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针,而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。

关于R14的使用——链接寄存器(LR):寄存器R14也称作子程序链接寄存器(Subroutine Link Register)或链接寄存器LR。最重要的其有两个特殊功能:

  • ①每种模式下,其作为R15(PC)的备份。
    在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前值拷贝给R14,执行完子程序后,又将R14的值拷贝回PC,即可完成子程序的调用返回,如下图:
    在这里插入图片描述
  • ②发生中断或异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。其他情况下,R14用作通用寄存器。异常发生时,程序要跳转至异常服务程序,对返回地址的处理与子程序调用类似,都是由硬件完成的。区别在于有些异常有一个小常量的偏移。

R14寄存器注意要点

  • 当发生异常嵌套时,这些异常之间可能会发生冲突。例如:如果用户在用户模式下执行程序时发生了IRQ中断,用户模式寄存器不会被破坏。但是如果允许在IRQ模式下的中断处理程序重新使能IRQ中断,并且发生了嵌套的IRQ中断时,外部中断处理程序保存在R14_irq中的任何值都将被嵌套中断的返回地址所覆盖。
  • 解决办法是确保R14的对应版本在发生中断嵌套时不再保存任何有意义的值(将R14入栈),或者切换到其它处理器模式下。

状态寄存器:

  • CPSR
  • SPSR

5.ARM处理器的I/0组织

(1)CPU和外部设备之间通过I/O接口通信

I/O端口物理地址的编址方式有两种,如下表:

编址方式细节优缺点应用
独立编址方式(I/O映射方式)I/O端口地址与内存单元地址分开独立编址端口地址不占用内存空间的地址范围,但需要有专门的输入/输出(I/O)指令和控制逻辑X86
统一编址方式(内存映射方式)I/O端口与内存单元同样对待,每个端口占用一个存储单元地址,将内存的一部分划出来用作I/O地址空间。端口占用内存地址空间的地址范围,使内存容量减小ARM、PowerPC

(2)ARM 存储器映射的I/O组织
ARM处理器采用存储器映射I/O完成I/O功能。基于ARM内核的芯片具有许多外设,这些外设访问的标准方法是使用存储器映射的I/O,为每个端口寄存器都分配一个地址。

使用特定的存储器地址,当从这些地址加载或向这些地址存储时,提供I/O功能。
输入:从存储器映射I/O地址加载
输出:向存储器映射I/O地址存储

三、Cortex-M4处理器

Cortex-M4微处理器与经典ARM微处理器的体系结构完全不同,其寄存器组和某些编程模式与经典ARM微处理器也有所不同。

1.工作状态和模式

两种工作状态

  • 调试状态:由于某种原因使处理器被暂停后,就进入调试状态并停止指令的执行。原因可以是调试事件或触发断点等。
    • 可以通过两种方式进入调试状态: 1、调试器发起的暂停请求;2、处理器中的调试部件产生的调试事件。在此状态下,调试器可以访问或修改处理器寄存器的数值。无论在 Thumb状态还是调试状态,调试器都可以访问处理器内外的外设等系统存储器。
  • Thumb状态:是ARM7版本的ARM处理器所具有的新的状态。当处理器执行程序代码(Thumb指令)时,就处于Thumb状态。

两种工作模式

  • 线程模式(thread mode):在复位或异常返回时处理器进入该模式。处于该模式时,既可以使用特权级代码也可以使用用户级(非特权)代码。

    • 通过软件可以将处理器从特权线程模式切换到非特权线程模式,但是无法从非特权切换到特权模式。如果要进行这种切换的话,处理器需要借助于异常机制。(下面再解释这句话)
  • 处理模式(handle mode):出现异常时处理器进入“处理模式”,执行中断服务程序等异常处理。在处理模式下,所有代码都是特权访问的。

     特权级别:
     CM4处理器具有存储器访问的保护机制,它使得普通用户程序代码不能意外地或恶意地执行涉及要害的操作。
     特权级别,即提供一种存储器访问的保护机制。
      - 特权级:程序可以访问所有存储器空间,执行所有命令。
      - 用户级:资源访问受限,或不允许访问。
    

在这里插入图片描述
解释:
微处理器启动时,默认处于特权线程模式,Thumb状态
——在该状态下,会有处理模式、非特权线程模式、特权线程模式的转换。与上面的总结相同,出现异常则进入处理模式,复位或异常返回时则进入线程模式
——而通过软件,可以“直接”的从特权线程模式转换到非特权线程模式,而不能反过来。但是通过异常机制(即线程模式返回时控制选择其一),则可以完成两者的“间接”的互相转换。(下面还会详细介绍)
——以上都是Thumb状态,若有调试事件或请求,通过调试器控制,可以进行调试状态(此时没有工作模式)

2.寄存器组织

Cortex-M4处理器在处理器内核中有16个32位寄存器组成的通用寄存器组以及几个特殊功能寄存器
8在这里插入图片描述
通用寄存器

  • R0~R7 (低寄存器):可以被大多数 16-bit Thumb 指令和所有 32-bit Thumb-2 指令访问。(复位后的初始值是未定义的)
  • R8~R12 (高寄存器):可以被所有 Thumb-2 指令和少数 16-bit Thumb指令访问。(复位后的初始值是未定义的)
  • R13:堆栈指针(SP):R13是堆栈指针,实际上有两个物理寄存器,分别对应于主堆栈指针(MSP)和进程堆栈指针(PSP),因此系统可以同时支持两个堆栈。但是两个堆栈指针在同一时间只有一个可见。(采用字对齐,即地址总是对齐到4字节边界上,SP的最低两位也总是为0)
    • 主堆栈指针(MSP) : 默认的堆栈指针。复位后(就是线程模式)或处理器处于处理模式时都可以使用,应用于系统内核、异常、特权访问的代码。
    • 进程堆栈指针(PSP) : 只能在线程模式使用,是用于用户任务的应用堆栈指针。(没有操作系统OS的简单应用,线程模式和处理模式可只使用MSP
      在这里插入图片描述
    • 栈指针的选择由特殊寄存器 CONTROL决定(后面讲特殊功能寄存器时还会仔细解释)
    • PSP的初始值未定义,MSP的初始值则需要在复位流程中从存储器的第一个字中取出(后面讲复位流程时还会仔细解释)
  • R14:链接寄存器(LR):当子程序或函数被调用时,LR用来保存返回的地址。LR也用于异常返回,但是在这里保存的是返回后的状态,不是返回的地址(ARM处理器中就是返回的地址),异常返回是通过硬件自动出栈弹出之前压入的PC完成的。异常返回的地址在堆栈里。
  • R15:程序计数器(PC):程序计数器PC。指向“正在取指”的指令,是可读写的。读操作返回的是当前指令地址+4;与ARM三级流水线相同,正在取指的指令地址是PC,那么正在译码的指令地址就是PC-4,正在执行的指令地址是PC-8;写PC会引起程序的跳转操作。可以在汇编语言中通过R15或PC访问。

特殊功能寄存器

  • 1.程序状态寄存器 (PSR/xPSR,Program state register):表示处理器的状态。

    程序状态寄存器可以分为三个状态寄存器:程序状态寄存器 (PSR)、中断屏蔽寄存器(PRIMASK, FAULTMASK, BASEPRI)、控制寄存器 (CONTROL)。这三个寄存器一起组合构成一个32位的寄存器,统称为xPSR或PSR。可用xPSR或PSR统一访问,也可以单独访问。
    在这里插入图片描述

    • (1)应用状态寄存器 (APSR):保存当前指令运算结果的状态。(下图中GE是19:16位)
      在这里插入图片描述

    • (2)中断状态寄存器 (IPSR):保存当前中断的向量号,表示处理器正在处理的异常。(这在后面异常处理中会详细解释)
      在这里插入图片描述

    • (3)执行状态寄存器(EPSR) :① ICI / IT状态位;②T标志位。
      在这里插入图片描述

      • ICI / IT状态位:多寄存器加载(LDM)和存储(STM)和If-then指令,为多周期指令,如果在执行以上多周期指令时发生异常,处理器会暂时停止以上指令的操作,进入异常,这时需要保护现场。
        • LDM、STM发生异常时,则LDM或STM操作暂停,EPSR 使用位[15:12]来保存该操作中下一个寄存器操作数的编号。在中断响应之后,处理器返回由[15:12]指向的寄存器并恢复操作。
        • if-then指令发生时,把该指令的执行状态位(if-then模块的指令数目和他们的执行条件)存在IT中。
        • 可以看到,ICI区又可以叫做可中断-可继续指令区。但是因为ICI区和IT区是重叠的,因此If-Then模块内的多寄存器加载或存储操作不具有可中断-可继续功能。
      • T标志位:用于指示处理器当前是ARM状态还是Thumb状态。由于Cortex M4仅支持Thumb指令,所以T位一直为1。操作EPSR寄存器时必须注意,不能清零T位,否则会引起INVSTATE异常。
      • ESPR访问:不能直接访问EPSR,若想修改EPSR必须发生以下两个事件之一
        • 在执行LDM或STM指令时产生一次中断(如果出现LDM/STM错误或LDM/STM指令位于IT内,LDM/STM操作重新开始而不是继续执行)
        • 执行If-Then指令
  • 2.中断屏蔽寄存器(PRIMASK, FAULTMASK, and BASEPRI):用于控制异常或中断的使能和禁止。

寄存器名综述描述
PRIMASK1-bit 寄存器,片上外设中断总开关1:仅允许不可屏蔽中断(NMI) 和硬件默认异常(HardFault),所有其他中断和异常将被屏蔽;0:开放中断,默认为0
FAULTMASK1-bit 寄存器,异常屏蔽寄存器,相当于异常的总开关1:仅允许NMI, 所有中断和默认异常处理包括硬件异常被忽略。
BASEPRI9-bit寄存器。它定义了屏蔽优先级。当设置为某值时, 所有大于或等于该值的中断被屏蔽(例如,把BASEPRI设置为2,则2 和2以上优先级的中断都被屏蔽,只有0和1优先级的中断不会被屏蔽)(值越大,优先级越低)。全为0(默认值):不屏蔽任何中断(注意,这里不是0以上都屏蔽,而是全都不屏蔽)。
  • 3.控制寄存器 (CONTROL):定义线程模式的访问级别和选择堆栈指针
    控制寄存器用寄存器中的两位,①低位用来定义特权级,②第二位用来堆栈指针的选择。
功能
CONTROL[0] 定义特权级别0=特权级的线程模式 ,1=用户级的线程模式。
CONTROL[1] 选择堆栈指针0=(复位后缺省值)只使用MSP,此时用户程序和异常共享同一个堆栈,1=选择进程堆栈指针PSP,在线程或基础级(没有在响应异常),可以使用PSP。在handler模式下,只允许使用MSP,所以此时不得往该位写1。
  • 关于特权级:

    • 往上翻,Thumb状态下的handler (处理)模式永远都是特权级的,线程模式是有特权级也有非特权级。
    • 上面也提到,“通过软件可以将处理器从特权线程模式切换到非特权线程模式,但是无法从非特权切换到特权模式。如果要进行这种切换的话,处理器需要借助于异常机制”。这句话的理解是——通过软件,即通过写Control register[0]=1,软件在特权访问级别可以使程序转换到用户访问级别。但是用户程序不能够通过写控制寄存器直接变回特权状态。它要经过一个异常处理程序设置Control register[0]=0使得处理器切换回特权访问级别,该程序如下:
      在这里插入图片描述
      即首先默认是特权级线程模式,此时control[0]=0,如果写入使control[0]=1,则进入用户级线程模式。
      而要从用户级到特权级,首先要发生异常/中断,则进入了处理模式,然后处理完之后可以选择进入用户级线程模式,也可以选择进入特权级(这个选择有异常返回(EXC_RETURN)的数值决定,处理器硬件会相应地自动更新control[1]的值),如进入特权级,则实现了用户级-特权级的转换。
  • 关于堆栈指针

    • MSP(主堆栈指针)和PSP(进程堆栈指针)在同一时间是只有一个可见的。
    • 这种双堆栈机制适合在带有OS的环境下使用,OS内核在特权级下执行,而用户程序在用户模式下执行,这样可以将代码隔离,互不影响。没有操作系统OS的简单应用,线程模式和处理模式可只使用MSP
      在这里插入图片描述

3.存储器组织

Cortex-M4存储器系统特性

  • 4GB地址空间,利用32位寻址
  • 存储器映射。存储器映射是预定义的,4GB的存储器空间被划分为多个区域,并且规定好了哪个位置使用哪条总线。
  • 支持小端和大端的存储器系统。但实际的微控制器产品一般被设计成只具有一种端配置。
  • 位段访问(可选)。当包含位段特性时,存储器映射中的两个1MB区域可以通过两个位段区域进行位寻址,实现对SRAM或外设地址空间中单独位的原子操作。
  • 存储器保护单元(MPU)。MPU定义了各存储器区域的访问权限,并且是可编程的。
  • 非对齐传输支持。Cortex-M4处理器支持非对齐传输

存储器层次结构
层次结构分为内核、芯片级、板卡级、外设级。
在这里插入图片描述
【TCM(TCM: Tightly Coupled Memories):紧耦合内存,TCM是一个固定大小的RAM,紧密地耦合至处理器内核,提供与cache相当的性能,相比于cache的优势是,程序代码可以精确地控制什么函数或代码放在哪儿(RAM里)。】

存储器映射

  • Cortex-M4 处理器32位寻址,可寻址存储空间为4GB,无须将存储器分页。地址空间被划分为多个存储器区域,各款区域根据各自典型用法进行划分,这些区域主要用于:
    • 程序代码访问(如CODE区域)
    • 数据访问(如SRAM区域)
    • 外设(如外设区域)
    • 处理器的内部控制和调试部件(如私有外设总线)

在这里插入图片描述
从下至上依次是:

名称区域功能总线
代码(Code)段0x0000 0000-0x1FFF FFFF用于存放指令或数据,主要用于程序代码,也用于异常向量表通过ICode总线取指令,通过DCode总线读、写数据
片上SRAM段0x2000 0000-0x3FFF FFFF可以存放指令或数据,主要用于数据存储器通过系统总线取指令或读写数据
片上外设段0x4000 0000-0x5FFF FFFF主要用于片上外设的输入/输出接口通过系统总线进行访问
外部RAM0x6000 0000-0x9FFF FFFF主要用于扩展外部存储器通过系统总线进行访问
片外外设段0xA000 0000-0xDFFF FFFF主要用于扩展片外外设的输入/输出接口通过系统总线进行访问
私有外设区内部:0xE000 0000-0xE003 FFFF 外部:0xE004 0000-0xE00F FFFF分配给包括内置的中断控制器和调试部件在内的私有外设等使用通过私有外设总线访问
系统段0xE010 0000-0xFFFF FFFF分配给芯片厂商使用
  • 一些存储单元被分配给了私有外设区,比如调试组件。私有外设区的组件包括:闪存地址重载及断点单元(FPB),数据观察点单元(DWT),指令跟踪宏单元(ITM),嵌入式跟踪宏单元(ETM),跟踪端口接口单元(TPIU),ROM 表

  • 区域的划分使存储系统的使用具有很大的灵活性。例如,程序既可以在CODE区域执行,也可以在SRAM区域执行

  • 所有Cortex –M的设备都做同样的设计,这样可以提高不同 Cortex-M设备间的软件可移植性和代码的可重用性。

  • 位段操作(Bit-Band操作)
    Cortex-M3/M4支持位带操作,使用普通加载/存储指令来对单一的比特进行读写。在CM4中,有两个区中实现了位带:SRAM 区的最低1MB 范围(0x2000 0000-0x2010 0000)和片上外设区的最低1MB 范围(0x4000 0000-0x4010 0000)。这两个区中的地址除了可以像普通的RAM 一样使用外,它们还都有自己的“位带别名区” 。(见上图),它们可以通过一个单独的被称为bit-band alias的存储区域被访问。

栈内存操作

堆栈:是一个按照后进先出原则组织的一个内存区域。任何处理器中都会采用堆栈机制临时存放数据、变量等。

堆栈的作用

  1. 临时存储寄存器(寄存器组中)中的数据。
  2. 用于向函数或子程序中传递参数。
  3. 用于存储局部变量。
  4. 当中断等异常产生时用于保存处理器状态和寄存器数值。

Cortex-M4处理器使用的是 “满递减”栈:堆栈指针指向栈顶元素,且堆栈由高地址向低地址方向增长。(注意,这里的堆栈指针就是之前介绍的“Cortex-M4 处理器有主堆栈指针 (MSP) 和进程堆栈指针(PSP)两个堆栈指针,由Control [1]控制”)

过程:
寄存器中的数据可以通过PUSH操作保存到栈内存并且通过POP操作再恢复到寄存器。PUSH和POP指令时都会传输至少一个字(4字节)的数据,而且地址总是对齐到4字节边界上,SP的最低两位也总是为0(字对齐)。
第一个是入栈PUSH:执行PUSH指令时,堆栈指针SP的值将自减(入栈,指针地址减小),处理器首先减小堆栈指针的值,然后将数据存储在堆栈指针所指的存储器位置;
第二个是出栈POP:执行POP指令时,堆栈指针SP的值将自增(出栈,指针地址增加)。堆栈指针指向的存储器位置的数据被读出,然后堆栈指针的值自动增加。
在这里插入图片描述

4.异常和中断

异常(exception):当处理器的内核产生复位、存取失败、遇到未定义指令时,正常执行的程序被暂停,转到相应的处理程序执行称之为异常。每个异常对应一个异常处理程序。
异常程序执行完后,返回当前程序继续执行。CM4允许多个异常同时发生,并按固定的优先级进行处理
中断(interrupt):当处理器内核的外部发生某一事件,产生触发信号,引起CPU暂停当前执行的程序,转去执行处理相应事件的程序,执行完毕后返回。

异常与中断的区别:中断对处理器内核来讲是意外突发事件,请求信号来自外部;异常是处理器内核产生的,即在执行指令或存取中产生的。中断可看成是异常的一种。

嵌套向量中断控制器NVIC
嵌套向量中断控制器(NVIC)处理处理器中的异常。具体包括:处理异常和中断配置、优先级以及中断屏蔽。
NVIC 在处理器内部 ,其寄存器位于存储器映射的系统控制空间(SCS)处。 NVIC是可编程的
在这里插入图片描述 在这里插入图片描述

异常向量表
当异常产生并且被处理器内核接受后,处理器将执行异常处理程序,这时就需要知道异常处理程序的起始地
址,解决该问题的方法是使用异常向量表。
在这里插入图片描述

  • 异常向量表是系统RAM或者系统ROM的一个区域(代码区)。向量表的大小取决于CPU支持的异常类型和数量。
  • 当一个发生的异常被CM4 内核接受,对应的异常handler 就会执行。为了决定handler 的入口地址,CM4 使用“向量表查表机制”。
  • Cortex-M4处理器向量表中的每个元素代表一个异常类型处理程序的起始地址,每个起始地址占一个字,即4个字节。向量表的存储位置是可以设置的,通过NVIC 中的一个重定位寄存器来指出向量表的地址。复位后,重定位寄存器的值默认为0,向量表则位于地址0x0 处,用于初始时的异常分配。
  • Cortex‐M4 支持大量异常,包括11 个系统异常,和最多240 个外部中断,简称IRQ。具体使用这240 个中断源中的多少个,则由芯片制造商决定。(但是上图里,0x00-0x3C的16个异常时“系统异常”,其他0x30-0x3FF是外部中断)
  • 由外设产生的中断信号,除了SysTick 之外,全都连接到NVIC 的中断输入信号线

5.复位和复位流程:

复位种类上电复位、掉电复位、复位引脚复位(比如电脑重启键)、看门狗复位、软件复位(对于嵌入式系统来讲,有内核复位和系统复位,内核复位是指只复位处理器,而不复位如GPIO、TIM、USART、SPI等的外设寄存器。系统复位是既复位处理器,又复位外设寄存器。)。

对于Cortex-M4处理器,复位类型有三种:

  • 上电复位。复位微控制器中的所有部分,包括处理器、调试支持部件和外设等。
  • 系统复位。只会复位处理器和外设,不包括处理器的调试支持部件。
  • 处理器复位。只复位处理器。

复位流程

在处理器复位后开始执行程序之前,它会从存储器中读取两个字:
从地址 0x0000 0000 处读取MSP的初始值。
从地址 0x0000 0004 处读取复位处理起始地址的复位向量,LSB (最低有效位)必须是1。

因M4中的栈操作是基于满递减的,所以堆栈指针SP的初始值应该设置在栈顶的位置。即MSP的初始值必须是堆栈内存的末地址加1。(例:如果堆栈区域在0x20007C00‐0x20007FFF之间,则MSP 的初始值需要设置为0x20008000)

使用:
读取两个指令后,就会将这些数值赋给MSP和程序计数器PC,根据PC取值取第一条指令(复位向量),然后程序开始执行复位程序,之后就进入到正常操作。
在这里插入图片描述
在这里插入图片描述
要注意:
因为 CM4 是在Thumb 态下执行,所以向量表中的每个数值都必须把最低位置1。正是因为这个原因,图中使用 0x101 来表达地址 0x100(复位向量为0x101)。当 0x100 处的指令得到执行后,就正式开始了程序的执行。

在此之前初始化 MSP 是必需的(即刚开始取了MSP初始地址的原因),因为可能第1条指令还没来得及执行,就发生了 NMI 或是其它 fault。MSP 初始化好后就已经为它们的服务例程准备好了堆栈。

四、简答题

  1. 什么是嵌入式系统?有何特点?
    • 技术角度定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
    • 系统角度定义:嵌入式系统是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。术语嵌入式反映了这些系统通常是更大系统中的一个完整的部分,称为嵌入的系统。嵌入的系统中可以共存多个嵌入式系统
    在这里插入图片描述

  2. 简述MCU与CPU的异同。
    MCU(单片机)里面含有CPU,CPU是MCU的一部分。具体的,处理器是微控制器的核心。除了处理器外,MCU还有存储器、时钟生成和分配逻辑、系统总线以及外设等模块。外设模块包括I/O接口单元、定时器、ADC、DAC等。

  3. 经典的ARM处理器工作状态和模式有哪些?Cortex M4处理器工作状态和模式有哪些?
    经典:包括ARM和Thumb两种状态;用户模式(User,usr)、快速中断模式(FIQ,fiq)、外部中断模式(IRQ,irq)、管理模式(Supervisor,sve)、数据访问中止模式(Abort,abt)、未定义指令中止模式(Undefined,und)、系统模式(System,sys)7种模式。

CM4:包括调试和Thumb两种状态;线程模式(Thread Mode)和处理模式(Handler Mode)两种模式

  • 18
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值