系列文章目录
第一章 ARM概述机器基本编程模型
ARM概述及其基本编程模型
前言
ARM芯片具有RISC体系的一系列特点,又有一些特别的技术可以保证高性能的同时,尽可能的减少芯片体积,降低芯片的功耗
ARM体系结构的版本及命名方法
ARM体系结构的版本
- CPSR(current program status register): 当前程序状态寄存器,保存当前程序状态信息.
- SPSR(saved program status register):备份的程序状态寄存器.程序异常中断程序时,保存被中断程序的程序状态.
- MRS和MSR指令,用于访问CPSR寄存器和SPSR寄存器.
ARM体系结构的变种
- Thumb指令集(T变种):
a. ARM指令集的一个子集重新编码形成的一个指令集.ARM指令长度为32位, Thumb指令长度为16位.
b. Thumb指令集可以得到密度更高代码,严格控制产品成本的设计.???
c. 局限:
1). 完成相同的功能,Thumb需要更多的指令,增加运行时间
2). 没有包含进行异常处理时需要的一些指令. - 长乘法指令(M变种):
a. 增加两条用于长乘法操作的ARM指令.
1). 实现32位乘以32位,生成64位整数的长乘法操作.
2). 实现32位乘以32位,然后加上32位整数,生成64位整数的长乘加操作.
b. 适合长乘法的应用.如果乘法的性能不重要,但是对尺寸要求严格,则不适合M变种. - 增强型DSP指令(E变种):
a. 增强处理器对一些典型的DSP(数字信号处理技术)算法的处理性能.
1). 几条新的实现16位数据乘法以及乘加操作的指令;
2). 饱和的带符号数的加减法操作的指令. 即加减法溢出时, 使用最大的整数或者最小的负数来表示.
3). 增加指令: 双字读取指令LDRD, 双字写入指令STRD, 协处理器的寄存器传输指令MCRR/MRRC.协处理器(coprocessor),一种芯片,用于减轻系统微处理器的特定处理任务.
4). Cache预取指令PLD.
b. ARM体系版本5以前,以及非M变种以及T变种的版本中,E变种无效.
c. ExP中,x表示缺少,表示缺少上述3),4)指令. - JAVA加速器Jazelle(J变种):
a. JAVA加速功能.可以在一个单独的处理器上同时运行JAVA应用程序,已经建立好的操作系统,中间件以及其他的应用程序.与使用协处理器以及双处理器相比,可以在提高性能的同时,减低功耗以及成本??? - ARM媒体功能扩展(SIMD变种)
a.为嵌入式提供高性能的音频/视频处理技术.
1). 可以同时进行2个16位操作数或者4个8位操作数的运算.
2). 音视频处理性能提高2~4倍.
3). 小数运算.
4). 用户定义饱和运算的模式.
5). 两套16位操作数的乘加/乘减操作.
6). 32位乘以32位的小数MAC.???
7). 同时8位/16位选择操作.
ARM/Thumb体系版本的命名格式
- 字符串ARMv;
- ARM指令集版本号,例如1~6的数字字符;
- 表示变种的字符,由于ARM体系版本4之后,M变种成为系统的标准功能,字符M通常不需要列出来。
- 字符x表示排除某项写功能。如ExP;.
ARM处理器系列
同样体系版本的处理器,其软件的是兼容的。
- ARM7系列:功耗以及成本,最高主频可以达到130MIPS,支持16位的Thumb指令集,使用Thumb指令集可以用16位的系统开销得到32位的系统性能,MIPS(Million Instructions Per Second):单字长定点指令平均执行速度 Million Instructions Per Second的缩写,每秒处理的百万级的机器语言指令数。;
- ARM9系列:支持16位的Thumb指令集,使用Thumb指令集可以用16位的系统开销得到32位的系统性能;
- ARM9E系列:使用单一的处理器内核,提供了微控制器、DSP、Java应用系统的解决方案,减小了芯片的尺寸以及复杂程度,减低了功耗,缩短了产品面世的时间;
- ARM10E:性能高以及功耗低的特点,提供了64位的读取/写入体系,支持包括向量操作的满足IEEE754的浮点运算协处理器,系统集成更加方便,拥有完整的硬件和软件可开发工具;
- SecurCore系列:提供了基于32位RISC技术的安全解决方案,具有体积小、功耗低、代码密度大和性能高的优势,同时提供了安全解决方案的支持;
ARM处理器的运行模式
处理器模式 | 描述 |
---|---|
用户模式(User, usr) | 正常程序执行的模式 |
快速中断模式(FIQ,fiq) | 用于高速数据传输和通道处理 |
外部中断模式(IRQ,irq | 用于通常的中断处理 |
特权模式(Supervisor, sve) | 供操作系统使用的一种保护模式 |
数据访问中止模式(Abort, abt) | 用于虚拟存储以及存储保护 |
未定义指令中止模式(Undefined, und) | 用于支持通过软件仿真硬件的协处理器 |
系统模式(System,sys) | 用于运行特权级的操作系统任务 |
注释:除了用户模式外的其他6种处理器模式称为特权模式,在特权模式可以访问所有的系统资源,也可以任意的进行处理器模式的切换;除了系统模式之外,其他的5种特权模式又被称为异常模式。
- 处理器的模式可以通过软件控制,外部中断或者异常处理过程进行切换;
- 每一种异常模式都有自己的一组寄存器,供相应的异常处理程序使用,可以保证异常程序下的用户模式的寄存器不被破坏;
- 系统模式非异常过程进入,和用户模式使用完全一样的寄存器,其可以访问所有的系统资源;
ARM寄存器介绍
- ARM处理器共有37个寄存器,其中包括31个通用寄存器,包括程序计数器(PC)在内,均为32位寄存器;6个状态寄存器,均为32位寄存器,但是只使用到其中的12位;
- ARM处理器共有7种不同的处理器模式,每一种模式下的可见寄存器不相同。下面描述了各个模式下共用的寄存器以及独占的寄存器,共37个:
用户模式 系统模式 特权模式 中止模式 未定义指令模式 外部中断模式 快速中断模式 R0 R0 R0 R0 R0 R0 R0 R1 R1 R1 R1 R1 R1 R1 R2 R2 R2 R2 R2 R2 R2 R3 R3 R3 R3 R3 R3 R3 R4 R4 R4 R4 R4 R4 R4 R5 R5 R5 R5 R5 R5 R5 R6 R6 R6 R6 R6 R6 R6 R7 R7 R7 R7 R7 R7 R7 R8 R8 R8 R8 R8 R8 R8_fiq R9 R9 R9 R9 R9 R9 R9_fiq R10 R10 R10 R10 R10 R10 R10_fiq R11 R11 R11 R11 R11 R11 R11_fiq R12 R12 R12 R12 R12 R12 R12_fiq R13 R13 R13_svc R13_abt R13_und R13_irq R13_fiq R14 R14 R14_svc R14_abt R14_und R14_irq R14_fiq PC PC PC PC PC PC PC CPSR CPSR CPSR CPSR CPSR CPSR CPSR SPSR_svc SPSR_abt SPSR_und SPSR_irq SPSR_fiq
通用寄存器
- 未备份寄存器:R0~R7;所有处理器模式均指向同一个物理寄存器;
- 备份寄存器:R8~R14;
a. 在中断处理过程中,如果仅仅使用了R8-R14寄存器时,可以FIQ可以不必执行保存和恢复中断现场的指令,从而使得中断处理过程非常迅速;
b. 寄存器R13在ARM中常用作栈指针,只是习惯用法,在一些Thumb指令集中,有一些指令强制性的使用R13作为栈指针;
c. 寄存器R14又被称为连接寄存器(Link Register, LR), 作用有两个:1)每一种处理器模式将自己的物理R14中存放着当前子程序的返回地址,通过BL或者BLX指令调用子程序时,R14被设置成该子程序的返回地址;在子程序返回时,将R14寄存器中的值复制到PC中;2)当异常中断发生时,作为异常模式将要返回的地址或者通过R14找到要返回的地址;3) 其也可做为通用寄存器使用; - 程序计数器PC, R15;1)ARM采用了流水线机制,PC指向当前指令的下两条指令的地址,同时ARM是字(字与计算机的架构有关,32位即为32)对齐的,一次4个字节,对应地址增加4, 则PC值的第0位和第1位总是0;当使用STR/STM保存时,保存的可能是当前指令加8,也可能加12,取决于芯片的设计方式;具体来讲,PC指向的是当前指令的下两条指令的地址,但是保存的可能时当前指令+8, 也可能是当前指令加12;具体方式可以下面汇编代码查看:
当成功向R15中写入一个地址数值时,程序跳转到该地址执行,由于ARM指令是字对齐的,地址值应该满足bits[1:0]=0b00, 2^2 = 4;对于Thumb来讲,是半字对齐,则应该是bits[0]=0;SUB R1,PC,#4 ;PC是当前指令的下两条指令的地址,即为LDR指令,-4即为STR指令的地址 STR PC,[R0] ; 用R0保存通过STR保存的地址,即当前指令+offset LDR R0,[R0] SUB R0,R0,R1 ; 则offset = PC - STR地址
读取PC值与写入PC值是不对称的,如指令“MOV PC PC”,即将程序跳转到当前指令下面的第二条指令处执行;
小结:读取PC为当前指令下两条指令的地址;写入PC即跳转到对应的指令位置;STR/STM存储时可能为当前指令+8,或者+12.
程序状态寄存器
-
CPSR(当前程序状态寄存器)可以在任何的处理器模式下被访问,包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。每一种异常处理器模式都有自己的专用物理状态寄存器,SPSR,当特定的异常中断发生时,用于存放异常发生时CPCR的内容,当异常中断程序退出时,则利用SPSR恢复CPSR的内容.
-
CPSR的格式:
31 30 29 28 27 … 7 6 5 4 3 2 1 0 N Z C V Q DNM(RAZ) I F T M4 M3 M2 M1 M0 a. 条件标志位:N(Negative),Z(Zero),C(Carry),V(oVerflow)
标志位 含义 N 两个补码表示有符号的整数运算时,N=1代表负数,N=0表示结果为正数或者0 Z Z=1表示运算的结果为0;Z=0表示结果不为0;对于CMP指令,Z=1,代表两个数大小 相等 C 1. 加法指令中,包括比较指令CMN,结果产生进位,C=1,表示无符号数运算发生上溢出,其他情况为0;2. 减法指令中,包括比较指令,运算发生借位,C=0,表示无符号数运算发生下溢出;其他情况为1;3. 含移位操作的非加减法指令,C中包含最后一次被溢出的位的数值;4. 其他非加减法运算指令,C的位通常不受影响 V 对于加减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出;通常其他的位不影响V位 影响标志位的操作:
- 比较指令
- 算数运算以及逻辑指令的目标寄存器不是R15时
- MSR可以向CPSR/SPSR中写入新值
- MRC指令将R15作为目标寄存器时,可以将协处理器中产生的条件标志位传到ARM处理器中
- SPSR写入CPSR的一些情况
b. Q标志位:E变种中指示增强的DSP是否发生了溢出;
c. 低8位I、F、T以及M[4:0]统称为控制位;在特权级的处理器模式下,可以修改这些控制位
1)中断禁止位
- 当I=1时,禁止IRQ中断;
- 当F=1时,禁止FIQ中断;
2)T控制位:若支持Thumb,则T=1表示Thumb指令,T=0表示ARM指令;非T的高ARMv5以上,T=1表示下一条执行的指令强制产生未定义指令中断;
3)M控制位:控制处理器模式;
d. 其他位,留作扩展;
ARM体系的异常中断
ARM体系通常通过3种方式控制程序的执行流程:
- 顺序执行:ARM指令,PC=PC+4, Thumb指令,PC=PC+2;
- 跳转指令:B跳转,BL带保存返回值的跳转,BX切换到Thumb状态,BLX三种同时执行;
- 异常中断:保存然后恢复现场;
ARM中异常中断的种类
ARM体系中的异常中断
异常中断名称 | 含义 |
---|---|
复位(Reset) | 当处理器的复位引脚有效时,会跳到复位中断程序去执行。1. 系统加电,2. 系统复位时, 3. 跳转到复位中断向量处执行,称为软复位 |
未定义的指令(Undefined Instruction) | 遇到未定义的指令时,可以通过该异常中断仿真浮点向量运算??? |
软件中断(Software Interrupt, SWI) | 用户定义的中断指令,用户模式下的调到特权操作指令,在实时操作系统中可以通过该机制实现系统功能调用 |
指令预取中止(Prefetch Abort) | 预取的指令不存在,或者该地址不允许当前指令访问时 |
数据访问中止(Data Abort) | 访问的数据不存在,或者数据不存在 |
外部中断请求(IRQ) | 当处理器的外部中断请求引脚有效,而且CPSR寄存器中的I控制位被清除时,处理器产生外部中断 请求(IRQ)异常中断。系统中的外设通常通过该异常中断请求处理器服务 |
快速中断请求(FIQ) | 当处理器的外部中断请求引脚有效,而且CPSR寄存器中的F控制位被清除时,处理器产生外部中断请求(FIQ)异常中断 |
- ARM处理器对异常中断的响应流程:
a. 保存当前处理器状态、中断屏蔽位以及各条件标志位。SPSR_<exception_mode> = CPSR;
b. 设置当前程序状态寄存器CPSR中对应的位。包括设置CPSR中的位,处理器进入相应的模式;设置CPSR中的位,禁止IRQ中断,进入FIQ模式时,禁止FIQ中断; CPSR[4:0] = exception mode number; CPSR[5] = 0 ;if <exception_mode> == Reset or FIQ then CPSR[6]=1; CPSR[7] = 1;
c. 将寄存器lr_mode设置为返回地址;lr_mode = PC;
d. 将程序计数器置为对应的中断向量地址;PC=exception vector address; - 异常中断处理程序中返回:
a. 恢复被中断的程序的处理器的状态。 CPSR= SPSR
b. 返回到发生异常中断指令的下一条指令处开始执行;PC = lr_mode;
注释:复位异常中断不需要返回
ARM体系中的存储系统
- 使用单一的地址空间,空间大小为2^32个8位字节;
- 大小端模式:A代表一个8位的字节;
a. 大端模式:31 – 0 : A A+1 A+2 A+3
b. 小端模式:31 – 0 :A+3 A+2 A+1 A - 非对齐的存储访问操作:
a. 非对齐的指令预取操作:ARM指令中,低两位不为00,Thumb指令中,低一位不为0,1. 通过掩码,忽略低位,2. 忽略差异,则将存储系统将错误地址忽略,仍然传送;
b. 非对齐的数据访问操作:需要指令指定,1.执行结果不可知,2. 忽略低位,通过掩码忽略低位,3. 忽略差异,即取该地址值 - 指令预取和自修改代码:
a. 预取的指令不一定执行,预取数量与实现有关;
b. 自修改代码指的是代码在执行过程中可能修改自己(主存中的指令),对于支持指令预取的ARM系统,可能存在主存与预取的指令不同的风险;