|
不知道这个问题,有看过的吗?
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,[pc,#20] ; [0x80005ac] = 0x8007441
0x0800059a: df00 .. SVC #0x0 ; formerly SWI
在SVC handler中会执行这个地址的函数,
SVC_Handler_Veneer
#endif
IMPORT SVC_Count
IMPORT SVC_Table
IMPORT rt_stk_check
MRS R0,PSP ; Read PSP
LDR R1,[R0,#24] ; Read Saved PC from Stack
LDRB R1,[R1,#-2] ; 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
|
|