[应用相关]

如何实现在RT thread OS工程任意位置接收和发送消息队列?

[复制链接]
983|10
手机看帖
扫描二维码
随时随地手机跟帖
xyzjacky|  楼主 | 2017-3-27 10:56 | 显示全部楼层 |阅读模式
近日在学习rt thread os实时操作系统时,遇到这样一个问题。在
rt thread os中,在工程的一个C文件创建了一个消息队列,然后发送这个消息队列,
那么是只能在这个C文件中进行消息队列的接收,还是可以在工程的任何C文件中进行消息队列的接收?

在当前的C文件中,进行定义和发送:
static struct rt_messagequeue P2208_mq;//定义一个消息队列
result = rt_mq_send(&P2208_mq, &P2208ReOrder[0], sizeof(P2208ReOrder));//发送消息队列

在另一个C文件中接收消息队列:
if (rt_mq_recv(&P2208_mq, &txbuf[0], sizeof(txbuf), RT_WAITING_FOREVER)== RT_EOK)  //等待一个消息队列的到来

我现在遇到的一个问题是,按照例程在一个C文件中创建了一个消息队列,在本C文件中接收消息队列没有问题。说明代码没有问题。但是如果把接收消息队列的函数,移到工程的另一个C文件中,编译时就要报错,提示内容为: P2208_mq 没有定义。

当我把
static struct rt_messagequeue P2208_mq;
改成:
extern struct rt_messagequeue P2208_mq;

并通过.h文件包含的方式进行,就不会再报错。
这我就奇怪了,如果P2208_mq要定义成一个全局的变量,那么消息队列还有何用?

大概记得学习ucos时,ucos的消息队列就可以在工程中任何位置接收。
难道RT thread 和UCOS不一样,不支持在一个C文件中定义了,就可以全局使用?
不知道在论坛中,有谁也在学习RT thread OS,欢迎您来此交流和赐教。
xyzjacky|  楼主 | 2017-3-28 10:35 | 显示全部楼层
gygp 发表于 2017-3-27 16:46
http://blog.csdn.net/mostone/article/details/9161021

谢谢! 你说的这个,我之前就已经就看到。

使用特权

评论回复
Stannis| | 2017-3-30 21:37 | 显示全部楼层
请问你用rtt串口通信例程当发送的数据大于接收缓冲区的长度时,数据接收还完整吗?

使用特权

评论回复
Prry| | 2017-3-31 00:10 | 显示全部楼层
Stannis 发表于 2017-3-30 21:37
请问你用rtt串口通信例程当发送的数据大于接收缓冲区的长度时,数据接收还完整吗? ...

必须完整,前提是你应用程序设计合理。以串口的传输速度,只要不是很烂的解析数据的效率,都能没问题。stm32,尝试过将缓冲区减小到几十个字节,照样收发无误,当然这只是测试,实际使用还是设置大一些。特别是多个任务时,有可能处理不及时导致数据丢失。

使用特权

评论回复
xyzjacky|  楼主 | 2017-4-1 16:55 | 显示全部楼层
Stannis 发表于 2017-3-30 21:37
请问你用rtt串口通信例程当发送的数据大于接收缓冲区的长度时,数据接收还完整吗? ...

你说的问题我还没有测试过。

使用特权

评论回复
xyzjacky|  楼主 | 2017-4-1 17:03 | 显示全部楼层
Stannis 发表于 2017-3-30 21:37
请问你用rtt串口通信例程当发送的数据大于接收缓冲区的长度时,数据接收还完整吗? ...

另外,我想说的是,我的程序里面用了64个字节的消息队列池,结果是收和发是很快的。我的收和发是两个进程,收10个,应答(即发)是26个。我测试了一下,间隔40ms都没有问题。

使用特权

评论回复
xyzjacky|  楼主 | 2017-5-26 11:35 | 显示全部楼层
febgxu 发表于 2017-4-1 22:48
http://www.rt-thread.org/phpBB3/post25527.html

你发这个连接,就是我发的帖子。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

112

帖子

4

粉丝