消息队列

优质
小牛编辑
147浏览
2023-12-01

消息队列接口

结构体

struct  rt_messagequeue
 消息队列控制块 更多...
 

类型定义

typedef struct rt_messagequeuert_mq_t
 消息队列类型指针定义
 

函数

rt_err_t rt_mq_init (rt_mq_t mq, const char *name, void *msgpool, rt_size_t msg_size, rt_size_t pool_size, rt_uint8_t flag)
 初始化消息队列
 
rt_err_t rt_mq_detach (rt_mq_t mq)
 脱离消息队列
 
rt_mq_t rt_mq_create (const char *name, rt_size_t msg_size, rt_size_t max_msgs, rt_uint8_t flag)
 创建消息队列
 
rt_err_t rt_mq_delete (rt_mq_t mq)
 删除消息队列
 
rt_err_t rt_mq_send (rt_mq_t mq, void *buffer, rt_size_t size)
 发送消息
 
rt_err_t rt_mq_urgent (rt_mq_t mq, void *buffer, rt_size_t size)
 发送紧急消息
 
rt_err_t rt_mq_recv (rt_mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout)
 接收消息
 

详细描述

消息队列接口

消息队列是另一种常用的线程间通讯方式,它能够接收来自线程或中断服务例程中不固定长度的消息, 并把消息缓存在自己的内存空间中。其他线程也能够从消息队列中读取相应的消息,而当消息队列是 空的时候,可以挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒以接收并处理消息。消息 队列是一种异步的通信方式。

消息队列可以应用于发送不定长消息的场合,包括线程与线程间的消息交换,以及中断服务例程中 发送给线程的消息(中断服务例程不可能接收消息)。

函数说明

rt_err_t rt_mq_init(rt_mq_t mq,
const char * name,
void * msgpool,
rt_size_t msg_size,
rt_size_t pool_size,
rt_uint8_t flag 
)

初始化消息队列

该函数将初始化消息队列并将其置于内核管理器的控制之下。

参数
mq消息队列对象句柄
name消息队列的名称
msgpool用于存放消息的缓冲区指针
msg_size消息队列中一条消息的最大长度,单位字节
pool_size存放消息的缓冲区大小
flag消息队列采用的等待方式,它可以取值:RT_IPC_FLAG_FIFO或RT_IPC_FLAG_PRIO
返回
RT_EOK
示例:
msgq_sample.c.
rt_err_t rt_mq_detach(rt_mq_t mq)

脱离消息队列

该函数将使消息队列对象被从内核对象管理器中删除。使用该函数接口后, 内核先唤醒所有挂在该消息等待队列对象上的线程(返回值是 - RT_ERROR ), 然后将该消息队列对象从内核对象管理器中删除。

参数
mq消息队列对象句柄
返回
RT_EOK
示例:
msgq_sample.c.
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_NULL
rt_err_t rt_mq_delete(rt_mq_t mq)

删除消息队列

当消息队列不再被使用时,应该调用该函数接口删除它以释放系统资源,一旦操作完成, 消息队列将被永久性地删除。删除消息队列时,如果有线程被挂起在该消息队列等待队列上, 则内核先唤醒挂起在该消息等待队列上的所有线程(返回值是 -RT_ERROR),然后再释放 消息队列使用的内存,最后删除消息队列对象。

参数
mq消息队列对象句柄
返回
RT_EOK 成功
rt_err_t rt_mq_send(rt_mq_t mq,
void * buffer,
rt_size_t size 
)

发送消息

线程或者中断服务程序都可以调用该函数给消息队列发送消息。当发送消息时, 消息队列对象先从空闲消息链表上取下一个空闲消息块,把线程或者中断服务 程序发送的消息内容复制到消息块上,然后把该消息块挂到消息队列的尾部。 当且仅当空闲消息链表上有可用的空闲消息块时,发送者才能成功发送消息; 当空闲消息链表上无可用消息块,说明消息队列已满,此时,发送消息的的 线程或者中断程序会收到一个错误码(-RT_EFULL)。

参数
mq消息队列对象句柄
buffer消息内容
size消息大小
返回
RT_EOK 成功;-RT_EFULL 消息队列已满;-RT_ERROR 失败,表示发送的 消息长度大于消息队列中消息的最大长度
示例:
msgq_sample.c.
rt_err_t rt_mq_urgent(rt_mq_t mq,
void * buffer,
rt_size_t size 
)

发送紧急消息

发送紧急消息的过程与发送消息几乎一样,唯一的不同是,当发送紧急消息时, 从空闲消息链表上取下来的消息块不是挂到消息队列的队尾,而是挂到队首, 这样,接收者就能够优先接收到紧急消息,从而及时进行消息处理。

参数
mq消息队列对象句柄
buffer消息内容
size消息大小
返回
RT_EOK 成功;-RT_EFULL 消息队列已满;-RT_ERROR 失败
示例:
msgq_sample.c.
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 失败
示例:
msgq_sample.c.