
# 开发指导
#### 使用场景
队列用于任务间通信，可以实现消息的异步处理。同时消息的发送方和接收方不需要彼此联系，两者间是解耦的。
#### 功能
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 | 传递给读队列接口的读缓冲区大小小于队列消息节点大小                      | 增加缓冲区大小，或减小队列消息节点大小                                              |
   
![](https://support.huaweicloud.com/kernelmanual-LiteOS/public_sys-resources/notice_3.0-zh-cn.png)
- 错误码定义见[错误码简介](https://support.huaweicloud.com/kernelmanual-LiteOS/zh-cn_topic_0175230332.html#ZH-CN_TOPIC_0175230332__section29852515161)。8\~15位的所属模块为队列模块，值为0x06。
- 队列模块中的错误码序号0x11、0x14未被定义，不可用。
 
#### 开发流程
使用队列模块的典型流程如下：
1. 执行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 |
      
   
2. 创建队列。创建成功后，可以得到队列ID。
3. 写队列。
4. 读队列。
5. 获取队列信息。
6. 删除队列。
 
#### 平台差异性
无。
