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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)