一、SWI软件中断原理。
在特权模式下,处理器模式切换可以通过软件控制进行切换,即修改 CPSR 的模式位。但在用户模式下,是没有权限通过修改 CPSR 实现模式转换的,除非 通过外部中断或是异常处理过程进行切换。为方便在用户模式下灵活实现模式的 转换, ARM 指令集提供了产生异常的指令,即软件中断指令 SWI 。也就是说用 户程序里可以通过写入 SWI 指令来切换到特权模式,当 CPU 执行到 SWI 指令时会 从用户模式切换到管理模式下,执行软件中断处理。在其他模式下也可以使用 SWI 指令,处理器同样切换到管理模式。
指令格式:
SWI{cond} immed_24
其中: immed_24 为 24 位立即数,值为从 0――16777215 之间的整数。它 用来做用户程序和软中断处理程序之间的接头暗号。通过该软中断立即数来区分 用户不同操作。
指令编码格式:
指令举例:
SWI 1;产生 1 号软中断
指令说明:
在用户模式下调用 SWI 软中断指令,可使处理器跳转至 SWI 中断向量表所对 应的地址中,继而跳入软中断处理程序
中。在软中断处理程序中,可根据软中断号,实现不同的操作。软中断号的判断方法如下:
LDR R4, [LR, #-4] ; LR 为硬件自动保存 SWI xxx 指令的下一条指令地址
; LR – 4 就是 SWI 指令地址
BIC R4, R4, #0xFF000000 ;将 SWI 指令高 8 位清除掉,只保留低 24 位立
; 即数,取得SWI指令编码,则 R4 即为 SWI
;指令后的软中断号;
二、代码
AREA Stack1,DATA,READWRITE
stack1 DCD 10*512
PRESERVE8
AREA TEST,CODE,READONLY
CODE32
ENTRY
b reset
b _undefined_instruction
b _software_interrupt
b _prefetch_abort
b _data_abort
b _not_used
b _irq
b _fiq
_undefined_instruction
nop
_prefetch_abort
nop
_data_abort
nop
_not_used
nop
_irq
nop
_fiq
nop
reset
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr_c,r0 ;Enable svc mode of cpu
init_stack
ldr r0,=stack1 ;get stack top pointer*/
;svc mode stack
mov sp,r0
sub r0,#128*4 ;/*512 byte for irq mode of stack*/
;/****irq mode stack**/
msr cpsr_c,#0xd2
mov sp,r0
sub r0,#128*4 ;/*512 byte for irq mode of stack*/
;/***fiq mode stack***/
msr cpsr_c,#0xd1
mov sp,r0
sub r0,#0
;/***abort mode stack***/
msr cpsr_c,#0xd7
mov sp,r0
sub r0,#0
;/***undefine mode stack***/
msr cpsr_c,#0xdb
mov sp,r0
sub r0,#0
;/*** sys mode and usr mode stack ***/
msr cpsr_c,#0x10
mov sp,r0 ;/*1024 byte for user mode of stack*/
swi 1
swi 2
LOOP
B LOOP
_software_interrupt
STMFD SP!, {R0-R4, LR} ; 保存程序执行现场
LDR R4, [LR, #-4] ; LR - 4 为指令" swi xxx" 的地址,低 24 位 是 软件中断号
BIC R4, R4, #0xFF000000 ; 取得 ARM 指令 24 位立即数
CMP R4, #1
ADDEQ R5,R5,#1 ; 判断 24 位立即数,如果为 1,则执行R5+1 操作
LDREQ PC, =swi_return ; 软中断处理返回CMP R4, #2 ; 判断 24 位立即数,如果为 2,则执行 R6+1 操作
ADDEQ R6,R6,#1
LDREQ PC, =swi_return ; 软中断处理返回地址
swi_return
LDMFD SP!, {R0-R4, PC}^ ; 中断返回, ^表示将 spsr 的值复制到 cpsr
END
PS:
1. bic
BIC指令的格式为:
BIC{条件}{S} 目的寄存器,操作数1,操作数2
BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,
操作数2可以是一个寄存器、被移位的寄存器、或一个立即数。操作数2为32位的掩码,如果在
掩码中置了某一位1,则清除这一位。未设置的掩码位保持不变。
bic r0,r0,#0x1f
0x1f=11111b
其含义:清除r0的bit[4:0]位。
2,orr
ORR指令的格式为:
ORR{条件}{S} 目的寄存器,操作数1,操作数2
ORR指令用于在两个操作数上进行逻辑戒运算,并把结果放置到目的寄存器中。操作数1应该是一
个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操
作数1的某些位。
指令示例:
ORR R0,R0,#3 ; 该指令设置R0的0、1位,其余位保持不变。
orr r0,r0,#0xd3
0xd3=1101 0111
将r0与0xd3作算数或运算,然后将结果返还给r0,即把r0的bit[7:6]和bit[4]和bit[2:0]置为1。
上一篇:RTEMS在S3C2440上的移植-(4)
下一篇:S3C2410 通用异步收发UART 串口通信
推荐阅读最新更新时间:2024-11-06 20:51
设计资源 培训 开发板 精华推荐
- 免费领取|价值400元的乐鑫无线屏幕交互开发板ESP32-S3-LCD-EV-BOARD
- 泰克直播:带您了解您所不知道的示波器使用技巧
- 有奖直播|相约Keysight World 2019“汽车电子及新能源汽车测试”论坛
- 学习有礼,分享也有礼!跟着小梅哥,一起intel SoC FPGA走起!
- ADI & 世健 新基建系列第三期——5G 仪器仪表和测试 答题赢好礼!
- ADI•世健工业嘉年华——深度体验:ADI伺服电机控制方案
- 万人学习51单片机
- 真香!泰克示波器全新升级,速来解锁!不看感觉错过一个亿!
- TE智能工厂解决方案,助力工业数字化转型
- 揭Altera MAX10神秘面纱,下载白皮书,抢楼赢好礼!