最近在看rtx 事件标志部分 源码时看到了这个
#define SVC0_4(f,t,t1,t2,t3,t4) \
__SVC_INDIRECT(0) t svc##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4); \
__attribute__((always_inline)) \
__STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3, t4 a4) { \
return svc##f(svcRtx##f,a1,a2,a3,a4); \
}
调用时 SVC0_4(EventFlagsWait, uint32_t, osEventFlagsId_t, uint32_t, uint32_t, uint32_t)实现核心功能的是svcRtx##f函数
在上面宏定义时定义了__svc##f (t1 a1, t2 a2, t3 a3, t4 a4),函数主体是返回了svc##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4);但是svc##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4)只是在宏定义中声明了一下,并没有定义,为什么就能直接返回值呢??
是不是和__SVC_INDIRECT(0)有关?我查了资料说svc中断服务函数有 异常返回 机制,真正的返回值并不是 return,可是这个函数连实体都没有应该不会返回任何东西吧?在别的地方也没发现svc##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4)的定义。
求助啊,纠结了好久
|