常见的五大ARM存储器之一:协处理器CP15(3)
 
- UID
- 1029342
- 性别
- 男
|

常见的五大ARM存储器之一:协处理器CP15(3)
【例1】 典型的在SWI中进行模式切换的例子。利用此例,调用SWI 0来完成系统模式切换。
EHT_SWI
LDR sp,=EHT_Exception_Stack ;更新SWI堆栈指针
ADD sp,sp,#EXCEPTION_SIZE ;得到栈顶指针
STMDB sp!,{r0-r2,lr} ;保存程序中用到的寄存器
MRS r0,SPSR ;得到SPSR
STMDB sp!,{r0} ;保持SPSR
LDR r0,[lr,#-4] ;计算SWI指令地址
BIC r0,r0,#0xFF000000 ;提取中断向量号
CMP r0,#MAX_SWI ;检测中断向量范围
LDRLS pc,[pc,r0,LSL #2] ;如果在范围内,跳转到软中断向量表
B EHT_SWI_Exit ;为定义的SWI指令出口
EHT_Jump_Table
DCD EHT_SU_Switch
DCD EHT_Disable_Interrupts
;*********************************************************************************
;用户可在此添加更多的自定义软中断,在此SWI0作为系统保留的软中断,调用例程EHT_SU_Switch,来进行模式切换
;*********************************************************************************
EHT_SU_Switch
MMU_DISABLE ;转换前禁用MMU
LDMIA sp!,{r0} ;从堆栈中取出SPSR
BIC r0,r0,#MODE_MASK ;清除模式位
ORR r0,r0,#SYS_MODE ;设置程序状态字的supper模式位
STMDB sp!,{r0} ;从新将SPSR放入堆栈
B EHT_SWI_Exit
EHT_Disable_Interrupts
LDMIA sp!,{r0} ;从堆栈中读出SPSR
ORR r0,r0,#LOCKOUT ;禁止中断
STMDB sp!,{r0} ;存储SPSR到中断
; B EHT_SWI_Exit
EHT_SWI_Exit
LDMIA sp!,{r0} ;从堆栈中读出SPSR
MSR SPSR_cf,r0 ;将SPSR放入SPSR_cf
LDMIA sp!,{r0-r2,pc}^ ;寄存器出栈并返回
END |
|
|
|
|
|