tianyixueshi 发表于 2019-6-28 17:55:14

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

tianyixueshi 发表于 2019-6-28 18:05:47

看了这个关键字的信息,明白了。这个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]
查看完整版本: os_itv_wait 是怎么变成rt_itv_wait的