本文参考了RT-Thread的官方文档:线程间通信 (rt-thread.org)
话不多说直接上代码,这里实现了一个较为简单的消息队列。
#include <rtthread.h>
#include <string.h>
static rt_mq_t message_queue;
int main()
{
//创建消息队列
message_queue = rt_mq_create("msg_queue", 30, 2, RT_IPC_FLAG_FIFO);
if (message_queue == RT_NULL)
{
rt_kprintf("create msg_queue failed.\n");
}
//往消息队列发送消息
char senddate[] = "1234567891234567";
rt_err_t result = rt_mq_send(message_queue, &senddate, sizeof(senddate));
if (result != RT_EOK)
{
rt_kprintf("failed to send message.\n");
}
//从消息队列中接收
char recvbuf[30] = { 0 };
if (rt_mq_recv(message_queue, &recvbuf, sizeof(recvbuf), 9000) == RT_EOK)
{
rt_kprintf("recv is %s\n", recvbuf);
}
else
{
rt_kprintf("recv message fail\n");
}
}
首先利用rt_mq_create函数进行消息队列的创建。该函数中的参数定义如下:
rt_mq_t rt_mq_create(const char* name, rt_size_t msg_size,
rt_size_t max_msgs, rt_uint8_t flag);
参数 | 描述 |
---|---|
name | 消息队列的名称 |
msg_size | 消息队列中一条消息的最大长度,单位字节 |
max_msgs | 消息队列的最大个数 |
flag | 消息队列采用的等待方式,它可以取如下数值: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO |
返回 | —— |
RT_EOK | 发送成功 |
消息队列对象的句柄 | 成功 |
RT_NULL | 失败 |
创建好消息队列以后,我们就可以往消息队列里发送消息了,发送消息我们使用的函数是rt_mq_send,他的定义以及参数解释如下。
rt_err_t rt_mq_send (rt_mq_t mq, void* buffer, rt_size_t size);
参数 | 描述 |
---|---|
mq | 消息队列对象的句柄 |
buffer | 消息内容 |
size | 消息大小 |
返回 | —— |
RT_EOK | 成功 |
-RT_EFULL | 消息队列已满 |
-RT_ERROR | 失败,表示发送的消息长度大于消息队列中消息的最大 |
这里需要注意的是我们发送消息的大小不应该超过消息队列中一条消息的最大长度,否则消息会发送失败。即rt_mq_create函数中的msg_size要比rt_mq_send的size至少要大一个字节。
发送成功后,我们可以调用rt_mq_recv函数来接收消息队列中的消息。其中rt_mq_recv函数的定义和参数解释如下:
rt_err_t rt_mq_recv (rt_mq_t mq, void* buffer,
rt_size_t size, rt_int32_t timeout);
参数 | 描述 |
---|---|
mq | 消息队列对象的句柄 |
buffer | 消息内容 |
size | 消息大小 |
timeout | 指定的超时时间 |
返回 | —— |
RT_EOK | 成功收到 |
-RT_ETIMEOUT | 超时 |
-RT_ERROR | 失败,返回错误 |
这样我们就实现了动态消息队列的创建、消息发送和消息接收了。
下载运行rtthreadRTrtthread如下图。