arm处理器异常处理swi
swi”来定义一个软中断函数:
__swi(0x30) void my_swi(void);
void fun(void)
{
my_swi();
}
-----> 转换成汇编
fun
STMFD sp! , {lr}
swi 0x24
LDMFD sp! , {pc}
swi调用带参和swi处理函数带参:
swi调用带参:
使用swi指令时,通常有两种方法来传递参数:
1. 使用swi号
swi指令的低24bits(ARM指令集)组成或者低8bits(Thumb指令集)来指定软中断号,
其余参数通过寄存器来传递。
2. r0决定软中断号,其余参数使用同样寄存器传递。
c语言中,关键字“__swi”定义的软中断函数允许最多4个参数,使用r0~r4来传递。
swi处理函数带参:
1. 汇编中,存取调用者设置的寄存器即可
2. 传参给c,通常才用压栈的方法:
将参数压栈,给调用的函数传递一个指向这些参数的指针。
获取SWI号:
ARM core不提供直接传递软中断号到处理程序的机制,SWI处理程序必须定位SWI指令并提取SWI指令中的常数域
1. 检查SPSR_svc的Tbit,可以确定陷入swi异常之前的指令时ARM指令集还是Thumb指令集。
2. 然后通过LR_svc的值确定SWI指令的地址。ARM状态下是LR-4,而Thumb状态下是LR-2的位置。
3. SWI指令格式:
ARM态:
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
| Cond |1 1 1 1 | SWI number |
Thumb态
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
| 1 1 0 1 1 1 1 1| SWI number |
arm处理器异常处理sw 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)