ARM处理器状态如何切换?详细说明切换过程?

ARM处理器状态如何切换?详细说明切换过程?,第1张

状态切换方法:

arm指令集和thumb指令集均有切换处理器状态的指令,并可在两种工作状态之间切换,

但arm微处理器在开始执行代码时,应该处于arm状态。

进入thumb状态:当 *** 作数寄存器的状态位(位0)为1时,可以采用执行bx指令的方法,

使微处理器从arm状态切换到thumb状态。

此外,当处理器处于thumb状态时发生异常(如irq、fiq、undef、abort、swi等),则异常处理返回时,自动切换到thumb状态。

进入arm状态:当 *** 作数寄存器的状态位为0时,执行bx指令时可以使微处理器从thumb状态切换到arm状态。

此外,在处理器进行异常处理时,把pc指针放入异常模式链接寄存器中,并从异常向量地址开始执行程序,

也可以使处理器切换到arm状态

ARM微处理器支持7种运行模式,分别为:

用户模式(usr):ARM处理器正常的程序执行状态。

快速中断模式(fiq):用于高速数据传输或通道处理。

外部中断模式(irq):用于通用的中断处理。

管理模式(svc): *** 作系统使用的保护模式。

数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。  统模式(sys):运行具有特权的 *** 作系统任务。

定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。

ARM微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。

ARM 内核工作模式的切换是要自己写代码的, 设置CPSR 寄存器低5位进行切换

0b10001 快速中断模式

0b10010 中断模式

0b10011 管理模式

0b10111 中止模式

0b11011 未定义

0b11111 系统模式

以下代码就是切换CPU工作模式的示例

********** Begin init stact ***********/

在6种模式下切换并设置堆栈指针

MRS R0,CPSR 把CPSR读取到R0

BIC R0,#0x1f 低5位清零

LDR R1,=MODE_Fiq 设置R1 为0b10001

ORR R0,R0,R1R0和R1相或,设置低5位

MSR CPSR_c,R0 把R0的值重新赋值到CPSR

LDR SP,=Stact_Fiq

BIC R0,#0x1f 低5位清零

LDR R1,=MODE_Irq

ORR R0,R0,R1

MSR CPSR_c,R0

LDR SP,=Stact_Irq

BIC R0,#0x1f 低5位清零

LDR R1,=MODE_Svc

ORR R0,R0,R1

MSR CPSR_c,R0

LDR SP,=Stact_Svc

BIC R0,#0x1f 低5位清零

LDR R1,=MODE_Abort

ORR R0,R0,R1

MSR CPSR_c,R0

LDR SP,=Stact_Abort

BIC R0,#0x1f 低5位清零

LDR R1,=MODE_Undef

ORR R0,R0,R1

MSR CPSR_c,R0

LDR SP,=Stact_Undef

BIC R0,#0x1f 低5位清零

LDR R1,=MODE_Sys

ORR R0,R0,R1

MSR CPSR_c,R0

LDR SP,=Stact_Sys


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8056801.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存