msgqueue
msgqueue 提供消息队列的创建、读写、删除及状态查询功能,支持 FIFO (First In First Out) 读取模式和头部优先写入模式。
头文件清单
接口清单
| 接口名称 | 功能简述 |
|---|---|
| osal_msg_queue_create | 创建消息队列 |
| osal_msg_queue_write_copy | 向队列尾部写入数据 |
| osal_msg_queue_read_copy | 从队列中读取数据 |
| osal_msg_queue_write_head_copy | 向队列头部写入数据 |
| osal_msg_queue_delete | 删除消息队列 |
| osal_msg_queue_is_full | 检查消息队列是否已满 |
| osal_msg_queue_get_msg_num | 获取当前消息队列中的消息数量 |
Functions
osal_msg_queue_create
int osal_msg_queue_create(const char *name, unsigned short queue_len, unsigned long *queue_id, unsigned int flags, unsigned short max_msgsize)
头文件清单
功能说明
- 创建消息队列,分配队列控制结构并返回队列ID
- 队列可用数量受 LOSCFG_BASE_IPC_QUEUE_LIMIT 限制,需要时可修改该配置值
- 该函数仅在 LiteOS 系统中定义了 LOSCFG_QUEUE_DYNAMIC_ALLOCATION 时可用;FreeRTOS 系统中队列可用数量由系统内存决定
- queue_id 在 FreeRTOS 系统中作为地址使用,在 LiteOS 系统中作为整型使用
前置条件
- 调用时序约束:LiteOS 系统已初始化完成
- 依赖关系:系统中可用队列数量未达到 LOSCFG_BASE_IPC_QUEUE_LIMIT 上限
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| name | const char * | 消息队列名称,保留参数,当前未使用 | NULL 或合法字符串指针 |
| queue_len | unsigned short | 队列长度,即队列中可容纳的消息条数 | [1, 0xFFFF] |
| flags | unsigned int | 队列模式,保留参数,当前未使用 | 0 |
| max_msgsize | unsigned short | 单条消息的最大节点大小 | [1, 0xFFFF] |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| queue_id | unsigned long * | 成功创建后写入队列ID,用于后续队列操作;需为非NULL指针,指向有效的 unsigned long 内存空间 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 创建成功 | 消息队列创建成功 |
| Other | 其他错误码,参考LiteOS LOS_QueueCreate 返回值 | 队列创建失败,如队列数量超限、内存不足等 |
参考案例
application/3322/input_wear/input_feature/input_feature.cmiddleware/chips/3322/dfx/diag_data_store_adapt.cdrivers/chips/3322/porting/ipc/shared/ipc_test.c
osal_msg_queue_write_copy
int osal_msg_queue_write_copy(unsigned long queue_id, void *buffer_addr, unsigned int buffer_size, unsigned int timeout)
头文件清单
功能说明
- 将指定大小的数据拷贝写入消息队列尾部,采用尾入方式
- 写入前会检查队列是否已满,已满时返回队列满错误码
- timeout 参数为相对时间,单位为 Tick;FreeRTOS 系统中 buffer_size 不支持指定大小读写,仅支持全量存取和整位对齐
前置条件
- 调用时序约束:目标消息队列已通过 osal_msg_queue_create 成功创建,LiteOS 系统已初始化完成
- 调用上下文约束:不在中断上下文或软件定时器回调中调用(FreeRTOS 除外)
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| queue_id | unsigned long | 队列ID,由 osal_msg_queue_create 创建 | 有效的队列ID |
| buffer_addr | void * | 待写入数据的起始地址 | 非NULL指针,指向有效内存空间 |
| buffer_size | unsigned int | 待写入数据的缓冲区大小 | [1, 0xFFFFFFFF] |
| timeout | unsigned int | 超时时间,单位为 Tick | [0, OSAL_MSGQ_WAIT_FOREVER(0xFFFFFFFF)] |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 写入成功 | 数据成功写入队列 |
| OSAL_ERRNO_QUEUE_ISFULL(0x02000616) | 队列已满 | 队列中无可用写入空间 |
| Other | 其他错误码,参考LiteOS LOS_QueueWriteCopy 返回值 | 写入失败,如队列ID无效、超时等 |
参考案例
application/3322/input_wear/input_feature/input_feature.cdrivers/drivers/driver/audio/source/drv/arch/drv_sap_msg.cmiddleware/chips/3322/dfx/diag_data_store_adapt.c
osal_msg_queue_read_copy
int osal_msg_queue_read_copy(unsigned long queue_id, void *buffer_addr, unsigned int *buffer_size, unsigned int timeout)
头文件清单
功能说明
- 从消息队列中读取数据,采用先入先出(FIFO)模式,最先存入队列的数据最先被读取
- buffer_size 为输入输出参数,读取前存放期望读取的大小,读取后存放实际读取的大小
- timeout 参数为相对时间,单位为 Tick;FreeRTOS 系统中 buffer_size 不支持指定大小读写,仅支持全量存取和整位对齐
前置条件
- 调用时序约束:目标消息队列已通过 osal_msg_queue_create 成功创建,LiteOS 系统已初始化完成
- 调用上下文约束:不在中断上下文或软件定时器回调中调用(FreeRTOS 除外)
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| queue_id | unsigned long | 队列ID,由 osal_msg_queue_create 创建 | 有效的队列ID |
| buffer_addr | void * | 存放读取数据的起始地址 | 非NULL指针,指向有效内存空间 |
| buffer_size | unsigned int * | 输入时为期望读取大小,输出时为实际读取大小 | 非NULL指针,输入值不小于实际消息大小 |
| timeout | unsigned int | 超时时间,单位为 Tick | [0, OSAL_MSGQ_WAIT_FOREVER(0xFFFFFFFF)] |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| buffer_size | unsigned int * | 读取完成后写入实际读取的数据大小 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 读取成功 | 数据成功从队列中读取 |
| Other | 其他错误码,参考LiteOS LOS_QueueReadCopy 返回值 | 读取失败,如队列ID无效、超时、队列为空等 |
参考案例
application/3322/input_wear/input_feature/input_feature.cdrivers/drivers/driver/audio/source/drv/arch/drv_sap_msg.cmiddleware/chips/3322/dfx/diag_data_store_adapt.c
osal_msg_queue_write_head_copy
int osal_msg_queue_write_head_copy(unsigned long queue_id, void *buffer_addr, unsigned int buffer_size, unsigned int timeout)
头文件清单
功能说明
- 将指定大小的数据拷贝写入消息队列头部,采用头入方式,写入的消息将被优先读取
- timeout 参数为相对时间,单位为 Tick;FreeRTOS 系统中 buffer_size 不支持指定大小读写,仅支持全量存取和整位对齐
前置条件
- 调用时序约束:目标消息队列已通过 osal_msg_queue_create 成功创建,LiteOS 系统已初始化完成
- 调用上下文约束:不在中断上下文或软件定时器回调中调用(FreeRTOS 除外)
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| queue_id | unsigned long | 队列ID,由 osal_msg_queue_create 创建 | 有效的队列ID |
| buffer_addr | void * | 待写入数据的起始地址 | 非NULL指针,指向有效内存空间 |
| buffer_size | unsigned int | 待写入数据的缓冲区大小,不可为0 | [1, 0xFFFFFFFF] |
| timeout | unsigned int | 超时时间,单位为 Tick | [0, OSAL_MSGQ_WAIT_FOREVER(0xFFFFFFFF)] |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 写入成功 | 数据成功写入队列头部 |
| Other | 其他错误码,参考LiteOS LOS_QueueWriteHeadCopy 返回值 | 写入失败,如队列ID无效、超时、队列已满等 |
参考案例
kernel/dpal/src/dpal.c
osal_msg_queue_delete
头文件清单
功能说明
- 删除已创建的消息队列,释放队列资源
- 无法删除未创建的队列;存在任务阻塞等待或有读写操作进行中的队列无法删除
- queue_id 在 FreeRTOS 系统中作为地址使用,在 LiteOS 系统中作为整型使用
前置条件
- 调用时序约束:目标消息队列已通过 osal_msg_queue_create 成功创建
- 依赖关系:队列上无任务阻塞等待,无正在进行的读写操作
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| queue_id | unsigned long | 队列ID,由 osal_msg_queue_create 创建 | 有效的队列ID |
参考案例
drivers/drivers/driver/audio/source/drv/arch/drv_sap_msg.cmiddleware/chips/3322/gnss/gnss.cmiddleware/chips/3322/dfx/diag_data_store_adapt.c
osal_msg_queue_is_full
头文件清单
功能说明
- 检查消息队列是否已满,队列满时无法再写入新消息
- 获取失败时返回 TRUE(队列被视为满状态)
- queue_id 在 FreeRTOS 系统中作为地址使用,在 LiteOS 系统中作为整型使用
前置条件
- 调用时序约束:目标消息队列已通过 osal_msg_queue_create 成功创建
- 依赖关系:队列ID有效且队列资源可访问
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| queue_id | unsigned long | 队列ID,由 osal_msg_queue_create 创建 | 有效的队列ID |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| true(1) | 队列已满 | 队列中无可用写入空间,或获取队列信息失败 |
| false(0) | 队列未满 | 队列中仍有可用写入空间 |
参考案例
application/3322/input_wear/input_feature/input_feature.cdrivers/chips/3322/pmu/drivers/pmu_alarm.c
osal_msg_queue_get_msg_num
头文件清单
功能说明
- 获取当前消息队列中已存在的消息数量
- 获取失败时返回 OSAL_INVALID_MSG_NUM
- queue_id 在 FreeRTOS 系统中作为地址使用,在 LiteOS 系统中作为整型使用
前置条件
- 调用时序约束:目标消息队列已通过 osal_msg_queue_create 成功创建
- 依赖关系:队列ID有效且队列信息可获取
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| queue_id | unsigned long | 队列ID,由 osal_msg_queue_create 创建 | 有效的队列ID |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_INVALID_MSG_NUM(0xFFFFFFFF) | 获取失败 | 队列ID无效或获取队列信息失败 |
| 其他非负值 | 队列中的消息数量 | 成功获取队列中的消息数量 |
参考案例
middleware/chips/3322/dfx/diag_data_store_adapt.cmiddleware/chips/3322/dfx/dfx_system_init.c