用户级SVC用法:
注:__svc(x),为汇编编译器关键字,被它修饰的函数参数于普通子函数调用规则一致。
1.汇编模式(1)SVC中断函数建立:type __svc(x) fun1(para,...);
(2)SVC中断服务函数:type fun1_rev(para,...);
(3)SVC中断函数地址入口:SVC_Table.sÎļþÖÐ:
AREA SVC_TABLE, CODE, READONLY
IMPORT fun1_rev
SVC_Table
DCD fun1_rev
STV_END
END
2.C+汇编模式
(1)SVC中断函数建立:type __svc(x) fun1(para,...);
(2)SVC中断服务函数:void SVC_Handler_C(unsigned int * svc_args)
{
//svc_args[0...7]:R0~R3,R12,LR,PC,xPSR
unsigned int svc_number;
svc_number = ((char *)svc_args[6])[-2];
switch(svc_number)
{
case 0: break;
case 1: break;
case 2: break;
default:
break;
}
}
(3)SVC中断函数地址入口:
__asm void SVC_Handler(void)
{
TST LR, #4 ; Test bit 2 of EXC_RETURN
ITE EQ
MRSEQ R0, MSP ; if 0, stacking used MSP, copy to R0
MRSNE R0, PSP ; if 1, stacking used PSP, copy to R0
B __cpp(SVC_Handler_C)
ALIGN 4
}
系统内核SVC调用:
注:
__svc_indirect是armcc的关键字之一(__irq也是armcc的关键字),用来修饰函数.
格式:
__svc_indirect(int svc_num) return-typefunction-name(int real_num, argument-list]);
svc_num是汇编指令SVC的immediate value,在Thumb指令中该值范围为0-255 (an 8-bitvalue).
real_num该值通过r12寄存器传递到中断处理函数中(异常时r12会入栈, 得从栈里取出)。此时r12为指令指针IP;
return-type是函数的返回类型,该返回类型也可以放在最前面.
__asm void SVC_Handler (void)
{
MRS R0,PSP
LDR R1,[R0,#24]
LDRB R1,[R1,#-2]
LDM R0,{R0-R3,R12} ; Read R0-R3,R12 from stack
BLX R12
}