小白求助关于rtx源码中 事件标志 相关的一个问题
最近在看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)的定义。
求助啊,纠结了好久
看一下这个帖子对你是否有帮助。http://www.armbbs.cn/forum.php?mod=viewthread&tid=93396&highlight=RTX5 sanit 发表于 2019-5-2 17:50
看一下这个帖子对你是否有帮助。http://www.armbbs.cn/forum.php?mod=viewthread&tid=93396&highlight=R ...
多谢回复!
这个帖子似乎没有说我的主要疑惑,我主要纠结的是 svc##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4) 只是在宏定义中声明了一下,并没有定义,并没有具体的函数实体,这样的一个函数能作为返回值直接返回吗??还是说这个函数在别处有定义呢?? wx_crD3UL3H 发表于 2019-5-2 19:13
多谢回复!
这个帖子似乎没有说我的主要疑惑,我主要纠结的是 svc##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4)...
认真看一下这个帖子啊,不是有讲是如何将这个宏定义跟实际函数关联的说明吗? sanit 发表于 2019-5-2 19:37
认真看一下这个帖子啊,不是有讲是如何将这个宏定义跟实际函数关联的说明吗?
"__SVC_INDIRECT(0) osStatus_t svcKernelInitialize (t(*)()); 这个函数的作用就是,调用到svcKernelInitialize的地方将以SVC 0号中断服务程序里面执行
当用户调用函数__svcKernelInitialize时,就会触发SVC 0 中断里面调用函数svcRtxKernelInitialize,这个函数是RTX5的原始API函数。
从而实现SVC中断里面调用RTX5的API。"
这是帖子原话,__SVC_INDIRECT(0) osStatus_t svcKernelInitialize (t(*)());不是只声明了一下svcKernelInitialize (t(*)())吗?并没有函数主体啊,他说的是“调用到svcKernelInitialize的地方将以SVC 0号中断服务程序里面执行”,没有实体执行什么? 这个要例化的,不例化怎么关联。。
类似SVC0_0 (KernelInitialize, osStatus_t)的操作就是宏定义的使用。 byccc 发表于 2019-5-2 21:26
这个要例化的,不例化怎么关联。。
类似SVC0_0 (KernelInitialize, osStatus_t)的操作就是宏定义的使用 ...
额。。。不是太懂,您能详细说说吗? wx_crD3UL3H 发表于 2019-5-2 21:43
额。。。不是太懂,您能详细说说吗?
检索MDK里面是不是有一堆SVC0_0 ,SVC0_1,SVC0_2等的例化操作。
类似SVC0_0 (KernelInitialize, osStatus_t),然后你将这个代入宏定义SVC0_0宏定义展开,理解就简单了。
byccc 发表于 2019-5-2 21:49
检索MDK里面是不是有一堆SVC0_0 ,SVC0_1,SVC0_2等的例化操作。
类似SVC0_0 (KernelInitialize, osSt ...
额。。这个我知道,我的问题就是展开之后的问题。。比如SVC0_0 (KernelInitialize, osStatus_t),展开之后是:
#define SVC0_0(f,t) \
__SVC_INDIRECT(0) osStatus_t svcKernelInitialize (osStatus_t(*)()); \
__attribute__((always_inline)) \
__STATIC_INLINE osStatus_t__svcKernelInitialize (void) { \
return svcKernelInitialize(svcRtxKernelInitialize); \
}
在__svcKernelInitialize (void)这个函数中,调用了svcKernelInitialize (osStatus_t(*)())函数,可是
问题是这个函数在刚刚的宏定义里只是声明了一下,并没有定义函数实体啊。。。为什么可以调用呢? 本帖最后由 wx_crD3UL3H 于 2019-5-2 22:08 编辑
求解答.。。。。。。。。 wx_crD3UL3H 发表于 2019-5-2 21:59
额。。这个我知道,我的问题就是展开之后的问题。。比如SVC0_0 (KernelInitialize, osStatus_t),展开之 ...
__SVC_INDIRECT(0) osStatus_t svcKernelInitialize (osStatus_t(*)());
这个是SVC的软中断定义方式。。。要什么实体。。。。
都没理解到点上。 byccc 发表于 2019-5-2 22:13
__SVC_INDIRECT(0) osStatus_t svcKernelInitialize (osStatus_t(*)());
这个是SVC的软中断 ...
大概有点明白了,不过我看教程上也给出了处理参数的程序啊,就是函数名改成了_SVC_n的形式,那这些程序是在哪里呢?
能不能说一下__SVC_INDIRECT(0)到底有什么作用 wx_crD3UL3H 发表于 2019-5-2 22:47
大概有点明白了,不过我看教程上也给出了处理参数的程序啊,就是函数名改成了_SVC_n的形式,那这些程序是 ...
MDK的help文档:L byccc 发表于 2019-5-2 22:49
MDK的help文档
我已经看过了,就是没找到我想找的才来贵站问一问,我就是想知道rtx是在哪里处理svcKernelInitialize (osStatus_t(*)())里面的参数的:(:'(:'( byccc 发表于 2019-5-2 22:49
MDK的help文档
我已经看过了,就是没找到我想找的才来贵站问一问,我就是想知道rtx是在哪里处理svcKernelInitialize (osStatus_t(*)())里面的参数的:(:'(:'( wx_crD3UL3H 发表于 2019-5-2 23:08
我已经看过了,就是没找到我想找的才来贵站问一问,我就是想知道rtx是在哪里处理svcKernelInitialize (os ...
你要是看过了就不会有这么多疑问了,最简单的,单步跟踪就好了。 byccc 发表于 2019-5-3 20:30
你要是看过了就不会有这么多疑问了,最简单的,单步跟踪就好了。
你就说你知不知道吧,一直在这打哑谜没什么用 wx_crD3UL3H 发表于 2019-5-3 22:20
你就说你知不知道吧,一直在这打哑谜没什么用
就问一句,一天过去了,__SVC_INDIRECT(0)的作用你检索过,搞明白没。
页:
[1]