ARM七种运行模式.docx
《ARM七种运行模式.docx》由会员分享,可在线阅读,更多相关《ARM七种运行模式.docx(12页珍藏版)》请在冰豆网上搜索。
![ARM七种运行模式.docx](https://file1.bdocx.com/fileroot1/2023-1/5/e7a2d18e-4790-434f-bb21-a081e3f0a5ad/e7a2d18e-4790-434f-bb21-a081e3f0a5ad1.gif)
ARM七种运行模式
s3c2440中断体系结构:
如何用中断?
1.中断发生:
保存别人的状态
如何中断可以事先设置,对程序初始化,使能中断。
中断发生后,进入中断模式
2.中断处理
分辨中断源
进行不同的处理
清理工作
3.恢复别人的状态
过程:
外界信号上升沿、下降沿,高电平、低电平都可以设置成信号
引脚设置,再进入状态寄存器。
状态寄存器连接屏蔽寄存器
进入第二个状态寄存器,储存各种中断,可以储存多个中断
进入优先级寄存器,判断中断运行顺序
再进入屏蔽使能寄存器和模式寄存器
进入优先级寄存器
进入cpu处理
cpu的处理:
进入入口地址bhandleIRQ
计算返回地址,被中断处地址
保存现场,即各寄存器状态
调用处理函数
函数运行完后恢复现场
函数的处理:
分辨终端
处理中断
清除数据,即清除中断
1.中断寄存器
arm的七种模式
1.usr用户模式r0-r15
2.fiq快中断模式r0-r7
专用寄存器r8-r15,
3.svc管理模式
专用寄存器r13-r14,
4.abt数据访问终止模式
5.sys系统模式
6.und未定义指令终止模式
7.irq中断模式
几种模式的区别:
嵌入式的中断:
a.不同的寄存器
b.不同的权限
c.触发条件不一样
何时使用几种模式:
usr用户模式:
arm处理器正常的程序执行状态
fiq快中断模式:
高速数据传输和通道处理
svc管理模式:
操作系统使用的保护模式
abt数据访问终止模式:
数据或者指令终止时进入,用于虚拟存储或者存储保护
sys系统模式:
运行具有特权的操作系统任务
und未定义指令终止模式:
未定义的指令执行时进入该模式,用于支持硬件处理器的软件仿真.
irq中断模式:
用于通用的中断处理
后六种是特权模式,用于处理中断、异常和特殊权限处理
用户模式是最常见的模式
2.中断中的异常
中断是一种异常。
当发生中断时,cpu进入中断模式
cpu进入异常入口,异常入口是硬件规定的一个地址
运行模式
ARM920T支持7种运行模式:
●用户(usr)):
正常ARM程序执行状态
●快中断(fiq)):
为支持数据传输或通道处理设计
●中断(irq)):
用于一般用途的中断处理
●管理(svc)):
操作系统保护模式
●中止(abt):
数据或指令预取中止后进入
●系统(sys)):
操作系统的特权用户模式
●未定义(und)):
执行了一个未定义指令时进入
模式的改变可由软件控制,或者由外部中断或进入异常引起。
大部分应用程序都将在用户模式执行。
被称为特权模式的非用户模式,都将进入到中断服务或异常中去,或者访问受保护的资源。
内部寄存器
ARM920T总共有37个寄存器,其中31通用32位寄存器和6个状态寄存器,但不能在同一时刻对所有的寄存器可见。
处理器状态和运行模式决定了哪些寄存器对程序员可见。
ARM状态时内部寄存器集在ARM状态,16个通用寄存器和一个状态寄存器在任意时刻都可见。
在特权(非用户)模式下,将切换到指定模式的分组(banked)寄存器。
图2-3显示了哪些寄存器在各模式下是可见的:
分组寄存器被标记了阴影三角形。
ARM状态时寄存器被设为包含16个直接可以访问的寄存器:
R0到R15。
除了R15,其他全部寄存器都为通用寄存器,如可能用于保存数据或地址值。
除此之外,还有第17个寄存器用于存储状态信息。
FIQ模式包含7个分组寄存器,分别映射到R8-14(R8_fiq-R14_fiq)。
在ARM状态,有很多不需要保存寄存器的FIQ处理程序。
用户,IRQ,管理中止和未定义模式都包含两个分组寄存器映射到R13和R14,允许这些模式都都包含私有堆栈指针和链接寄存器。
Thumb状态时内部寄存器集
Thumb状态时的寄存器集为ARM状态时的寄存器的分配的一个子集。
程序员能够直接访问8个通用寄存器R0至R7,还有程序计数器(PC),一个堆栈指针寄存器(SP),一个链接寄存器(LR)和CPSR。
各自特权模式还分别有分组堆栈指针,链接寄存器和进程保存状态寄存器(SPSR)。
如图2-4所示。
Thumb状态访问高寄存器(Hi-Registers)
在Thumb状态,寄存器R8-R15(“Hiregisters”)不是标准的寄存器集的一部分。
然而,汇编语言程序员可以受限的对它们的进行访问,可以将它们用于快速暂存。
使用MOV指令的特殊变量可以将一个值从R0-R7(“Loregister”)范围内的寄存器传送到高寄存器或从高寄存器到第低寄存器。
使用CMP和ADD指令也可以对高寄存器的值与寄存器的值进行比较以或相加。
更多内容请参考表3-34。
程序状态寄存器
ARM920T包含了一个当前程序状态寄存器(CurrentProgramStatusRegister-CPSR),还有5个用于异常程序处理的程序状态保存寄存器(SavedProgramStatusRegisters-SPSR)。
这些寄存器的功能为:
●保存最近已处理的ALU操作的信息
●控制中断的使能与禁止
●设置处理器的运行模式
图2-6显示了各位的编排
状态代码标志位
N,Z,C和V位为状态代码标志位。
算术或逻辑操作结果可能会改变这些位,并检验以决定是否应该执行某条指令。
在ARM状态,所有指令都可能为条件执行:
详情见表3-2。
在Thumb状态,只有分支指令才能条件执行:
详情见表3-46。
控制位
PSR(包含I,F,T和M[4:
0])的末端8位,统称为控制位。
当发生异常时将会改变这些位。
如果处理器运行在特权模式,它们也可由软件控制。
异常:
程序暂时停止
当正常程序流程被暂时停止发生异常,例如响应一个来自外设的中断。
在处理异常前,必须保护当前的处理器状态,以便在完成处理程序后能恢复到原来的程序。
如果同时发生好几个异常,将会按照固定的顺序来分配,见P2-13的异常优先级。
进入异常行为
当处理一个异常时,ARM920T将会进行以下活动:
1.相应链接寄存器保存下条指令的地址。
如果在ARM状态进入异常,下条指令的地址将会复制到链接寄存器(当前PC+4或PC+8,由异常决定。
详情见表2-2)中。
如果在Thumb状态进入异常,写入链接寄存器的值则为当前PC偏移一个值,这样异常返回后程序能从正确的位置恢复。
这意味着异常处理不需要确定异常是从什么状态进入的。
例如,在SWI的情况,无论是在ARM状态还是Thumb状态执行SWI,MOVSPC,R14_svc语句都将返回到下一条指令。
2.复制CPSR的内容到相应SPSR中。
3.根据异常类型强制将CPSR模式位设为某一个值。
4.强制PC从相关异常向量处取下条指令。
通常也会置位中断禁止标志位,以防止不同的难处理的异常嵌套。
如果一个异常发生时处理器处于Thumb状态,当装载异常向量地址到PC时会自动切换到ARM状态。
离开异常行为:
当异常结束,异常处理程序将会:
1.将链接寄存器适当减去一个偏移量并放入到PC中。
(偏移量由异常类型决定)
2.复制SPSR的内容返回给CPSR中。
3.如果在异常进入时置位了中断禁止标志位异常,清除中断禁止标志位。
注意:
不需要在异常结束时切换回Thumb状态,因为在异常前会立刻保存CPSR中T位的值到SPSR中,并在退出异常时从SPSR恢复到CPSR中。
异常进入/退出总结
表2-2总结了进入异常时保存在相关R14中的PC值和被推荐的退出异常的指令。
注释:
1.此处PC为含预取中止的BL/SWI/未定义指令取指令的地址。
2.此处PC为由于FIQ或IRQ抢先而未执行的指令地址。
3.此处PC为发生了数据中止的Load或Store指令的地址。
4.当复位时保存在R14_svc的值将是不可预测的。
快中断FIQ
FIQ(快中断请求)异常是为支持数据传输或通道处理而设计的,在ARM状态拥有足够的私有寄存器来消除对寄存器保存的需求(这样最小化了对上下文的切换的开销)。
将nFIQ输入端拉低可以实现外部产生FIQ。
由ISYNC输入信号端的状态决定是同步还是异步传输。
当ISYNC为低电平,认为nFIQ和nIRQ为异步,中断前会引起同步周期延迟并影响处理器流程。
无论是从ARM还是Thumb状态进入的异常,FIQ处理时执行SUBSPC,R14_fiq,#4
时,都应该避免中断。
如果设置CPSR的F标志位,FIQ将会被禁止(但主义这不可能在用户模式中发生)。
如果F标志位为零,ARM920T将在每条指令末检测FIQ同步发生器的输出是否为低电平。
中断IRQ
IRQ(中断请求)异常是一个由nIRQ输入端的低电平产生的一个普通中断。
IRQ的优先级低于FIQ,当进入了相关的FIQ,会屏蔽IRQ。
除非是在特权(非用户)模式,其他任何时刻都禁止设置CPSR内的I位。
无论是从ARM还是Thumb状态进入的异常,IRQ处理时执行SUBSPC,R14_fiq,#4
时,都应该避免中断。
中止
中止表示不能完成当前对存储器的访问。
通过外部ABORT输入端指示的。
ARM920T在存储器访问周期期间检测中止异常。
有两种类型的中止:
●预取中止(PrefetchAbort):
发生在指令预取期间
●数据中止(DateAbort):
发生在数据访问期间
如果发生预取中止,将屏蔽预取指并为无效,但并不会立刻带来异常,直到指令到达流水线的执行阶段才发生。
若未执行该指令,将不会发生中止,因为流水线发生了分支。
如果发生数据中止,由指令类型决定其行为:
●单一的数据转移指令(LDR,STR)回写到被修改的基址寄存器:
中止处理程序必须意识到这点。
●交换指令(SWP)执行失败,就如同没有被执行。
●块数据转移指令(LDM,STM)完成。
如果设置了回写,基址寄存器将被更新。
如果指令会覆盖基址寄存器数据(转移列表中包含基址),覆盖将会被阻止。
表明了中止后所有寄存器的覆盖都会被阻止,特别是R15(通常是最后转移的寄存器)在一个被中止的LDM指令会被阻止覆盖。
中止机制使得分页虚拟存储器系统可以被实现。
在这样一个系统中允许处理器产生任意地址。
当无法获取某一地址上的数据时,内存管理单元(MemoryManagementUnit-MMU)将表明产生一个中止。
中止处理程序必须紧接着找出中止原因,使得被请求的数据可用并重试被中止的指令。
应用程序并不需要了解可以使用的内存总量,也不需要关心中止对其状态以任何方式被影响。
当确定中止原因后,处理程序应该不顾状态(ARM或Thumb)执行下列语句:
SUBSPC,R14_abt,#4;预取中止
SUBSPC,R14_abt,#8;数据中止
这将恢复PC和CPSR,并重试被中止的指令。
软件中断SWI
软件中断指令(SoftwareInterruptInstruction-SWI)用于进入管理模式,通常请求一个特定的管理功能。
SWI处理程序应当在状态(ARM或Thumb)中通过执行下列指令返回:
MOVPC,R14_svc
这将恢复PC和CPSR,并返回到SWI之后的指令。
注意:
nFIQ,nIRQ,ISYNC,LOCK,BIGEND和ABORT引脚只存在于ARM920TCPU内核之中。
未定义指令
当ARM920T遇到不能处理的指令时,将产生未定义指令陷阱。
这个机制可以用于软件仿真扩展Thhumb指令集或ARM指令集。
仿真了失败指令后,陷阱处理程序应该执行在状态(ARM或Thumb)中执行下列指令:
MOVSPC,R14_und
这将恢复CPSR,并返回到未定义指令之后的指令。
异常向量
下表显示了异常向量地址
异常优先级
当同时出现多个异常时,一个固定的优先级系统将确定它们的处理顺序:
高优先级:
1.复位
2.数据中止
3.快中断FIQ
4.中断IRQ
5.预取中止
低优先级:
6.未定义指令,软件中断
并不是所有的异常都可以在同一时刻发生!
未定义指令和软件中断异常互斥,因为它们分别对应于当前指令的的特定(非重叠)译码。
如果发生数据中止的同时发生FIQ并且又使能了FIQ(CPSR的F标志位被清零),ARM920T将先进入数据中止处理程序,然后立即转向FIQ向量。
当从FIQ正常返回将会引起数据中止处理程序恢复执行。
为了确保传输错误不会在检测中被遗漏,必须将数据中止置为比FIQ更高的优先级。
进入此异常的时间需要按加上最坏情况下FIQ的时间延迟来算。
中断延迟
当使能了FIQ,其最坏情况的延迟包括:
请求通过同步器的最长时间(Tsyncmax,如果为异步),加上完成最长指令的时间(Tldm,最长指令是装载包括PC在内所有的寄存器的LDM指令),加上数据中止进入的时(Texc),
再加上FIQ进入的时间(Tfiq)。
在该时间末ARM920T将会执行位于0x1C处的指令。
Tsyncmax为3个才处理器周期,Tldm为20个周期,Texc为3个周期,Tfiq为2个周期。
因此总时间为28个处理器周期。
在一个使用连续20MHz处理器时钟的系统中,其只过了1.4毫秒。
最大IRQ延迟的计算与此类同,
但还必须实际考虑,FIQ具有更高的优先级并且能推迟任意长度的时间进入到IRQ处理程序。
FIQ或IRQ最小延迟包括请求通过同步器的最短时间(Tsyncmin)加上Tfiq。
此时为4个处理器周期。
复位
当nRESET信号端变为低电平时,ARM920T将放弃正在处理的指令,然后从递增(incrementing)字地址继续取指令。
当nRESET信号端变为高电平时,ARM920T将:
1.复制当前PC和CPSR的值覆盖到R14_svc和SPSR_svc中。
未定义保存的PC和SPSR的值
2.强制将M[4:
0]设置为10011(管理模式),置位CPSR中的I和F位并清除CPSR的T位。
3.强制PC从0x00地址开始对下一条指令的取指。
4.在ARM状态恢复执行。
(注:
可编辑下载,若有不当之处,请指正,谢谢!
)