实验三 ARM 微处理器工作模式实验
一、实验目的
(1) 掌握学会使用MSR/MRS 指令实现ARM 处理器工作模式的切换
(2) 观察不同模式下的寄存器,加深对CPU 结构的理解。
二、实验设备
(1)硬件:嵌入式实验平台一套、仿真器一个、PC 机一台。
(2)软件:μVision IDE for ARM集成开发环境,Windows 98/2000/NT/XP。
三、实验内容
(1)通过ARM 汇编指令,在各种处理器模式下切换并观察各种模式下寄存器的区别;
(2)掌握ARM 不同模式的进入与退出。
四、实验原理
1.ARM 处理器模式
ARM 体系结构支持7种处理器模式:
(1) 用户模式USR: 正常程序执行模式;
(2) 快速中断模式FIQ:支持快速数据传送或通道处理;
(3) 外部中断模式IRQ:用于通用中断处理;
(4) 管理模式SVC:操作系统保护模式;
(5) 中止模式ABT: 实现虚拟存储器和/或存储器保护
(6)未定义模式UND:支持硬件协处理器的软件仿真
(7)系统模式SYS: 运行操作系统任务
在软件控制下可以改变模式,外部中断或异常处理也可以引起模式发生改变。大多数应用程序在用户模式下执行。当处理器工作在用户模式时,正在执行的程序不能访问某些被保护的系统资源,也不能改变模式,除非异常发生。这允许适当编写操作系统来控制系统资源的使用。除用户模式外的其他模式成为模式。它们可以自由地访问系统资源和改变模式。其中5 种称为异常模式,即:FIQ (Fast Interrupt Request)、IRQ (Interrupt Request)、管理 (Supervisor)、中止 (Abort)、未定义 (Undefined)。
当特定的异常出现时,进入相应的模式。每种模式都有某些附加的寄存器,以避免异常出现时用户模式的状态不可靠。其余模式是系统模式。仅ARM 体系结构V4 以及以上的版本有该模式。不能由于任何异常而进入该模式。它与用户模式有相同的寄存器,但它是模式,不受用户模式的。它供需要访问系统资源的操作系统任务使用,但希望避免使用与异常模式有关的附加寄存器。避免使用附加寄存器保证了当任何异常出现时,都
不会使任务的状态不可靠。
2.程序状态寄存器
在所有处理模式下,都可以访问当前程序状态寄存器CPSR。CPSR包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。每种异常模式都有一个程序状态保存寄存器SPSR。当异常出现时,SPSR用于保存CPSR的状态。
CPSR 和SPSR 的格式如下:
(1) 条件码标志
N、Z、C、V:大多数指令可以检测这些条码标志,以决定程序指令如何执行。
(2) 控制位
最低8 位I、F、T 和M 位用作控制位。当异常出现时改变控制位。当处理器在模式下时也可以由软件改变。
中断禁止位:I 置1 则禁止IRQ 中断;F 置1 则禁止FIQ 中断。
T 位:T=0 指示ARM 执行;T=1 指示Thumb 执行。在这些体系结构的系统中,可自由地使用能在ARM 和Thumb 状态之间切换的指令。
模式位:M0、M1、M2、M3 和M4(M[4:0])是模式位。这些位决定处理器的工作模
(3) 其他位
程序状态寄存器的其他位保留,用作以后扩展。
五、实验操作步骤
1. 建立一个新的工程;
2. 为工程选择CPU
3. 不添加启动代码
4. 选择开发工具
5. 建立源文件
建立汇编源程序文件TEST4.S,编写实验程序;
6. 添加源文件到工程中
7. 工程配置
8. 生成目标代码
9. 调试监视个寄存器的值
10.单步运行程序,注意观察CPSR、SPSR 以及R0 寄存器值得变化。
说明:CPSR 寄存器显示分为两部分,一部分是各个标志位,另一部分是工作模式。标志位NZCVQ 为条件码标志N、Z、C、V、Q,显示为大写字母,表示该位为1;显示为小写字母,表示该位为0。Q 标志在ARM 体系结构v5 及以上版本的E 变量中才有效。标志位IFT 为IRQ 中断禁止位I、FIQ 中断禁止位F、ARM 微控制器状态位T,显示为大写字母,表示该位为1;显示为小写字母,表示该位为0。T 标志在ARM 体系结构v4 及以上版本的T 变量中才有效。
寄存器显示窗口
单步执行程序并观察和记录CPSP 和SPSR 缓存器值的变化;并观察在相应模式下执行程序后对应缓存器值的变化。
11. 结合实验内容和相关数据,观察程序执行,透过实验加深理解和掌握
六、 实验参考程序
ARM 微控制器工作模式实验的参考程序如下:
AREA Example4,CODE,READONLY
ENTRY ;程序入口标志
start
B Reset_Handler
Undefined_Handler
B Undefined_Handler
B SWI_Handler
Prefetch_Handler
B Prefetch_Handler
Abort_Handler
B Abort_Handler
NOP ;空操作
IRQ_Handler
B IRQ_Handler
FIQ_Handler
B FIQ_Handler
SWI_Handler
mov pc, lr
;前面部分是处理程序,主要处理各种模式的入端口跳移
Reset_Handler
;into System mode
MRS R0,CPSR ;复制CPSR 到R0
BIC R0,R0,#0x1F ;清除R0 的后5 位
ORR R0,R0,#0x1F ;设定R0 的最后5 位为11111
MSR CPSR_c,R0 ;把R0 装载到CPSR,切换到系统模式
MOV R0, #1 ;对系统模式下的R0 赋值,下面的R1~R15 一样
MOV R1, #2
MOV R2, #3
MOV R3, #4
MOV R4, #5
MOV R5, #6
MOV R6, #7
MOV R7, #8
MOV R8, #9
MOV R9, #10
MOV R10, #11
MOV R11, #12
MOV R12, #13
MOV R13, #14
MOV R14, #15
;into FIQ mode
MRS R0,CPSR
BIC R0,R0,#0x1F
ORR R0,R0,#0x11 ;设定R0 的最后5 位为10001
MSR CPSR_c,R0 ;把R0 装载到CPSR,切换到Fiq 模式
MOV R8, #16 ;给Fiq 模式的特有缓存器R8 赋值, 下面的R9~R14 一样
MOV R9, #17
MOV R10, #18
MOV R11, #19
MOV R12, #20
MOV R13, #21
MOV R14, #22
;into SVC mode
MRS R0,CPSR
BIC R0,R0,#0x1F
ORR R0,R0,#0x13 ;设定R0 的最后5 位为10011
MSR CPSR_c,R0 ;把R0 装载到CPSR,切换到Svc 模式
MOV R13, #23 ;给SVC 模式的特有缓存器R13 赋值, 下面的R14 一样
MOV R14, #24
;into Abort mode
MRS R0,CPSR
BIC R0,R0,#0x1F
ORR R0,R0,#0x17 ;设定R0 的最后5 位为10111
MSR CPSR_c,R0 ;把R0 装载到CPSR,切换到Abort 模式
MOV R13, #25 ;给Abort 模式的特有缓存器R13 赋值, 下面的R14 一样
MOV R14, #26
;into IRQ mode
MRS R0,CPSR
BIC R0,R0,#0x1F
ORR R0,R0,#0x12 ;设定R0 的最后5 位为10010
MSR CPSR_c,R0 ;把R0 装载到CPSR,切换到IRQ 模式
MOV R13, #27 ;给IRQ 模式的特有缓存器R13 赋值, 下面的R14一样
MOV R14, #28
;into UNDEF mode
MRS R0,CPSR
BIC R0,R0,#0x1F
ORR R0,R0,#0x1b ;设定R0 的最后5 位为11011
MSR CPSR_c,R0 ;把R0 装载到CPSR,切换到UNDEF 模式
MOV R13, #29 ;给UNDEF 模式的特有缓存器R13 赋值, 下面的R14 一样
MOV R14, #30
B Reset_Handler ;跳移到最开始地方循环
END
七、思考题
1.本实验用到了那些寄存器,他们的作用是什么?