微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > arm处理器异常处理swi

arm处理器异常处理swi

时间:11-09 来源:互联网 点击:

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 |

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top