跳转至

msgqueue

msgqueue 提供消息队列的创建、读写、删除及状态查询功能,支持 FIFO (First In First Out) 读取模式和头部优先写入模式。

头文件清单

#include "include/osal/msgqueue/osal_msgqueue.h"

接口清单

接口名称 功能简述
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)

头文件清单

#include "include/osal/msgqueue/osal_msgqueue.h"

功能说明

  • 创建消息队列,分配队列控制结构并返回队列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.c
  • middleware/chips/3322/dfx/diag_data_store_adapt.c
  • drivers/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)

头文件清单

#include "include/osal/msgqueue/osal_msgqueue.h"

功能说明

  • 将指定大小的数据拷贝写入消息队列尾部,采用尾入方式
  • 写入前会检查队列是否已满,已满时返回队列满错误码
  • 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.c
  • drivers/drivers/driver/audio/source/drv/arch/drv_sap_msg.c
  • middleware/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)

头文件清单

#include "include/osal/msgqueue/osal_msgqueue.h"

功能说明

  • 从消息队列中读取数据,采用先入先出(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.c
  • drivers/drivers/driver/audio/source/drv/arch/drv_sap_msg.c
  • middleware/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)

头文件清单

#include "include/osal/msgqueue/osal_msgqueue.h"

功能说明

  • 将指定大小的数据拷贝写入消息队列头部,采用头入方式,写入的消息将被优先读取
  • 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

void osal_msg_queue_delete(unsigned long queue_id)

头文件清单

#include "include/osal/msgqueue/osal_msgqueue.h"

功能说明

  • 删除已创建的消息队列,释放队列资源
  • 无法删除未创建的队列;存在任务阻塞等待或有读写操作进行中的队列无法删除
  • 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.c
  • middleware/chips/3322/gnss/gnss.c
  • middleware/chips/3322/dfx/diag_data_store_adapt.c

osal_msg_queue_is_full

int osal_msg_queue_is_full(unsigned long queue_id)

头文件清单

#include "include/osal/msgqueue/osal_msgqueue.h"

功能说明

  • 检查消息队列是否已满,队列满时无法再写入新消息
  • 获取失败时返回 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.c
  • drivers/chips/3322/pmu/drivers/pmu_alarm.c

osal_msg_queue_get_msg_num

unsigned int osal_msg_queue_get_msg_num(unsigned long queue_id)

头文件清单

#include "include/osal/msgqueue/osal_msgqueue.h"

功能说明

  • 获取当前消息队列中已存在的消息数量
  • 获取失败时返回 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.c
  • middleware/chips/3322/dfx/dfx_system_init.c

Macros

OSAL_INVALID_MSG_NUM

#define OSAL_INVALID_MSG_NUM 0xFFFFFFFF

OSAL_MSGQ_WAIT_FOREVER

#define OSAL_MSGQ_WAIT_FOREVER 0xFFFFFFFF

OSAL_MSGQ_NO_WAIT

#define OSAL_MSGQ_NO_WAIT 0

OSAL_SUCCESS

#define OSAL_SUCCESS 0

OSAL_ERRNO_QUEUE_ISFULL

#define OSAL_ERRNO_QUEUE_ISFULL 0x02000616