您的当前位置:首页第二章 arm2410处理器工作模式

第二章 arm2410处理器工作模式

2021-10-14 来源:小侦探旅游网


第二章 处理器工作模式

2.1概述

S3C2410A采用了非常先进的ARM920T内核,它是由ARM(Advanced RISC Machines)公司研制的。

2.2处理工作状态

从程序员的角度上看,ARM920T可以工作在下面两种工作状态下的一种:

ARM状态:执行32位字对齐的ARM指令;

THUMB状态:执行16位半字对齐的THUMB指令。在这种状态下,PC寄存器的第1位来选择一个字中的哪个半字。

注意:这两种状态的转换不影响处理模式和寄存器的内容。

2.3切换状态

进入Thumb状态

进入Thumb状态,可以通过执行BX指令,同时将操作数寄存器的状态位(0位)置1来实现。

当从异常(IRQ,FIQ,UNDEF,ABORT,SWI等)返回时,只要进入异常处理前处

理器处于Thumb状态,也会自动进入Thumb状态。

进入ARM状态

进入ARM状态,可以通过执行BX指令,并且操作数寄存器的状态位(0位)清零来实现。

当处理进入异常(IRQ,FIQ,RESET,UNDEF,ABORT,SWI等)。这时,PC值保持在异常模式下的link寄存器中,并从异常向量地址处开始执行处理程序。

存储空间的格式

ARM920将存储器空间视为从0开始由字节组成的线性集合,字节0到3中保存了第一个字节,字节4到7中保存第二个字,依此类推,ARM920T对存储的字,可以按照小端(Little endian)或大端(Big endian)的方式对待。

大端格式:

在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,如图所示:

小端格式:

与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。

2.4指令长度

指令可以是32位长度(在ARM状态下)或16位长度(在THUMB状态)。

数据类型

ARM920T支持字节(8位),半字(16位)和字(32位)数据类型。字必须按照4

字节对齐,半字必须是2字节对齐。

2.5操作模式

ARM920T支持7种操作模式:

用户模式(user模式),运行应用的普通模式;

快速中断模式(fiq模式),用于支持数据传输或通道处理;

中断模式(irq模式),用于普通中断处理。

超级用户模式(svc模式),操作系统的保护模式

异常中断模式(abt模式),输入数据后登入或预取异常中断指令

系统模式(sys模式),是操作系统使用的一个有特权的用户模式

未定义模式(und模式),执行了未定义指令时进入该模式

外部中断,异常操作或软件控制都可以改变中断模式。大多数应用程序都时是在用户模式下运行。进入特权模式是为了处理中断或异常请求或操作保护资源服务的。

2.6寄存器

ARM共有37个32位的寄存器,其中31个是通用寄存器,6个是状态寄存器。但在同一

时间,对程序员来说并不是所有的寄存器都可见。在某一时刻存储器是否可见(可被访问),是由处理器当前的工作状态和工作模式决定的。

ARM状态寄存器

在ARM状态下,任何时刻都可以看到16个通用寄存器,1或2个状态寄存器。在特权模式(非用户模式)下会切换到具体模式下的寄存器组,其中包括模式专用的私有(banked)寄存器。图2-3显示了在每个模式下哪种寄存器是可见的:私有寄存器上都有一个黑三角标记。

ARM状态寄存器系列中含有16个直接操作寄存器:R0到R15。除了R15外其他的都是通用寄存器,可用来存放地址或数据值。除此之外,实际上有17个寄存器用来存放状态信息。具体说明如下:

寄存器14:专职持有返回点的地址,在系统执行一条“跳转并链接(link)”(BL)指令的时候,R14将收到一个R15的拷贝。其他的时候,它可以用作一个通用寄存器。相应的它在其他模式下的私有寄存器R14_svc,R14_irq,R14_fiq,R14_abt和R14_und都同样用来保存在中断或异常发生时,或时在中断和异常中执行了BL指令时,R15的返回值。

寄存器15是程序计数器(PC)。在ARM状态下,R15的bits[1:0]为0,bits[31:2]保存了PC的值。在Thumb状态下,bits[0]为0同时bits[31:1]保存了PC值。

寄存器16是CPSR(当前程序状态寄存器),用来保存当前代码标志和当前处理器模式位。

FIQ模式拥有7个私有寄存器R8-14(R8_fiq-R14_fiq)。在ARM状态下,多数FIQ处理都不需要保存任何寄存器。用户、中断、异常中止,超级用户和未定义模式都拥有2个私有寄存器,R13和R14。允许这些模式都可拥有1个私有堆栈指针和链接(link)寄存器。

ARM状态下寄存器集

THUMB状态寄存器

THUMB状态寄存器是ARM状态寄存器的一个子集。程序员可以直接操作8个通用寄存器R0-R7,同样可以这样操作程序计数器(PC),堆栈指针寄存器(SP),链接(link)寄存器(LR),和CPSR。它们都是各个特权模式下的私有寄存器。如下图所示:

ARM920T包含一个当前程序状态寄存器(CPSR)和五个备份的程序状态寄存器(SPSRs),备份的程序状态寄存器用来进行异常处理,这些寄存器的功能包括:

保存ALU当前操作的有关信息

控制中断的允许和禁止

设置处理器的运行模式

程序状态寄存器的组成如图所示:

ARM和THUMB状态寄存器间的关系:

• THUMB态下R0-R7和ARM状态下R0-R7是等同的

• THUMB状态的CPSR和SPSRs 跟ARM 状态的CPSR 和SPSRs是等同的

• THUMB 状态下的SP映射在ARM状态下的R13上

• THUMB 状态下的LR映射在ARM状态下的R14上

• THUMB 状态下的程序计数器映射在ARM状态下的程序计数器上(R15)

在THUMB状态下访问高地址寄存器:

在THUMB状态下寄存器R8-15(高地址寄存器)不是标准寄存器集。但是,汇编语言的程序员可以访问它们并用它们作快速暂存。

向R8-R15写入或读出数据,可以采用MOV指令的某个变型,从R0-R7(低地址寄存器)的某个寄存器传送数据到到高地址寄存器,或者从高地址寄存器传送到低地址寄存器。还可以采用CMP和ADD指令,将高地址寄存器的值与低地址寄存器的值相进行比较或相加。

2.7程序寄存器状态

ARM920T具有一个当前程序状态寄存器(CPSR),另外还有5个保存程序状态寄存器(SPSRs)用于异常中断处理。这些寄存器的功能有:

保留最近完成的ALU操作的信息;

控制中断的使能和禁止;

设置处理器的操作模式。

下图显示了程序状态寄存器的位定义:

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中的条件码标志位或者控制位时,必须确保保留位不被改变,在程序中也不要使用保留位来存储数据值。

PSR模式位的值

2.8异常

当正常的程序执行流程被临时中断时,称为产生了异常。例如程序执行转向一个外设

的中断请求。在异常能被处理前,当前处理器的状态必须被保留,这样按处理程序完成时就能恢复原始的程序。

有可能同时产生好几个异常,如果出现这种情况,就应该按固定的顺序处理。详情请看后面对异常优先级的说明。

2.8.1进入异常时的行为

当一个异常发生时,ARM920T将进行以下步骤:

1. 将下一条指令的地址保存到相应的Link寄存器中。如果异常是从ARM状态进入的,下一条指令的地址(根据异常的类型,数值为当前PC+4或PC+8,具体请看表2-8)拷贝到Link寄存器。如果异常是从THUMB状态进入,那么写入到link寄存器的值是当前的PC偏移一个值。这表示异常处理程序不需要关心是从哪种状态进入异常的。例如,在SWI情况下,无论是来自什么状态,处理程序只要采用MOVS PC, R14_svc语句,总可以返回到原始程序的下一条语句。

2. 拷贝CPSR到相应的SPSR;

3. 根据异常类型强制改变CPRS模式位的值;

4. 令PC的值指向异常处理向量所指的下一条指令。

这时也可能设置中断禁能标志,以防止不可估计的异常嵌套发生。

当处理器处于Thumb状态时发生了异常,当PC载入异常矢量所在地址时,它将自动地

切换到ARM状态。

2.8.2离开异常处理时的行为

当完成异常处理时,处理程序应该:

1. 将Link寄存器,减去相应的偏移量,赋给PC(偏移量的值由异常的类型决定);

2. 拷贝回SPSR到CPSR;

3. 如果在进入中断时设置了中断禁止标志,清除它。

注意,你不需要特别指明切换回THUMB状态。因为原来的CPSR被自动地保存到了SPSR。

2.8.3异常进入/退出的总结

表2-8总结了在进入异常时,保留到相应的R14中的PC的值, 和推荐使用的退出异常处理时采用的语句。

注意:

1.这里PC所赋的是BL/SWI/未定义模式等指令所取的地址,它们在预取的阶段就被中断了。

2.这里PC所赋的是由于FIQ或IRQ取得了优先权,而没有来得及得到执行的指令地址。

3.这里PC所赋的地址是Load或Store指令的地址,它们在执行时产生了数据的异常中断。

4.在R14_svc复位之前保存的数值是不可预知的。

2.8.4 FIQ中断

FIQ(快速中断请求)异常通常是用来支持数据传输和通道操作的,在ARM状态下,它具有充分的私有(私有)寄存器,用来减少寄存器存取的需要(从而减少进入中断前的“上下文切换”的工作)。

FIQ中断是由外部设备通过拉低nFIQ引脚触发的。通过对ISYNC 输入引脚的控制nFIQ可以区别同步或异步的传输情况。当ISYNC为低电平,nFIQ 和nIRQ将被认为是异步的,中断之前产生同步周期延长的话会影响处理器的流程。

不管是ARM还是Thumb状态下的异常,FIQ处理程序都可以通过执行以下的语句来退出中断处理:

SUBS PC, R14_fiq, #4

通过设置CPSR的F标记位可以禁止FIQ中断(但是要注意到在用户模式下是不可行的)。如果F标记位已经清除,ARM920T在每个指令的最后检测来自FIQ中断同步器的低电输出。

2.8.5 IRQ中断

IRQ(中断请求)异常是由nIRQ 输入低电平引发的普通中断。IRQ中断相对FIQ中断来说是优先级低,当一个FIQ中断序列进入时它将被屏蔽。IRQ也可以通过设置CPRS中的“I”标志来禁止,同样也不能够在用户模式中这样做(只能在特权模式下这样做)。

无论IRQ发生在ARM或者Thumb状态下,都可以采用以下语句来退出中断处理:

SUBS PC, R14_irq, #4

2.8.6 Abort异常中止

异常中止表示当前存储访问不能完成。通过外部的ABORT输入信号来告知内核。ARM920T在每次的存储操作中检测该异常是否发生。

有两种类型的异常中止:

预取指异常中断:指令预取时产生

数据异常中断:数据访问时产生

如果产生预取指中止,所取得的指令将会被标志为无效的,但是异常不会立即发生,要直到取指到达了管道的头部才会发生。如果这些指令不执行——例如在管道内发生了分

支跳转,那么异常就不会发生了。

如果产生数据异常中止,根据指令类型进行操作:

简单数据传输指令(LDM,STR)写回改变的基址[变址]寄存器:异常中断处理器必须清楚这些。

取消交换指令尽管它还没执行;

数据块传输指令(LDM, STM)完成。如果设置为写回,基址已经校正。如果指令超出了数据的写基址(传输目录中有它的基址),就应该防止写超出。在中止异常将发生时,所有寄存器的覆盖写入都是禁止的。这意味着特别是R15(经常是最后一个改变的寄存器)的值将在中止的LDM指令中保留下来。

Abort机制使得页面虚拟存储器机制得以实现。在采用虚拟存储器的系统中,处理器可以产生任意的地址。当某个地址的数据无效,MMU(存储器管理单元)将产生一个abort中止。这样abort的处理程序就必须找出异常中断的原因,使要求的数据可用,并重试被中止掉的指令。应用程序也就不需要了解实际可用存储空间的大小,也不需要了解异常中断对它的影响。

在完成了异常中断的处理后,通过以下语句退出中断处理(与ARM状态还是Thumb状态无关):

SUBS PC, R14_abt, #4 ; 预取指abort

SUBS PC, R14_abt, #8 ; 数据abort

通过执行该语句,就恢复了PC和CPSR,并重试被中断的指令。

2.8.7软件中断

SWI(软件中断指令)用来进入超级用户模式,通常用于请求特殊的超级用户功能。SWI的处理程序通过执行以下语句,退出异常处理(ARM或Thumb):

MOV PC, R14_svc

通过执行该语句,就恢复了PC和CPRS,并返回到SWI后面的指令上。

注意:

前面提到的nFIQ, nIRQ, ISYNC, LOCK, BIGEND, 和ABORT引脚只存在于ARM920T CPU的内核上。

2.8.8未定义指令

当ARM920T遇到一个它不能执行的指令,它将产生一个未定义指令陷阱。这个机制是软件仿真器用来扩展Thumb和ARM指令集用的。

在完成对未知指令的处理后,陷阱处理程序应该执行以下的语句退出异常处理(无论是ARM或Thumb状态):

MOVS PC, R14_und

通过执行该语句,恢复了CPSR,并返回执行未定义指令的下一条指令。

2.8.9异常中断向量

异常中断的向量地址如下图所示:

2.8.10异常中断优先级

当多个异常中断同时发生时,处理器根据一个固定的优先级系统来决定处理它们的顺序。

最高优先级:

1.复位

2.数据 abort

3. FIQ

4. IRQ

5. 预取指 abort

最低优先级:

6.未定义指令,软件中断。

注意,并非所有的异常中断都可能同时发生:

未定义指令和软件中断是相互排斥的,因为它们都对应于当前指令的唯一的(非重叠的)解码结果。

如果一个数据abort和FIQ中断同时发生了,并且此时的FIQ中断是使能的,ARM920T先进入到数据abort处理程序,然后立即进入FIQ向量。从FIQ正常的返回后,数据abort的处理程序才恢复执行。将数据abort设计为比FIQ拥有更高的优先级,可以确保传输错误不能逃避检测。这种情况下进入FIQ异常处理的时间延长了,这一时间必须考虑到FIQ中断最长反应时间的计算中去。

2.8.11中断反应时间

最坏情况下的FIQ中断的反应时间,假设它是使能的,包括通过同步器最长请求时间(如果是异步则是Tsyncmax),加上最长的指令执行时间(Tldm,LDM指令用于载入所有的寄存器,因此需要最长的执行时间),加上数据abort进入时间(Texc),加上进入FIQ处理

所需要的时间(Tfiq)。在这些时间的最后,ARM920T会执行位于0x1C的指令。

Tsyncmax 是3个处理器周期,Tldm 是20个,Texc是3个,Tfiq是2个周期。也就是总是28个处理周期。在一个20MHZ的处理时钟的系统里,它使用的时间超过1.4微妙。最长的IRQ反应时间的计算方法是类似的,但是必须考虑到更高优秀级的FIQ中断可以推迟任意长时间进入IRQ中断处理。最小的FIQ或IRQ的反应时间包括通过同步器的时间Tsyncmax加上Tfiq,它是4个处理器周期。

2.8.12复位

当nRESET信号为低,ARM920T放弃任何指令的执行,并从增加的字地址处取指令。

当nRESET信号变高时ARM920T进行如下操作:

1. 将当前的PC值和CPSR值写入R14_svc和 SPSR_svc。已保存的PC和SPSR的值是未知的。

2. 强制M[4:0]为10011 (超级用户模式),将CPSR中的“I”和“F”位设为1,并将T位清零;

3. 强制PC从0x00地址取得下一条指令。

4. 恢复为ARM状态开始执行。

因篇幅问题不能全部显示,请点此查看更多更全内容