首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

常见的五大ARM存储器之一:协处理器CP15(3)

常见的五大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
继承事业,薪火相传
返回列表