# 消息队列 ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- # 功能概述 消息队列支持多生产者、多消费者模型。它采用先进先出的数据结构,适用于需要在多线程间安全交换消息的场景,常用于消息异步处理。例如,接收数据的线程为避免阻塞,只是将数据写入队列;另一个线程则专门处理队列中的消息。 # 消息队列API ## 头文件 *qosa_sys.h* ## 函数概览 | **函数名** | **功能描述** | | --- | --- | | *qosa_msgq_create()* | 创建消息队列 | | *qosa_msgq_delete()* | 删除消息队列 | | *qosa_msgq_release()* | 发送消息到队列 | | *qosa_msgq_wait()* | 从队列接收消息 | | *qosa_msgq_get_cnt()* | 获取当前队列中的消息数量 | ## 函数详解 ### qosa_msgq_create - **功能描述** 创建消息队列,并指定消息大小和队列容量。 - **函数原型** ```c int qosa_msgq_create(qosa_msgq_t *msgQRef, qosa_uint32_t size, qosa_uint32_t maxNumber) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *msgQRef* | 输入 | qosa_msgq_t * | 消息队列句柄指针 | | *size* | 输入 | qosa_uint32_t | 存储的数据类型的长度 | | *maxNumber* | 输入 | qosa_uint32_t | 消息队列的最大消息数 | - **返回值说明** *QOSA_ERROR_OK*:函数执行成功 *QOSA_ERROR_MSGQ_INVALID_ERR*:参数无效 *QOSA_ERROR_MSGQ_CREATE_ERR*:创建失败 ### qosa_msgq_delete - **功能描述** 删除消息队列,并释放所有相关资源。 - **函数原型** ```c int qosa_msgq_delete(qosa_msgq_t msgQRef) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *msgQRef* | 输入 | qosa_msgq_t | 消息队列句柄 | - **返回值说明** *QOSA_ERROR_OK*:函数执行成功 *QOSA_ERROR_MSGQ_INVALID_ERR*:参数无效 ```{note} 1. 调用此函数前,请确保没有任何任务正在阻塞等待或访问该队列。 2. 队列被删除时,其中未处理的消息会被丢弃。 3. 删除成功后,该句柄将立即失效。 ``` ### qosa_msgq_release - **功能描述** 发送消息到队列。 - **函数原型** ```c int qosa_msgq_release(qosa_msgq_t msgQRef, qosa_uint32_t size, qosa_uint8_t *value, qosa_uint32_t timeout) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *msgQRef* | 输入 | qosa_msgq_t | 消息队列句柄 | | *size* | 输入 | qosa_uint32_t | 发送消息的大小(必须与创建队列时指定的 *size* 一致) | | *value* | 输入 | qosa_uint8_t * | 指向消息数据的指针 | | *timeout* | 输入 | qosa_uint32_t | 等待超时时间。单位:毫秒
*QOSA_WAIT_FOREVER*:永久等待
*QOSA_NO_WAIT*:不等待 | - **返回值说明** *QOSA_ERROR_OK*:函数执行成功 *QOSA_ERROR_MSGQ_INVALID_ERR*:参数无效 *QOSA_ERROR_EVENT_SIZE_ERR*:消息大小与队列定义不符 *QOSA_ERROR_MSGQ_FULL_ERR*:消息队列已满,无法继续写入消息 *QOSA_ERROR_MSGQ_CREATE_ERR*:创建失败 ### qosa_msgq_wait - **功能描述** 从队列接收消息(消费者操作),支持超时等待。 - **函数原型** ```c int qosa_msgq_wait(qosa_msgq_t msgQRef, qosa_uint8_t *value, qosa_uint32_t size, qosa_uint32_t timeout) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *msgQRef* | 输入 | qosa_msgq_t | 消息队列句柄 | | *value* | 输入 | qosa_uint8_t * | 存储接收消息的缓冲区指针 | | *size* | 输入 | qosa_uint32_t | 接收缓冲区的大小(必须与创建队列时指定的 *size* 一致) | | *timeout* | 输入 | qosa_uint32_t | 等待超时时间。单位:毫秒
*QOSA_WAIT_FOREVER*:永久等待
*QOSA_NO_WAIT*:不等待 | - **返回值说明** *QOSA_ERROR_OK*:函数执行成功 *QOSA_ERROR_MSGQ_INVALID_ERR*:参数无效 *QOSA_ERROR_MSGQ_TIMEOUT_ERR*:操作等待超时 *QOSA_ERROR_MSGQ_RECV_ERR*:接收消息失败 ### qosa_msgq_get_cnt - **功能描述** 获取当前队列中的消息数量。 - **函数原型** ```c int qosa_msgq_get_cnt(qosa_msgq_t msgQRef, qosa_uint32_t *cnt_ptr) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *msgQRef* | 输入 | qosa_msgq_t | 消息队列句柄 | | *cnt_ptr* | 输出 | qosa_uint32_t * | 存储消息数量的指针 | - **返回值说明** *QOSA_ERROR_OK*:函数执行成功 *QOSA_ERROR_MSGQ_INVALID_ERR*:参数无效 ```{note} 1. 该函数返回的是调用瞬间的消息数量快照。 2. 在多任务环境下,获取到的消息数量在函数返回后可能立即发生变化。 ``` ## 枚举定义 ### qosa_errcode_os_e 错误码枚举定义如下: ```c typedef enum { QOSA_ERROR_OK = 0, ... QOSA_ERROR_MSGQ_CREATE_ERR = 1 | QOSA_ERRCODE_OS_BASE, QOSA_ERROR_MSGQ_FULL_ERR, QOSA_ERROR_MSGQ_RECV_ERR, QOSA_ERROR_MSGQ_TIMEOUT_ERR, QOSA_ERROR_MSGQ_INVALID_ERR, QOSA_ERROR_MSGQ_DELETE_ERR, QOSA_ERROR_MSGQ_RESET_ERR, ... }qosa_errcode_os_e; ``` | **成员** | **说明** | | --- | --- | | *QOSA_ERROR_OK* | 函数执行成功 | | *QOSA_ERROR_MSGQ_CREATE_ERR* | 创建失败 | | *QOSA_ERROR_MSGQ_FULL_ERR* | 消息队列已满,无法继续写入消息 | | *QOSA_ERROR_MSGQ_RECV_ERR* | 接收消息失败 | | *QOSA_ERROR_MSGQ_TIMEOUT_ERR* | 操作等待超时 | | *QOSA_ERROR_MSGQ_INVALID_ERR* | 参数无效 | | *QOSA_ERROR_MSGQ_DELETE_ERR* | 删除失败 | | *QOSA_ERROR_MSGQ_RESET_ERR* | 重置失败 | # 应用逻辑流程图 ```{figure} images/board_H1jkwr3eJhgPs7bnM4dcOqMynxg.jpg :align: center :alt: image ``` # 示例代码 完整示例代码请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/system/sync_comm/queue/messque_demo.c 。