2.1概述
2.2
从程序员的角度上看,ARM920T可以工作在下面两种工作状态下的一种:
●
●
注意;这两种状态的转换不影响处理模式和寄存器的内容。
2.3
进入THUMB
进入ARM状态
进入ARM状态,可以通过执行BX指令,并且操作数寄存器的状态位(0位)
清零来实现。
当处理进入异常(IRQ,FIQ,RESET,UNDEF,ABORT,SWI等)。这时,PC值保持在异常模式下的link寄存器中,并从异常向量地址处开始执行处理程序。
存储空间的格式
ARM920T将存储器空间视为从0开始由字节组成的线性集合,字节0到3中保存了第一个字节,字节4到7中保存第二个字,以此类推,ARM920T对存储的字,可以按照小端或大端的方式对待。
大端格式:
在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,因此字节0存储在数据的24到31行里
|
图
小端格式:
|
图
2.4
指令可以是32位长度(在ARM状态下)
数据类型
ARM920T支持字节(8位),半字(16位)
2.5
ARM920T支持7种操作模式:
●
●
●
●
●
●
●
外部中断,异常操作或软件控制都可以改变中断模式。大多数应用程序都是在用户模式下进行,进入特权模式是为了处理中断或异常请求或操作保护资源服务的。
2.6
ARM共有37个32位的寄存器,其中31个是通用寄存器,6个是状态寄存器。但在同一时间,对程序员来说并不是多有的寄存器都可见。在某一时刻存储器是否可见,是由处理器当前的工作状态和工作模式决定的。
ARM状态寄存器
ARM状态寄存器系列中含有16个直接操作寄存器:R0到R15。除了R15外其他的都是通用寄存器,可用来存放地址或数据值
寄存器14 |
专职持有返回点的地址,在系统执行一条“跳转并链接”(BL)指令的时候,R14将收到一个R15的拷贝。其他时候,它可以用作一个通用寄存器。相应的私有寄存器R14_svc,R14_irq,R14_fiq,R14_abt和R14_und都同样用来保存在中断或异常发生时,或在中断和异常时执行了BL指令时,R15的返回值。 |
寄存器15 |
这个寄存器是程序计数器(PC)。在ARM状态下,R15的bits[1:0]为0,bist[31:2]保存了PC的值。 |
寄存器16 |
这个寄存器是CPSR(当前程序状态寄存器),用来保存当前代码标志和当前模式位。 |
FIQ模式拥有7个私有寄存器R8-14(R8_fiq-R14_fiq)。在ARM状态下,多数FIQ处理都不需要保存任何寄存器。用户、中断、异常中止,超级用户和未定义模式都拥有2个私有寄存器,R13和R14。允许这些模式都可拥有1个私有堆栈指针和链接寄存器。
THUMB
ARM
●
●
●
●
●
图2-5显示了它们的关系:
在THUMB状态下访问高地址寄存器
在THUMB状态下寄存器R8-15(高地址寄存器)不是标准寄存器集。但是,汇编语言的程序员可以访问它们并用它们作快速暂存。
采用MOV指令的某个变型,从R0-R7(低地址寄存器)的某个寄存器传送数据到达高地址寄存器,或者从高地址寄存器传送到低地址寄存器。还可以采用CMP和ADD指令,将高地址寄存器的值与低地址寄存器的值进行比较或相加。想获得这方面更多的信息,请参考图3-34。
2.7
●
●
●
下图2-6显示了程序状态寄存器的位定义:
2.7.1条件码标志
N、Z、C、V均为条件码标志位。它们的内容根据算术或逻辑运算的结果所改变,并且来作为一些指令是否运行的检测条件。
在ARM状态下,绝大多数指令都是有条件执行的,详情请看表3-2;
在Thumb状态下,仅有分支指令是有条件执行的,详情请看图3-46。
2.7.2
PRS的低8位(包括I、F、T、M[4:0])称为控制位,当发生异常时这些位将被改变。如果处理器工作在特权模式下,这些位也可以由软件操纵。
T标记位 |
该位反映处理器的运行状态。该位被设置为1时,处理器执行在THUMB状态,否则执行在ARM状态,这些由外部信号TBIT反映出来。注意:软件决不能改变CPSR的TBIT状态。如果这样做,处理器将会进入一种不可预知的状态。 |
中断禁止位 |
I、F位为中断禁止位,当它们被设置成1时可以相应的禁止IRQ和FIQ中断。 |
模式位 |
M4,M3,M2,M1和M0位(M[4:0])是模块位,它们决定了处理器的操作模式,如下表2-7所示。并不是所有的模块组合位都决定一个有效的处理器模式,只有那些明确地描述值才能被使用,用户必须意识到任何一种非法的值写入模块位,处理器都会进入到一种不可重获的状态,如果这种情况发生,就要进行复位。 |
保留位 |
PSR中的其余位为为保留位,当改变PSR中的位或者控制位时,必须确保保留位不被改变,在程序中也不要使用保留位来存储数据值。因此在将来的处理器中它们也许作为1或0来读。 |
保留位
2.8异常
2.8.1进入异常时的行为
当一个异常发生时,ARM920T将进行以下步骤:
1.
2.
3.
4.
这时也可能设置中断禁止标志,以防止不可估计的异常嵌套发生。
当处理器处于Thumb状态时发生了异常,当PC载入异常矢量所在地址时,它将自动的切换到ARM状态。
2.8.2离开异常处理时的行为
当完成异常处理时:
1.
2.
3.
注意:你不需要特别指明切换回THUMB状态。因为原来的CPSR被自动的保存到了SPSR。
2.8.3异常进入/退出的总结
不管是ARM还是Thumb状态下的异常,FIQ处理程序都可以通过执行以下的语句来退出中断处理:
通过设置CPSR的F标记位可以禁止FIQ中断(但是要注意到在用户模式下是不可行的)。如果F标记位已经清除,ARM920T在每个指令的最后检测来自FIQ中断同步器的低电输出。
2.8.5
IRQ(中断请求)异常是由nIRQ输入低电平引发的普通中断。IRQ中断相对FIQ中断来说是优先级低,当一个FIQ中断序列进入时它将被屏蔽。IRQ也可以通过设置CPRS中的“I”标志来禁止,只能在特权(非用户)模式下这样做。
无论
SUBS
2.8.6
异常中止表示当前存储访问不能完成。通过外部的ABORT输入信号来告知内核。ARM920T在每次的存储操作中检测该异常是否发生。
●
●
如果产生预取指中止,所取得的指令将会被标志为无效的,但是异常不会立即发生,要直到取指到达了管道的头部才会发生。/如果这些指令不执行-例如在管道内发生了分支跳转,那么异常就不会发生了。
如果产生数据异常中止,根据指令类型进行操作:
●
●
●
在完成
通过执行该语句,就恢复了PC和CPSR,并重试被中断的指令。
2.8.7软件中断
SWI(软件中断指令)用来进入超级用户模式,通常用于请求特殊的超级用户功能。SWI的处理程序通过执行以下状态(ARM或Thumb)的语句,退出异常处理;
注意:
2.8.8未定义指令
当ARM920T遇到一个它不能执行的指令,它将产生一个未定义指令陷阱。这个机制是软件仿真器用来扩展Thumb和ARM指令集用的。
在完成对未知指令的处理后,陷阱处理程序应该执行以下的语句退出异常处理(无论是ARM或Thumb状态):
通过执行该语句,恢复了CPSR,并返回执行未定义指令的下一条指令。
2.8.9
异常中断向量的地址如下图所示:
地址 |
异常中断类型 |
进入时处理器模式 |
0x00000000 |
Reset |
Supervisor |
0x00000004 |
Undefined |
Undefined |
0x00000008 |
Software |
Supervisor |
0x0000000C |
Abort |
Abort |
0x00000010 |
Abort |
Abort |
0x00000014 |
Reserved |
Reserved |
0x00000018 |
IRQ |
IRQ |
0x0000001C |
FIQ |
FIQ |
2.8.10异常中断优先级
当多个异常中断同时发生时,处理器根据一个固定的优先级系统来决定处理他们的顺序。
最高优先级:
1.
2.
3.
4.
5.
最低优先级:
6.
并非所有的异常中断都可能同时发生:
2.8.11中断反应时间
最坏情况下的FIQ中断的反映时间,假设它是使能的,包括通过同步器最长请求时间(如果是异步则是Tsuncmax),加上最长指令的完成时间(Tldm,最长指令是LDM,它装载了所有的寄存器包括PC),加上数据abort进入时间(Texc),加上进入FIQ所需要的时间(Tfiq).。在这些时间的最后,ARM920T会执行位于0x1C的指令。
2.8.12
当nRESET信号为低,ARM920T放弃任何指令的执行,并从增加的字地址处取指令。
当nRESET信号为高时ARM920T进行如下操作:
1
2
3
4