array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 ARM体系架构 - 爱码网

ARM体系架构与编程模型脑图

ARM体系架构

1. ARM处理器简介及RISC主要特点

ARM(Advanced RISC Machines)是一个32位RISC(精简指令集)处理器架构,ARM处理器则是ARM架构下的微处理器。ARM处理器广泛的使用在许多嵌入式系统。ARM处理器的特点有指令长度固定,执行效率高,低成本等。

  • ARM是一种RISC MPU/MCU的体系结构,如同x86架构是一种CISC体系结构一样。另外,还有MIPS架构、PowerPC架构等等。
  • ARM是Advanced RISC Machine Limited公司的简称
  • ARM是Advanced RISC Machine Limited公司的产品,该产品以IP Core(Intellectual Property Core,知识产权核)的形式提供的
  • ARM还用以泛指许多半导体厂商买了这种设计后生产出来的“ARM处理器”系列的芯片及其衍生产品

半导体厂商固然可以光购买ARM公司的设计而直接生产ARM处理器芯片,但是更好的方法是以ARM处理器为核心,在同一块芯片上配上自己开发的外围模块,形成面向特定应用和市场的专用芯片,甚至“片上系统(System on a Chip,SoC)”。这样,作为专用处理器/控制器芯片的生产商既可以减少开发中的风险,又可以大大缩短开发周期,降低成本。所以,“ARM处理器”一般是作为“内核”存在于一些专用处理器/控制器的内部,因而又常常叫做“ARM核”。特别地,如果一个处理器核不带浮点运算功能,有时候就对此特别加以强调,称之为“整形核”。

1.1. 采用RISC架构的ARM微处理器一般具有如下特点

  • 支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件。Thumb指令集比通常的8位和16位CISC/RISC处理器具有更好的代码密度
  • 指令执行采用3级流水线/5级流水线技术
  • 带有指令Cache和数据Cache,大量使用寄存器,指令执行速度更快
  • 大多数数据操作都在寄存器中完成,寻址方式灵活简单,执行效率高
  • 指令长度固定(在ARM状态下是32位,在Thumb状态下是16位)
  • 支持大端格式和小端格式两种方法存储字数据
  • 支持Byte(字节,8位)、Halfword(半字,16位)和Word(字,32位)三种数据类型
  • 支持用户、快中断、中断、管理、中止、系统和未定义7种处理器模式;除了用户模式外,其余的均为特权模式;除了用户模式和系统模式外,其余都是异常模式
  • 处理器芯片上都嵌入了在线仿真ICE-RT逻辑,便于通过JTAG来仿真调试ARM体系结构芯片,可以避免使用昂贵的在线仿真器。另外,在处理器核中还可以嵌入跟踪宏单元ETM,用于监控内部总线,实时跟踪指令和数据的执行
  • 具有片上总线AMBA(Advanced Micro-controller Bus Architecture)。 AMBA定义了3组总线:先进高性能总线AHB(Advanced High performance Bus);先进系统总线ASB(Advanced System Bus);先进外围总线APB(Advanced Peripheral Bus)。通过AMBA可以方便地扩充各种处理器及I/O,可以把DSP、其他处理器和I/O(如UART、定时器和接口等)都集成在一块芯片中
  • 采用存储器映像I/O的方式,即把I/O端口地址作为特殊的存储器地址
  • 具有协处理器接口。ARM允许接16个协处理器,如CP15用于系统控制,CP14用于调试控制器
  • 采用了降低电源电压,可工作在3.0V以下;减少门的翻转次数,当某个功能电路不需要时禁止门翻转;减少门的数目,即降低芯片的集成度;降低时钟频率等一些措施降低功耗
  • 体积小、低成本、高性能

1.2. RISC和CISC指令集对比

指标 RISC CSIC
指令集 指令定长;指令周期执行;无复杂指令,通过简单指令的组合实现复杂操作;指令译码采用硬布线逻辑 指令变长;执行需要多个周期;存在复杂指令,一条指令完成复杂操作;采用微程序译码
流水线 易于实现流水线执行,流水线每周期前进一步 不易于实现流水线执行,指令的执行需要调用微代码的微程序
寄存器 更多通用的寄存器(37个) 用于特定目的的专用寄存器
Load/Store结构 独立的Load和Store指令完成数据在寄存器与外部存储器之间的传输 处理器能够直接处理存储器中的数据
编译器优化 对编译器要求高,需要编译器对代码更多的优化 对编译器要求低
寻址方式 指令长度固定,指令格式和寻址方式种类较少 寻址方式较多

1.3. ARM微处理器分类

.
Classic ARM Processors (经典 ARM 处理器) ARM11™ 系列 - 基于 ARMv6 架构的高性能处理器
ARM11™ 系列 - 基于 ARMv6 架构的高性能处理器
ARM11™ 系列 - 基于 ARMv6 架构的高性能处理器
\
Cortex-M 系列 Cortex-M0
Cortex-M0+
Cortex-M1
Cortex-M3
Cortex-M4
该系列主要针对成本和功耗敏感的应用,如智能测量、人机接口设备、汽车和工业控制系统、家用电器、消费性产品和医疗器械等。
Cortex-R 系列 Cortex-R4
Cortex-R5
Cortex-R7
针对微控制器领域开发的,在该领域中,既需进行快速且具有高确定性的中断管理,又需将门数和可能功耗控制在最低。面向如汽车制动系统、动力传动解决方案、大容量存储控制器等深层嵌入式实时应用。
Cortex-A系列 Cortex-A5
Cortex-A7
Cortex-A8
Cortex-A9
Cortex-A12
开发面向深层嵌入式实时应用,对低功耗、良好的中断行为、卓越性能以及与现有平台的高兼容性这些需求进行了平衡考虑。用于具有高计算要求、运行丰富操作系统及提供交互媒体和图形体验的应用领域,如智能手机、平板电脑、汽车娱乐系统、数字电视等。
Cortex-A50系列 Cortex-A53
Cortex-A57
该处理器系列的可扩展性使ARM的合作伙伴能够针对智能手机、高性能服务器等各类不同市场需求开发系统级芯片(SoC)

2. 编程模型

2.1. ARM数据类型

  • 字节 在ARM体系结构中,字节长度为8 bits
  • 半字 在ARM体系结构中,字节长度为16 bits
  • 字 在ARM体系结构中,字节长度为32 bits

2.2. ARM处理器存储格式

ARM体系结构将存储器看作是从0地址开始的字节的线性组合。作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB(2^32=4GB)。ARM体系结构可以用两种方法存储字数据,分别为大端模式和小端模式。

  • 大端模式(高低高低):字或半字的数据,高字节存储在低地址单元中,低字节存储在高地址单元中
  • 小端模式(高高低低):字或半字的数据,高字节存储在高地址单元中,低字节存储在低地址单元中

2.3. ARM处理器工作状态

  • ARM状态:处理器执行32位字对齐ARM指令,大部分工作在此状态
  • Thumb状态:处理器执行16位半字对齐Thumb指令

ARM和Thumb两种状态之间的切换不影响处理器的工作模式和寄存器的内容。
ARM处理器在处理异常时,不管处理器处于什么状态,则都将切换到ARM状态。

2.4. ARM处理器工作模式

处理器工作模式 特权模式 异常模式 说明
用户模式(User) --- --- 用户程序运行模式
系统模式(System) ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式 --- 运行特权级的操作任务
普通中断模式(IRQ) 可以通过在特权下的程序切换进入,也可以由特定的异常进入。其中管理模式也称为超级用户模式,是为操作系统提供软中断的特有模式,正是由于有了软中断,用户程序才可以通过系统调用切换到管理模式。 用于通用的中断处理,当触发外部中断时进入此模式
快速中断模式(FIQ) 用于高速数据传输或通道处理。当触发快速中断时进入此模式
管理模式(SVC) 操作系统使用的保护模式。在系统复位或执行软件中断指令SWI时进入
中止模式(Abort) 当数据或指令预取中止时进入该模式,可用于虚拟内存管理及内存数据访问保护
未定义模式(Undef) 当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真

2.4.1. 用户模式(User)

用户模式是用户程序的工作模式,它运行在操作系统的用户态,它没有权限去操作其它硬件资源,只能执行处理自己的数据,也不能切换到其它模式下,要想访问硬件资源或切换到其它模式只能通过软中断或产生异常

2.4.2. 系统模式(System)

系统模式是特权模式,不受用户模式的限制。用户模式和系统模式共用一套寄存器,操作系统在该模式下可以方便的访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。

说明:用户模式与系统模式两者使用相同的寄存器,都没有SPSR(Saved Program Statement Register,已保存程序状态寄存器),但系统模式比用户模式有更高的权限,可以访问所有系统资源。

2.4.3. 普通中断模式(IRQ)

一般中断模式也叫普通中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统硬件资源。

2.4.4. 快速中断模式(FIQ)

快速中断模式是相对一般中断模式而言的,它是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理中。

2.4.5. 管理模式(SVC)

管理模式是CPU上电后默认模式,因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时,通过软件中断进入该模式。

说明:系统复位或开机、软中断时进入到SVC模式下。

2.4.6. 中止模式(Abort)

中止模式用于支持虚拟内存或存储器保护,当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式,linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的。

2.4.7. 未定义模式(Undef)

未定义模式用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式。

2.4.8. 特权

进入特权模式是为了处理中断、异常、或者访问被保护的系统资源,大多数程序运行于用户模式。

  • MRS::将状态寄存器的内容放到通用寄存器
  • MSR:将通用寄存器的内容放到状态寄存器

由于状态寄存器中的内容不能够改变,因此要先把内容复制到通用寄存器中,然后修改通用寄存器中的内容,再把通用寄存器中的内容复制给状态寄存器中,即可完成“修改状态寄存器”的任务。

2.4.9. 异常的优先级

异常类型 优先级
复位 1(最高优先级)
数据中止 2
FIQ 3
IRQ 4
预取指令中止 5
未定义指令 6
SWI 7(最低优先级)

硬件权限级别:系统模式 > 异常模式 > 用户模式

3. ARM寄存器组织

ARM处理器一共有37个32位寄存器,但是每种工作模式下最多只能看到18个寄存器,其他寄存器虽然名字相同但是在当前模式下不可见,具体包括:

  • 31个通用寄存器
    • 未分组寄存器R0~R7,在所有运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途。因此在中断或异常处理进行异常模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,所以可能造成寄存器中数据的破坏。
    • 分组寄存器R8~R14,对于分组寄存器,他们每次所访问的物理寄存器都与当前的处理器运行模式相关。其中,R13(SP)常用作存放堆栈指针,用户也可以使用其他寄存器存放堆栈指针,但在Thumb指令集下,某些指令强制要求使用R13存放堆栈指针;R14称为链接寄存器(LR,Link Register),当执行子程序时,R14可得到R15(PC)的备份,执行完子程序后,又将R14的值复制回PC,即使用R14保存返回地址。
    • 程序计数器PC, 寄存器R15用作程序计数器(PC),在ARM状态下,位[1:0]为0,位[31:2]用于保存PC;在Thumb状态下,位[0]为0,位[31:1]用于保存PC。由于ARM体系结构采用了多级流水线技术,对于32位ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。
  • 6个状态寄存器
    • 其中包括除User和System工作模式外,每个工作模式都专有一个SPSR(Saved Program Status Register), 以及每个工作模式共有的CPSR(Current Program Status Register)

ARM体系架构

  • R13寄存器为堆栈寄存器
  • R14寄存器为链接寄存器,函数调用时,用来存储返回值
  • R15寄存器为程序计数器,总是指向将要执行的下一条指令
  • CPSR寄存器为当前程序状态寄存器
  • SPSR寄存器为保存程序状态寄存器,当工作模式发生切换时,保存切换前工作模式的工作状态及CPSR的值

ARM体系架构

说明
N(31) 在算数逻辑单元(ALU)中,结果是有符号的二进制补码情况下,如果结果为负数,则N=1;否则,N=0
Z(30) 在算数逻辑单元(ALU)中,如果结果为0,则Z=1; 如果结果为非零,则Z=0
C(29) 在算数逻辑单元(ALU)中,结果是否进位,进位则为1,否则为0
V(28) 在算数逻辑单元(ALU)中,结果是否溢出,溢出则为1,否则为0
I(7) 普通中断控制位,为1禁止IRQ,为0允许IRQ
F(6) 快速中断控制位,为1禁止FIQ,为0允许FIQ
T(5) T=0,ARM工作状态;T=1,Thumb工作状态
M4~M0 ARM工作模式
10000用户模式
10001FIQ模式
10010IRQ模式
10011管理模式
10111中止模式
11011未定义模式
11111系统模式

4. ARM工作模式的切换

  1. 执行软中断(SWI)或复位命令(Reset)指令。如果在用户模式下执行SWI指令,CPU就进入管理(Supervisor)模式。当然,在其他模式下执行SWI,也会进入该模式,不过一般操作系统不会这么做,因为除了用户模式属于非特权模式,其他模式都属于特权模式。执行SWI指令一般是为了访问系统资源,而在特权模式下可以访问所有的系统资源。SWI指令一般用来为操作系统提供API接口。
  2. 有外部中断发生。如果发生了外部中断,CPU就会进入IRQ或FIQ模式。
  3. CPU执行过程中产生异常。最典型的异常是由于MMU保护所引起的内存访问异常,此时CPU会切换到Abort模式。如果是无效指令,则会进入Undefined模式。
  4. 有一种模式是CPU无法自动进入的,这种模式就是System模式,要进入System模式必须由程序员编写指令来实现。要进入System模式只需改变CPSR的模式位为System模式对应的模式位即可。进入System模式一般是为了利用System模式和用户模式下的寄存器相同的特点,因此一般情况下,操作系统在通过SWI进入Supervisor模式后,做一些操作后,就进入System模式。
  5. 在任何特权模式下,都可以通过修改CPSR的MODE域来进入其他模式。不过需要注意的是由于修改的CPSR是该模式下的影子CPSR,即SPSR,因此并不是实际的CPSR,所以一般的做法是修改影子CPSR,然后执行一个MOVS指令来恢复执行某个断点并切换到新模式。

4.1. ARM异常处理方式

  • 当异常产生时, ARM core:
    • 自动拷贝 CPSR 到 SPSR_(保存当前的状态)
    • CPU自动设置适当的 CPSR 位:
      • 改变处理器状态进入 ARM 态(CPSR中的T位)
      • 改变处理器模式进入相应的异常模式(CPSR中的Mode位)
      • 设置中断禁止位禁止相应中断 (如果需要) (CPSR中的I和F位)
    • 保存返回地址到 LR_(将异常时的地址保存到异常模式下的LR中,方便返回)
    • 设置 PC 为相应的异常向量(为PC设置异常向量表中的地址)
  • 返回时, 异常处理需要:
    • 从 SPSR_恢复CPSR(恢复发生异常时的状态)
    • 从LR_恢复PC (恢复到发生异常时程序运行处)
    • Note:这些操作只能在 ARM 态执行.

相关文章: