硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2317|回复: 17
收起左侧

[RL-RTX] 小白求助关于rtx源码中 事件标志 相关的一个问题

[复制链接]

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2019-5-2 12:09:13 | 显示全部楼层 |阅读模式
最近在看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)的定义。

求助啊,纠结了好久
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-5-2 17:50:08 | 显示全部楼层
看一下这个帖子对你是否有帮助。http://www.armbbs.cn/forum.php?m ... &highlight=RTX5
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-5-2 19:13:50 | 显示全部楼层
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) 只是在宏定义中声明了一下,并没有定义,并没有具体的函数实体,这样的一个函数能作为返回值直接返回吗??还是说这个函数在别处有定义呢??
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-5-2 19:37:50 | 显示全部楼层
wx_crD3UL3H 发表于 2019-5-2 19:13
多谢回复!
这个帖子似乎没有说我的主要疑惑,我主要纠结的是 svc##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4)  ...

认真看一下这个帖子啊,不是有讲是如何将这个宏定义跟实际函数关联的说明吗?
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-5-2 19:50:42 | 显示全部楼层
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号中断服务程序里面执行”,没有实体执行什么?
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-5-2 21:26:39 | 显示全部楼层
这个要例化的,不例化怎么关联。。

类似SVC0_0 (KernelInitialize, osStatus_t)的操作就是宏定义的使用。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-5-2 21:43:36 | 显示全部楼层
byccc 发表于 2019-5-2 21:26
这个要例化的,不例化怎么关联。。

类似SVC0_0 (KernelInitialize, osStatus_t)的操作就是宏定义的使用 ...

额。。。不是太懂,您能详细说说吗?
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-5-2 21:49:44 | 显示全部楼层
wx_crD3UL3H 发表于 2019-5-2 21:43
额。。。不是太懂,您能详细说说吗?

检索MDK里面是不是有一堆SVC0_0 ,SVC0_1,SVC0_2等的例化操作。

类似SVC0_0 (KernelInitialize, osStatus_t),然后你将这个代入宏定义SVC0_0宏定义展开,理解就简单了。

Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-5-2 21:59:22 | 显示全部楼层
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(*)())函数,可是
问题是这个函数在刚刚的宏定义里只是声明了一下,并没有定义函数实体啊。。。为什么可以调用呢?
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-5-2 22:00:19 | 显示全部楼层
本帖最后由 wx_crD3UL3H 于 2019-5-2 22:08 编辑

求解答.。。。。。。。。
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-5-2 22:13:08 | 显示全部楼层
wx_crD3UL3H 发表于 2019-5-2 21:59
额。。这个我知道,我的问题就是展开之后的问题。。比如SVC0_0 (KernelInitialize, osStatus_t),展开之 ...

__SVC_INDIRECT(0) osStatus_t    svcKernelInitialize (osStatus_t(*)());      

这个是SVC的软中断定义方式。。。要什么实体。。。。

都没理解到点上。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-5-2 22:47:20 | 显示全部楼层
byccc 发表于 2019-5-2 22:13
__SVC_INDIRECT(0) osStatus_t    svcKernelInitialize (osStatus_t(*)());      

这个是SVC的软中断 ...

大概有点明白了,不过我看教程上也给出了处理参数的程序啊,就是函数名改成了_SVC_n的形式,那这些程序是在哪里呢?
能不能说一下__SVC_INDIRECT(0)到底有什么作用
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-5-2 22:49:01 | 显示全部楼层
wx_crD3UL3H 发表于 2019-5-2 22:47
大概有点明白了,不过我看教程上也给出了处理参数的程序啊,就是函数名改成了_SVC_n的形式,那这些程序是 ...

MDK的help文档
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-5-2 23:07:47 | 显示全部楼层

我已经看过了,就是没找到我想找的才来贵站问一问,我就是想知道rtx是在哪里处理svcKernelInitialize (osStatus_t(*)())里面的参数的
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-5-2 23:08:44 | 显示全部楼层

我已经看过了,就是没找到我想找的才来贵站问一问,我就是想知道rtx是在哪里处理svcKernelInitialize (osStatus_t(*)())里面的参数的
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-5-3 20:30:59 | 显示全部楼层
wx_crD3UL3H 发表于 2019-5-2 23:08
我已经看过了,就是没找到我想找的才来贵站问一问,我就是想知道rtx是在哪里处理svcKernelInitialize (os ...

你要是看过了就不会有这么多疑问了,最简单的,单步跟踪就好了。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2019-5-3 22:20:18 | 显示全部楼层
byccc 发表于 2019-5-3 20:30
你要是看过了就不会有这么多疑问了,最简单的,单步跟踪就好了。

你就说你知不知道吧,一直在这打哑谜没什么用
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-5-3 23:11:25 | 显示全部楼层
wx_crD3UL3H 发表于 2019-5-3 22:20
你就说你知不知道吧,一直在这打哑谜没什么用

就问一句,一天过去了,__SVC_INDIRECT(0)的作用你检索过,搞明白没。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 21:16 , Processed in 0.342624 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表