学习笔记(3)RT-Thread使用消息队列

本文参考了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如下图。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值