文档首页> LiteOS> 内核> 队列> 开发指导
更新时间:2021-07-08 GMT+08:00
分享

开发指导

使用场景

队列用于任务间通信,可以实现消息的异步处理。同时消息的发送方和接收方不需要彼此联系,两者间是解耦的。

功能

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未被定义,不可用。

开发流程

使用队列模块的典型流程如下:

  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. 删除队列。

平台差异性

无。

分享:

    相关文档

    相关产品