开发指导
使用场景
队列用于任务间通信,可以实现消息的异步处理。同时消息的发送方和接收方不需要彼此联系,两者间是解耦的。
功能
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。
- 写队列。
- 读队列。
- 获取队列信息。
- 删除队列。
平台差异性
无。