在C源程序中用软中断时可以使用 格式:__swi(软中断号) 函数名(形参) 来声明一个软中断函数 例如:__swi(0x01) led(void); 这样就声明了一个具有中断号为0x01的软中断函数。
注:在ARM处理器中,一般将软中断号放在发生软中断的那条指令的低24位。
发生软中断时,处理器会将发生软中断的下一条指令放到lr寄存器中,所以中断号就在地址 lr - 4 的低24位。
下面是处理软中断的汇编代码:(在汇编代码前面需要加IMPORT C_Swi_handler)
HandlerSWI
stmfd sp!, {r0-r3,r12,lr} ;保存现场,APCS规定汇编和C函数之间形参的传递为:r0作为第一个形参,少于4个时使用r0-r3传递,多的要使用堆栈
ldr r0, [lr,#-4] ;取出软中断号所在的指令
bic r0, r0, #0xff000000 ;低24位为软中断号
bl C_Swi_handler ;调用软中断处理函数
ldmfd sp!, {r0-r3,r12,pc}^ ;恢复现场
在软中断服务函数中,如果不止一个软中断,则需要使用软中断号来判断
完整程序的例子:
#include "2440addr.h"
#include "config.h"
extern void C_Swi_handler(unsigned num);
__swi(0x01) void led(void);
void ledInit(void);
void Main(void)
{
ledInit();
led();
while(1)
;
}
void C_Swi_handler(unsigned int num)
{
switch(num)
{
case 0x01:
rGPBDAT &= ~(1<<5);break;
}
}
void ledInit(void)
{
rGPBCON &= ~(3<<10);
rGPBCON |= (1<<10);
rGPBDAT |= (1<<5);
}