os_itv_wait 是怎么变成rt_itv_wait的
不知道这个问题,有看过的吗?RTX调用的原理我明白了。
os_itv_wait()
宏定义,改为 _os_itv_wait (U32 p) __SVC_0;
查看反汇编,这就会往R12里面写一个地址
AppTaskLED
0x08000590: bf00 .. NOP
0x08000592: f44f70fa O..p MOV r0,#0x1f4
0x08000596: f8dfc014 .... LDR r12, ; = 0x8007441
0x0800059a: df00 .. SVC #0x0 ; formerly SWI
在SVC handler中会执行这个地址的函数,
SVC_Handler_Veneer
#endif
IMPORTSVC_Count
IMPORTSVC_Table
IMPORTrt_stk_check
MRS R0,PSP ; Read PSP
LDR R1, ; Read Saved PC from Stack
LDRB R1, ; Load SVC Number
CBNZ R1,SVC_User
PUSH {R4,LR} ; Save EXC_RETURN
LDM R0,{R0-R3,R12} ; Read R0-R3,R12 from stack
BLX R12 ; Call SVC Function
POP {R4,LR} ;
Restore EXC_RETURN当然了就是rt_itv_wait()。
RTX系统调用都是这个套路,我就奇怪一点:_os_itv_wait (U32 p) 在源码中没有实现,为什么会是rt_itv_wait的地址呢。这两个是怎么关联起来的
@Eric
看了这个关键字的信息,明白了。这个real num就是真实函数的地址,放在R12
看来RTX真是为了M3&M4量身定制的
======================================================
_svc_indirect是armcc的关键字之一(__irq也是armcc的关键字),用来修饰函数.
格式:
__svc_indirect(int svc_num) return-type function-name(int real_num[, argument-list]);
svc_num是汇编指令SVC的immediate value,在Thumb指令中该值范围为0-255 (an 8-bit value).
real_num该值通过r12寄存器传递到中断处理函数中(异常时r12会入栈, 得从栈里取出),该参数是必须有的。
return-type是函数的返回类型,该返回类型也可以放在最前面.
例子:
int __svc_indirect(0) ioctl(int svcino, int fn, void *argp);
当调用ioctl(4, RESET, NULL)时,相当于:
r12 = 4;
SVC #0 ;
触发了SVC中断,cortex-m3产生中断时,会将xPSR, PC, LR, R12, R3-R0这8个寄存器入栈,
所以ioctl的svcino参数需要从栈中取出.
---------------------
作者:青蛙嘎嘎
来源:CSDN
原文:https://blog.csdn.net/luoqindong/article/details/18374007
版权声明:本文为博主原创文章,转载请附上博文链接!
页:
[1]