RL_ARM实时操作系统中内核的SVC使用

用户级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_indirectarmcc的关键字之一(__irq也是armcc的关键字),用来修饰函数.
格式:
__svc_indirect(int svc_num) return-typefunction-name(int real_num, argument-list]);

svc_num是汇编指令SVCimmediate 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 

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值