(1)ARM7系列采用冯诺依曼结构(输入输出、控制器、存储器、处理器),ARM9~11采用哈佛体系结构(存储器分为程序存储器和数据存储器)
(2)属于RISC型处理器结构(简单指令集),在简化处理器结构,减少复杂功能指令的同时,搞了处理器的速度。(这种是处理器简单,因为复杂指令由简单指令合成,所有编译器复杂)
(3)定义了多种处理器工作模式,提高了处理器工作效率
(4)具有ARM和Thumb两种处理器工作状态,可以很好地兼容8位、16位器件
(5)大量使用寄存器,大多数操作都在寄存器内完成
(6)具有灵活方便的接口
(1)采用固定长度的指令格式
(2)只有LOAD和STORE指令存取内存,其他的操作都只能对寄存器中的操作数进行运算
(3)嵌入了在线仿真ICE-RT逻辑,省去了价格昂贵的在线仿真器
(4)低功耗,同时因为低功耗,更常用地应用在手持式嵌入式系统中
关于Thumb-2指令集:
(1)Thumb-2中16位Thumb指令和32位ARM指令并存,处理器执行程序没有切换的额外开销,可节省执行时间和指令空间,代码密度更高,也就对存储器的需求更少。
(2)不需要将源码分成ARM和Thumb来编译,不需要花时间来切换于32位ARM状态和16位Thumb状态之间,无需反复求证和测试状态何时切换,程序效率高,易开发。这简化了软件开发和代码维护,使产品面市更快。
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:
是高速微处理器中的常用部件
能在单周期内完成多种方式、各种位数的移位操作。
用于实现移位指令、浮点计算中的小数点对齐等。
单片机(单片微型计算机),也称为微控制器,下面是微控制器组成示意图。
微控制器的核心就是处理器。下面是Cortex-M3/M4微处理器的功能模块:(实线模块为必要的,虚线模块为可选)
(1)处理器顶层有多个总线接口:
(2)处理器内核
处理器内核主要涉及流水线操作、寄存器组和存储器接口,是实现RISC指令集的硬件架构基础。
(PC是程序计数器,指向被取指的指令,也就是正在译码的指令的下一条指令,是正在执行的指令的下两条指令)
(3)嵌套向量中断控制器是为低延迟实现异常处理处理提供了方便。
编程模型——从开发者角度来看的处理器结构。编程模型涉及处理器的工作状态、工作模式、寄存器组等。
ARM是32位微处理器,但是兼容16位指令集和数据类型。从编程角度,ARM微处理器有两种工作状态,在程序的执行中可以切换(ARM微处理器在开始执行代码时,应该处于ARM状态),切换不影响处理器的工作模式和相应寄存器中的内容:
ARM指令集有良好的执行效率,支持ARM体系架构的所有功能;而 Thumb指令集是ARM指令集的子集,具有良好的代码密度。Thumb指令低密度及在窄存储器时性能高的特点使得它在大多数基于C代码的系统中有非常广泛的应用。
只能使用ARM指令:
切换:
Thumb—ARM:
ARM—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状态下的子函数
…
处理器模式 | 何时为该模式 | 应用和注意 | 重点 |
---|---|---|---|
用户模式(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。
数据类型:
ARM微处理器中支持字节(8位)、半字(16位)、字(32位)三种数据类型.。
数据类型 | ARM处理器体系结构中 | 8/16位处理器体系结构中 | 对齐(为保证数据读写的正确进行) |
---|---|---|---|
字节 | 8位 | 8位 | 没有要求,最低为可以是0或1 |
半字 | 16位 | 16位 | “半字对齐”或“2字节对齐”:要求数据地址的低一位是0 |
字 | 32位 | 16位 | “字对齐”或“4字节对齐”:要求数据地址的低两位是00 |
寄存器是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:对于分组寄存器,他们每一次所访问的物理寄存器与处理器当前的运行模式有关。(几乎所有允许使用通用寄存器的指令都允许使用分组寄存器)
程序计时器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。最重要的其有两个特殊功能:
R14寄存器注意要点:
状态寄存器:
(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微处理器与经典ARM微处理器的体系结构完全不同,其寄存器组和某些编程模式与经典ARM微处理器也有所不同。
两种工作状态:
两种工作模式:
线程模式(thread mode):在复位或异常返回时处理器进入该模式。处于该模式时,既可以使用特权级代码也可以使用用户级(非特权)代码。
处理模式(handle mode):出现异常时处理器进入“处理模式”,执行中断服务程序等异常处理。在处理模式下,所有代码都是特权访问的。
特权级别:
CM4处理器具有存储器访问的保护机制,它使得普通用户程序代码不能意外地或恶意地执行涉及要害的操作。
特权级别,即提供一种存储器访问的保护机制。
- 特权级:程序可以访问所有存储器空间,执行所有命令。
- 用户级:资源访问受限,或不允许访问。
解释:
微处理器启动时,默认处于特权线程模式,Thumb状态
——在该状态下,会有处理模式、非特权线程模式、特权线程模式的转换。与上面的总结相同,出现异常则进入处理模式,复位或异常返回时则进入线程模式
——而通过软件,可以“直接”的从特权线程模式转换到非特权线程模式,而不能反过来。但是通过异常机制(即线程模式返回时控制选择其一),则可以完成两者的“间接”的互相转换。(下面还会详细介绍)
——以上都是Thumb状态,若有调试事件或请求,通过调试器控制,可以进行调试状态(此时没有工作模式)
Cortex-M4处理器在处理器内核中有16个32位寄存器组成的通用寄存器组以及几个特殊功能寄存器。
8
通用寄存器
特殊功能寄存器:
1.程序状态寄存器 (PSR/xPSR,Program state register):表示处理器的状态。
程序状态寄存器可以分为三个状态寄存器:程序状态寄存器 (PSR)、中断屏蔽寄存器(PRIMASK, FAULTMASK, BASEPRI)、控制寄存器 (CONTROL)。这三个寄存器一起组合构成一个32位的寄存器,统称为xPSR或PSR。可用xPSR或PSR统一访问,也可以单独访问。
(3)执行状态寄存器(EPSR) :① ICI / IT状态位;②T标志位。
2.中断屏蔽寄存器(PRIMASK, FAULTMASK, and BASEPRI):用于控制异常或中断的使能和禁止。
寄存器名 | 综述 | 描述 |
---|---|---|
PRIMASK | 1-bit 寄存器,片上外设中断总开关 | 1:仅允许不可屏蔽中断(NMI) 和硬件默认异常(HardFault),所有其他中断和异常将被屏蔽;0:开放中断,默认为0 |
FAULTMASK | 1-bit 寄存器,异常屏蔽寄存器,相当于异常的总开关 | 1:仅允许NMI, 所有中断和默认异常处理包括硬件异常被忽略。 |
BASEPRI | 9-bit寄存器。它定义了屏蔽优先级。 | 当设置为某值时, 所有大于或等于该值的中断被屏蔽(例如,把BASEPRI设置为2,则2 和2以上优先级的中断都被屏蔽,只有0和1优先级的中断不会被屏蔽)(值越大,优先级越低)。全为0(默认值):不屏蔽任何中断(注意,这里不是0以上都屏蔽,而是全都不屏蔽)。 |
位 | 功能 |
---|---|
CONTROL[0] 定义特权级别 | 0=特权级的线程模式 ,1=用户级的线程模式。 |
CONTROL[1] 选择堆栈指针 | 0=(复位后缺省值)只使用MSP,此时用户程序和异常共享同一个堆栈,1=选择进程堆栈指针PSP,在线程或基础级(没有在响应异常),可以使用PSP。在handler模式下,只允许使用MSP,所以此时不得往该位写1。 |
关于特权级:
关于堆栈指针
Cortex-M4存储器系统特性:
存储器层次结构:
层次结构分为内核、芯片级、板卡级、外设级。
【TCM(TCM: Tightly Coupled Memories):紧耦合内存,TCM是一个固定大小的RAM,紧密地耦合至处理器内核,提供与cache相当的性能,相比于cache的优势是,程序代码可以精确地控制什么函数或代码放在哪儿(RAM里)。】
存储器映射:
名称 | 区域 | 功能 | 总线 |
---|---|---|---|
代码(Code)段 | 0x0000 0000-0x1FFF FFFF | 用于存放指令或数据,主要用于程序代码,也用于异常向量表。 | 通过ICode总线取指令,通过DCode总线读、写数据。 |
片上SRAM段 | 0x2000 0000-0x3FFF FFFF | 可以存放指令或数据,主要用于数据存储器。 | 通过系统总线取指令或读写数据。 |
片上外设段 | 0x4000 0000-0x5FFF FFFF | 主要用于片上外设的输入/输出接口 | 通过系统总线进行访问 |
外部RAM | 0x6000 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的存储区域被访问。
栈内存操作:
堆栈:是一个按照后进先出原则组织的一个内存区域。任何处理器中都会采用堆栈机制临时存放数据、变量等。
堆栈的作用:
Cortex-M4处理器使用的是 “满递减”栈:堆栈指针指向栈顶元素,且堆栈由高地址向低地址方向增长。(注意,这里的堆栈指针就是之前介绍的“Cortex-M4 处理器有主堆栈指针 (MSP) 和进程堆栈指针(PSP)两个堆栈指针,由Control [1]控制”)
过程:
寄存器中的数据可以通过PUSH操作保存到栈内存并且通过POP操作再恢复到寄存器。PUSH和POP指令时都会传输至少一个字(4字节)的数据,而且地址总是对齐到4字节边界上,SP的最低两位也总是为0(字对齐)。
第一个是入栈PUSH:执行PUSH指令时,堆栈指针SP的值将自减(入栈,指针地址减小),处理器首先减小堆栈指针的值,然后将数据存储在堆栈指针所指的存储器位置;
第二个是出栈POP:执行POP指令时,堆栈指针SP的值将自增(出栈,指针地址增加)。堆栈指针指向的存储器位置的数据被读出,然后堆栈指针的值自动增加。
异常(exception):当处理器的内核产生复位、存取失败、遇到未定义指令时,正常执行的程序被暂停,转到相应的处理程序执行称之为异常。每个异常对应一个异常处理程序。
异常程序执行完后,返回当前程序继续执行。CM4允许多个异常同时发生,并按固定的优先级进行处理
中断(interrupt):当处理器内核的外部发生某一事件,产生触发信号,引起CPU暂停当前执行的程序,转去执行处理相应事件的程序,执行完毕后返回。
异常与中断的区别:中断对处理器内核来讲是意外突发事件,请求信号来自外部;异常是处理器内核产生的,即在执行指令或存取中产生的。中断可看成是异常的一种。
嵌套向量中断控制器NVIC:
嵌套向量中断控制器(NVIC)处理处理器中的异常。具体包括:处理异常和中断配置、优先级以及中断屏蔽。
NVIC 在处理器内部 ,其寄存器位于存储器映射的系统控制空间(SCS)处。 NVIC是可编程的
异常向量表:
当异常产生并且被处理器内核接受后,处理器将执行异常处理程序,这时就需要知道异常处理程序的起始地
址,解决该问题的方法是使用异常向量表。
复位种类:上电复位、掉电复位、复位引脚复位(比如电脑重启键)、看门狗复位、软件复位(对于嵌入式系统来讲,有内核复位和系统复位,内核复位是指只复位处理器,而不复位如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 初始化好后就已经为它们的服务例程准备好了堆栈。
什么是嵌入式系统?有何特点?
• 技术角度定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
• 系统角度定义:嵌入式系统是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。术语嵌入式反映了这些系统通常是更大系统中的一个完整的部分,称为嵌入的系统。嵌入的系统中可以共存多个嵌入式系统
简述MCU与CPU的异同。
MCU(单片机)里面含有CPU,CPU是MCU的一部分。具体的,处理器是微控制器的核心。除了处理器外,MCU还有存储器、时钟生成和分配逻辑、系统总线以及外设等模块。外设模块包括I/O接口单元、定时器、ADC、DAC等。
经典的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)两种模式