开发指导
使用场景
队列用于任务间通信,可以实现消息的异步处理。同时消息的发送方和接收方不需要彼此联系,两者间是解耦的。
功能
Huawei LiteOS中的队列模块提供下面几种功能,接口详细信息可以查看API参考。
功能分类 | 接口名 | 描述 |
|---|---|---|
创建/删除消息队列 | LOS_QueueCreate | 创建一个消息队列,由系统动态申请队列空间 |
LOS_QueueCreateStatic | 创建一个消息队列,由用户分配队列内存空间传入接口 | |
LOS_QueueDelete | 根据队列ID删除一个指定队列 | |
读/写队列(不带拷贝) | LOS_QueueRead | 读取指定队列头节点中的数据(队列节点中的数据实际上是一个地址) |
LOS_QueueWrite | 向指定队列尾节点中写入入参bufferAddr的值(即buffer的地址) | |
LOS_QueueWriteHead | 向指定队列头节点中写入入参bufferAddr的值(即buffer的地址) | |
读/写队列(带拷贝) | LOS_QueueReadCopy | 读取指定队列头节点中的数据 |
LOS_QueueWriteCopy | 向指定队列尾节点中写入入参bufferAddr中保存的数据 | |
LOS_QueueWriteHeadCopy | 向指定队列头节点中写入入参bufferAddr中保存的数据 | |
获取队列信息 | LOS_QueueInfoGet | 获取指定队列的信息,包括队列ID、队列长度、消息节点大小、头节点、尾节点、可读节点数量、可写节点数量、等待读操作的任务、等待写操作的任务、等待mail操作的任务 |
队列错误码
对存在失败可能性的操作返回对应的错误码,以便快速定位错误原因。
序号 | 定义 | 实际数值 | 描述 | 参考解决方案 |
|---|---|---|---|---|
1 | LOS_ERRNO_QUEUE_MAXNUM_ZERO | 0x02000600 | 系统支持的最大队列数为0 | 系统支持的最大队列数应该大于0。如果不使用队列模块,则将队列模块静态裁剪开关LOSCFG_BASE_IPC_QUEUE设置为NO |
2 | LOS_ERRNO_QUEUE_NO_MEMORY | 0x02000601 | 队列初始化时,从动态内存池申请内存失败 | 设置更大的系统动态内存池,配置项为OS_SYS_MEM_SIZE,或减少系统支持的最大队列数 |
3 | LOS_ERRNO_QUEUE_CREATE_NO_MEMORY | 0x02000602 | 创建队列时,从动态内存池申请内存失败 | 设置更大的系统动态内存池,配置项为OS_SYS_MEM_SIZE,或减少要创建队列的队列长度和消息节点大小 |
4 | LOS_ERRNO_QUEUE_SIZE_TOO_BIG | 0x02000603 | 创建队列时消息节点大小超过上限 | 更改入参消息节点大小,使之不超过上限 |
5 | LOS_ERRNO_QUEUE_CB_UNAVAILABLE | 0x02000604 | 创建队列时,系统中已经没有空闲队列 | 增加系统支持的最大队列数 |
6 | LOS_ERRNO_QUEUE_NOT_FOUND | 0x02000605 | 传递给删除队列接口的队列ID大于等于系统支持的最大队列数 | 确保队列ID是有效的 |
7 | LOS_ERRNO_QUEUE_PEND_IN_LOCK | 0x02000606 | 当任务被锁定时,禁止在队列中阻塞等待写消息或读消息 | 使用队列前解锁任务 |
8 | LOS_ERRNO_QUEUE_TIMEOUT | 0x02000607 | 等待处理队列超时 | 检查设置的超时时间是否合适 |
9 | LOS_ERRNO_QUEUE_IN_TSKUSE | 0x02000608 | 队列存在阻塞任务而不能被删除 | 使任务能够获得资源而不是在队列中被阻塞 |
10 | LOS_ERRNO_QUEUE_WRITE_IN_INTERRUPT | 0x02000609 | 在中断处理程序中不能以阻塞模式写队列 | 将写队列设为非阻塞模式,即将写队列的超时时间设置为0 |
11 | LOS_ERRNO_QUEUE_NOT_CREATE | 0x0200060a | 队列未创建 | 创建该队列,或更换为一个已经创建的队列 |
12 | LOS_ERRNO_QUEUE_IN_TSKWRITE | 0x0200060b | 队列读写不同步 | 同步队列的读写,即多个任务不能并发读写同一个队列 |
13 | LOS_ERRNO_QUEUE_CREAT_PTR_NULL | 0x0200060c | 对于创建队列接口,保存队列ID的入参为空指针 | 确保传入的参数不为空指针 |
14 | LOS_ERRNO_QUEUE_PARA_ISZERO | 0x0200060d | 对于创建队列接口,入参队列长度或消息节点大小为0 | 传入正确的队列长度和消息节点大小 |
15 | LOS_ERRNO_QUEUE_INVALID | 0x0200060e | 传递给读队列或写队列或获取队列信息接口的队列ID大于等于系统支持的最大队列数 | 确保队列ID有效 |
16 | LOS_ERRNO_QUEUE_READ_PTR_NULL | 0x0200060f | 传递给读队列接口的指针为空 | 确保传入的参数不为空指针 |
17 | LOS_ERRNO_QUEUE_READSIZE_IS_INVALID | 0x02000610 | 传递给读队列接口的缓冲区大小为0或者大于0xFFFB | 传入的一个正确的缓冲区大小需要大于0且小于0xFFFC |
18 | LOS_ERRNO_QUEUE_WRITE_PTR_NULL | 0x02000612 | 传递给写队列接口的缓冲区指针为空 | 确保传入的参数不为空指针 |
19 | LOS_ERRNO_QUEUE_WRITESIZE_ISZERO | 0x02000613 | 传递给写队列接口的缓冲区大小为0 | 传入正确的缓冲区大小 |
20 | LOS_ERRNO_QUEUE_WRITE_SIZE_TOO_BIG | 0x02000615 | 传递给写队列接口的缓冲区大小比队列的消息节点大小要大 | 减小缓冲区大小,或增大队列的消息节点大小 |
21 | LOS_ERRNO_QUEUE_ISFULL | 0x02000616 | 写队列时没有可用的空闲节点 | 写队列之前,确保在队列中存在可用的空闲节点,或者使用阻塞模式写队列,即设置大于0的写队列超时时间 |
22 | LOS_ERRNO_QUEUE_PTR_NULL | 0x02000617 | 传递给获取队列信息接口的指针为空 | 确保传入的参数不为空指针 |
23 | LOS_ERRNO_QUEUE_READ_IN_INTERRUPT | 0x02000618 | 在中断处理程序中不能以阻塞模式读队列 | 将读队列设为非阻塞模式,即将读队列的超时时间设置为0 |
24 | LOS_ERRNO_QUEUE_MAIL_HANDLE_INVALID | 0x02000619 | CMSIS-RTOS 1.0中的mail队列,释放内存块时,发现传入的mail队列ID无效 | 确保传入的mail队列ID是正确的 |
25 | LOS_ERRNO_QUEUE_MAIL_PTR_INVALID | 0x0200061a | CMSIS-RTOS 1.0中的mail队列,释放内存块时,发现传入的mail内存池指针为空 | 传入非空的mail内存池指针 |
26 | LOS_ERRNO_QUEUE_MAIL_FREE_ERROR | 0x0200061b | CMSIS-RTOS 1.0中的mail队列,释放内存块失败 | 传入非空的mail队列内存块指针 |
27 | LOS_ERRNO_QUEUE_ISEMPTY | 0x0200061d | 队列已空 | 读队列之前,确保队列中存在未读的消息,或者使用阻塞模式读队列,即设置大于0的读队列超时时间 |
28 | LOS_ERRNO_QUEUE_READ_SIZE_TOO_SMALL | 0x0200061f | 传递给读队列接口的读缓冲区大小小于队列消息节点大小 | 增加缓冲区大小,或减小队列消息节点大小 |

- 错误码定义见错误码简介。8~15位的所属模块为队列模块,值为0x06。
- 队列模块中的错误码序号0x11、0x14未被定义,不可用。
开发流程
使用队列模块的典型流程如下:
- 执行make menuconfig命令,进入Kernel ---> Enable Queue菜单,完成队列模块的配置。
配置项
含义
取值范围
默认值
依赖
LOSCFG_BASE_IPC_QUEUE
队列模块裁剪开关
YES/NO
YES
无
LOSCFG_QUEUE_STATIC_ALLOCATION
支持以用户分配内存的方式创建队列
YES/NO
NO
LOSCFG_BASE_IPC_QUEUE
LOSCFG_BASE_IPC_QUEUE_LIMIT
系统支持的最大队列数
<65535
1024
LOSCFG_BASE_IPC_QUEUE
- 创建队列。创建成功后,可以得到队列ID。
- 写队列。
- 读队列。
- 获取队列信息。
- 删除队列。
平台差异性
无。

