ARM是Advanced RISC Machines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能、廉价、耗能低的RISC (精简指令集)处理器。
公司的特点是只设计芯片,而不生产。它将技术授权给世界上许多著名的半导体、软件和OEM厂商,并提供服务。
RISC是精简指令集计算机的缩写,其目标是设计出在高时钟频率下单周期执行,简单而有效的指令集。ARM内核采用RISC体系结构,因此具有RISC的结构特点:
ARM7TDMI是基于ARM体系结构V4版本的低端ARM核。其弥补了ARM6很难在低于5V电压下稳定工作的不足,还增加了后缀所对应的功能:
注意:“ARM核”并非芯片,ARM核与其它部件如RAM、ROM、片内外设组合在一起才能构成现实的芯片。
从偶数地址开始的连续2个字节构成一个半字;
以能被4整除的地址开始的连续4个字节构成一个字;
ARM指令的长度刚好是一个字,Thumb指令的长度刚好是一个半字。
如果一个数据是从偶地址开始的连续存储,那么它就是半字对齐,否则就是非半字对齐;
如果一个数据是以能被4整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐。
ARM处理器使用流水线来增加处理器指令流的速度,这样可使几个操作同时进行,并使处理和存储器系统连续操作,能提供0.9MIPS/MHz的指令执行速度。
ARM7TDMI的流水线分3级,分别为:
graph LR
取值-->译码
译码-->执行
程序计数器R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或“正在译码”的指令。
一般来说,人们习惯性约定将“正在执行”的指令作为参考点,则:PC值=当前程序执行位置+8
PPT第二章
ARM7TDMI处理器内核包含2套指令系统,分别为ARM指令集和Thumb指令,并且各自对应1种处理器的状态:
ARM状态:32位,处理器执行字方式的ARM指令,处理器默认为此状态;
Thumb状态:16位,处理器执行半字方式的Thumb指令。
注意:两个状态之间的切换并不影响处理器模式或寄存器内容。
使用BX指令将ARM内核的操作状态在ARM状态和Thumb状态之间进行切换。
ARM指令集 > Thumb指令集
CODE32
LDR R0, =Lable+1 ;跳转地址标号,地址最低位为1,表示切换到Thumb状态
BX R0 ;执行完BX指令,处理器切换到Thumb状态,开始执行Thumb指令
CODE16
Lable MOV R1, #12
CODE16
LDR R0, =Lable; 地址最低位为0,表示切换到ARM状态
BX R0; 执行完BX指令,处理器切换到ARM状态,开始执行ARM指令
CODE32
Lable MOV R1, #10
ARM体系结构支持7种处理器模式,分别为:用户模式(usr)、快中断模式(fiq)、中断模式(irq)、管理模式(svc)、中止模式(abt)、未定义模式(und)和系统模式(sys)。这样的好处是可以更好的支持操作系统并提高工作效率。ARM7TDMI完全支持这七种模式。
graph LR
ARM处理器模式-->用户模式
ARM处理器模式-->特权模式
特权模式-->系统模式
特权模式-->异常模式
异常模式-->快中断模式
异常模式-->管理模式
异常模式-->中止模式
异常模式-->未定义模式
异常模式-->中断模式
除用户模式外,其它模式均为特权模式。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。
用户模式,系统模式都不能由异常进入,想要进入必须修改CPSR,而且它们使用完全相同的寄存器组。系统模式是特权模式,不受用户模式的限制。操作系统在该模式下访问用户模式的寄存器就比较方便,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。
这五种模式称为异常模式。它们除了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可靠。
在ARM处理器内部共有37个用户可访问的寄存器,分别为31个通用32位寄存器和6个状态寄存器
ARM处理器共有7种不同的处理器模式,每种模式都有一组相应的寄存器组,最多可以18个活动的寄存器。
用户模式
通用32位寄存器 R0 - R15
状态寄存器 CPSR
系统模式
通用32位寄存器 R0 - R15
状态寄存器 CPSR
管理模式
通用32位寄存器 R0 - R12 R13_svc R14_svc R15
状态寄存器 CPSR SPSR_svc
中止模式
通用32位寄存器 R0 - R12 R13_abt R14_abt R15
状态寄存器 CPSR SPSR_abt
未定义模式
通用32位寄存器 R0 - R12 R13_und R14_und R15
状态寄存器 CPSR SPSR_und
中断模式
通用32位寄存器 R0 - R12 R13_irq R14_irq R15
状态寄存器 CPSR SPSR_irq
快中断模式
通用32位寄存器 R0-R7 R8_fiq R9_fiq R10_fiq R11_fiq R12_fiq R13_fiq R14_fiq R15
状态寄存器 CPSR SPSR_fiq
寄存器R0~R7为未分组的通用寄存器,它们在任何处理器模式都对应于相同的32位物理寄存器。
寄存器R0~R7为未分组的通用寄存器,它们在任何处理器模式都对应于相同的32位物理寄存器。
寄存器R8~R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所有寄存器模式,另一个用于FIQ模式。
寄存器R13、R14分别有6个分组的物理寄存器。1个用于用户和系统模式,其余5个分别用于5种异常模式。
寄存器R13通常作为堆栈指针(SP),用于保存待使用的寄存器的内容。
寄存器R14称为链接寄存器(LR),在结构上有两个特殊功能:当使用BL指令调用子程序时,返回地址将自动存入R14中;当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。
寄存器R15称为程序计数器(PC),它指向正在“取指”的指令。
寄存器CPSR为当前程序状态寄存器,在异常模式中,另外一个寄存器“程序状态保存寄存器(SPSR)”可以被访问。每种异常都有自己的SPSR,在进入异常时它保存CPSR的当前值,异常退出时可通过它恢复CPSR。
在发生FIQ中断后,处理器不必为保护寄存器而浪费时间,从而加速了FIQ的处理速度。
Thumb状态寄存器集是ARM状态集的子集,程序员可以直接访问的寄存器为:
在汇编语言中寄存器R0~R7为通用寄存器,对于任何处理器模式,它们中的每一个都对应于相同的32为物理寄存器。
堆栈指针SP对应ARM状态的寄存器R13。每个异常模式都有其自身的SP分组版本,SP通常指向各异常模式所专用的堆栈。
链接寄存器LR对应ARM状态寄存器R14。
注意:在发生异常时,处理器自动进入ARM状态。
Thumb状态R0~R7与ARM状态R0~R7相同;
Thumb状态SP映射到ARM状态R13;
Thumb状态LR映射到ARM状态R14;
Thumb状态PC映射到ARM状态R15(PC);
Thumb状态CPSR(无SPSR)与ARM状态CPSR相同。
R0-R7为低端寄存器 R8-R12为高端寄存器
在Thumb状态中,高端寄存器的访问是受到限制的,只有MOV、CMP和ADD指令可以对其访问,可以用于数据的快速暂存。
ARM内核包含1个CPSR和5个仅供异常处理程序使用的SPSR。CPSR反映当前处理器的状态,其包含:
各标志位的含义如下:
当控制位I置位时,IRQ中断被禁止;
当控制位F置位时,FIQ中断被禁止。
当控制位T置位时,处理器正在Thumb状态下运行
控制位T清零时,处理器正在ARM状态下运行
绝对不要强制改变CPSR寄存器中的控制位T。如果这样做,处理器将进入一个无法预测的状态。
10000 用户
10001 快速中断
10010 中断
10011 管理
10111 中止
11011 未定义
11111 系统
不是所有模式位的组合都定义了有效的处理器模式,如果将非法值写入M[4:0]中,处理器将进入一个无法恢复的模式。
CPSR中的保留位被保留将来使用。当改变CPSR标志和控制位时,请确认没有改变这些保留位。
另外,请确保您的程序不依赖于包含特定值的保留位,因为将来的处理器可能会将这些位设置为1或者0。
只要正常的程序流被暂时中止,处理器就进入异常模式。例如在用户模式下执行程序时,当外设向处理器内核发出中断请求导致内核从用户模式切换到异常中断模式。
如果同时发生两个或更多异常,那么将按照固定的顺序来处理异常。
下表所示为异常返回地址值以及退出异常处理程序所推荐使用的指令。
异常或入口 | 返回指令 | 返回地址 |
---|---|---|
SWI | MOVS PC,R14_svc | R14 |
未定义的指令 | MOVS PC,R14_und | R14 |
预取中止 | SUBS PC,R14_abt,#4 | R14 |
快速中断 | SUBS PC,R14_fiq,#4 | R14-4 |
中断 | SUBS PC,R14_irq,#4 | R14-4 |
数据中止 | SUBS PC,R14_abt,#8 | R14-8 |
复位 | 无 | —— |
注意: “MOVS PC,R14_svc”是指在管理模式执行MOVS PC,R14 指令,同样类似的指令还有“MOVS PC,R14_und”、“SUBS PC,R14_abt,#4”等。
地址 | 异常 | 进入时的模式 | 进入时I的状态 | 进入时F的状态 |
---|---|---|---|---|
0x00000000 | 复位 | 管理 | 禁止 | 禁止 |
0x00000004 | 未定义指令 | 未定义 | I | F |
0x00000008 | 软件中断异常 | 管理 | 禁止 | F |
0x0000000C | 中止(预取) | 中止 | I | F |
0x00000010 | 中止(数据) | 中止 | I | F |
0x00000014 | 保留 | 保留 | —— | —— |
0x00000018 | IRQ | 中断 | 禁止 | F |
0x0000001C | FIQ | 快速中断 | 禁止 | 禁止 |
当多个异常同时发生时,一个固定的优先级决定系统处理它们的顺序
优先级 | 异常 |
---|---|
1 | 复位 |
2 | 数据中止 |
3 | FIQ |
4 | IRQ |
5 | 预取指中止 |
6 | 未定义指令中止 |
6 | 软件中断异常 |
当一个异常导致模式切换时,内核自动的做如下处理:
当异常处理程序结束时,异常处理程序必须:
当nRESET信号被拉低时,ARM处理器放弃正在执行的指令,等到nRESET信号再次变高时,处理器执行一下操作:
只有当CPSR中相应的中断屏蔽位被清除时,才可能发生IRQ异常,中断请求(IRQ)异常由一个nIRQ输入端的低电平所产生的正常中断。
**注:**中断异常产生时,中断异常模式下的R14保存的是PC的值。
三级流水线结构的指令执行顺序中,
指令1的执行不会中断;
异常程序结束时返回到指令2;
进入中断服务程序时,指令3地址被保存在R14中。
所有R14存放的是指令3的取值的地址(PC)
程序运行在用户模式下,当一个IRQ异常中断发生时,内核切换到“中断模式”,并自动的做如下处理
中断服务程序执行完毕后,系统将通过以下几步软件操作返回用户模式:
SUBS PC,R14_irq,#4
快速中断请求(FIQ)适用于对一个突发事件的快速响应,这得益于在ARM状态中,快中断模式有8个专用的寄存器可用来满足寄存器保护的需要(这可以加速上下文切换的速度)。
不管异常入口是来自ARM状态还是Thumb状态,FIQ处理程序都会通过执行下面的指令从中断返回:
SUBS PC,R14_fiq,#4
在一个特权模式中,可以通过置位CPSR中的F位来禁止FIQ异常。
未定义指令异常是内部异常中断,当ARM处理器遇到一条自己和系统内部任何协处理器都无法执行的指令时,就会发生未定义指令异常,从而进入中断处理程序,同时软件可使用这一机制通过仿真未定义的协处理器指令来扩展ARM指令集。
在仿真失败的指令后,捕获处理器执行下面的指令:
MOVS PC,R14_und
中止表示当前对存储器的访问不能被完成,这是由外部ABORT输入信号引起的异常中断。中止类型有2种类型:
当发生预取指中止时,ARM内核将预取的指令标记为无效,但在指令到达流水线的执行阶段时才进入异常。如果指令在流水线中因为发生分支而没有被执行,中止将不会发生。
在处理中止的原因之后,不管处于哪种处理器操作状态,处理程序都会执行下面的指令恢复PC和CPSR并重试被中止的指令:
SUBS PC,R14_abt,#4
当发生数据中止异常时,异常会在“导致异常的指令”执行后的下一条指令发生。在这种情况下,理想的状况是进入数据中止异常的ISR,然后在内存中挑选出问题,再重新执行导致异常的指令。
在修复产生中止的原因后,不管处于哪种处理器操作状态,处理程序都必须执行下面的返回指令 :
SUBS PC,R14_abt,#8
软件中断异常(SWI)用于进入管理模式,通常用于请求一个特定的管理函数。SWI处理程序通过执行下面的指令返回:
MOVS PC,R14_svc
这个动作恢复了PC和CPSR并返回到SWI之后的指令。SWI处理程序读取操作码以提取SWI函数编号。
中断延迟即从外部中断请求信号发出到执行对应的中断服务程序ISR的第1条指令所需要的时间。
通过软件程序设计来缩短中断延迟的方法有:中断优先级和中断嵌套。
ARM处理器采用冯·诺依曼(Von Neumann)结构,指令、数据和I/O统一编址(即存在同一个空间)。只有装载、保存和交换指令可访问存储器中的数据
ARM芯片一般在处理器核和外部存储器之间有一个存储器管理部件将局部总线的信号和时序转换为现实的外部总线信号和时序。
ARM结构使用单个平面的232个8位字节地址空间。地址空间可以看作是包含230个32位字,或231个16位半字。如果地址向上或向下溢出地址空间,通常会发生翻转。
**注意:**如果在取指操作时地址发生溢出,只要没有执行预取的无效指令,就不会导致异常。
地址空间的规则要求字地址A:
存储器系统有两种映射机制:
小端存储器系统: 在小端格式中,数据的高字节存放在高地址中。
大端存储器系统: 在大端格式中,数据的高字节存放在低地址中。
ARM结构通常希望所有的存储器访问都合理的对齐,具体来说就是字访问的地址通常是字对齐的,而半字访问使用的地址是半字对齐的。不按这种方式对齐的存储器访问称为非对齐的存储器访问。
将一个非字(半字)对齐的地址写入ARM(Thumb)状态的R15寄存器,将引起非对齐的指令取指。
在一个非字(半字)对齐的地址读写一个字(半字),将引起非对齐的数据访问: