消息队列
消息队列接口
结构体 | |
struct | rt_messagequeue |
消息队列控制块 更多... | |
类型定义 | |
typedef struct rt_messagequeue * | rt_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.