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

开发指导

使用场景

任务创建后,内核可以执行锁任务调度,解锁任务调度,挂起,恢复,延时等操作,同时也可以设置任务优先级,获取任务优先级。

功能

Huawei LiteOS 的任务管理模块提供下面几种功能,接口详细信息可以查看API参考。

功能分类

接口名

描述

创建和删除任务

LOS_TaskCreateOnly

创建任务,并使该任务进入suspend状态,不对该任务进行调度。如果需要调度,可以调用LOS_TaskResume使该任务进入ready状态

LOS_TaskCreate

创建任务,并使该任务进入ready状态,如果就绪队列中没有更高优先级的任务,则运行该任务

LOS_TaskCreateOnlyStatic

创建任务,任务栈由用户传入,并使该任务进入suspend状态,不对该任务进行调度。如果需要调度,可以调用LOS_TaskResume使该任务进入ready状态

LOS_TaskCreateStatic

创建任务,任务栈由用户传入,并使该任务进入ready状态,如果就绪队列中没有更高优先级的任务,则运行该任务

LOS_TaskDelete

删除指定的任务

控制任务状态

LOS_TaskResume

恢复挂起的任务,使该任务进入ready状态

LOS_TaskSuspend

挂起指定的任务,然后切换任务

LOS_TaskDelay

任务延时等待,释放CPU,等待时间到期后该任务会重新进入ready状态

LOS_TaskYield

当前任务释放CPU,并将其移到具有相同优先级的就绪任务队列的末尾

控制任务调度

LOS_TaskLock

锁任务调度,但任务仍可被中断打断

LOS_TaskUnlock

解锁任务调度

控制任务优先级

LOS_CurTaskPriSet

设置当前任务的优先级

LOS_TaskPriSet

设置指定任务的优先级

LOS_TaskPriGet

获取指定任务的优先级

设置任务亲和性

LOS_TaskCpuAffiSet

设置指定任务的运行cpu集合(该函数仅在SMP模式下支持)

回收任务栈资源

LOS_TaskResRecycle

回收所有待回收的任务栈资源

获取任务信息

LOS_CurTaskIDGet

获取当前任务的ID

LOS_TaskInfoGet

获取指定任务的信息,包括任务状态、优先级、任务栈大小、栈顶指针SP、任务入口函数、已使用的任务栈大小等

LOS_TaskCpuAffiGet

获取指定任务的运行cpu集合(该函数仅在SMP模式下支持)

任务信息维测

LOS_TaskSwitchHookReg

注册任务上下文切换的钩子函数。只有开启LOSCFG_BASE_CORE_TSK_MONITOR宏开关后,这个钩子函数才会在任务发生上下文切换时被调用

任务空闲处理回调

LOS_IdleHandlerHookReg

注册空闲任务钩子函数,当系统空闲时调用

  • 可以通过make menuconfig配置LOSCFG_KERNEL_SMP使能多核模式( 菜单路径为Kernel ---> Enable Kernel SMP)。在SMP的子菜单中,还可以设置核的数量、使能多任务的核间同步、使能函数跨核调用。
  • 在多核模式下,创建任务时可以传入usCpuAffiMask来配置任务的CPU亲和性,该标志位采用1bit-1core的对应方式,详细可见TSK_INIT_PARAM_S结构体。
  • 各个任务的任务栈大小,在创建任务时可以进行针对性的设置,若设置为0,则使用默认任务栈大小(LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE)作为任务栈大小。

TASK状态

Huawei LiteOS任务的大多数状态由内核维护,唯有自删除状态对用户可见,需要用户在创建任务时传入:

定义

实际数值

描述

LOS_TASK_STATUS_DETACHED

0x0100

任务是自删除的

用户在调用创建任务接口时,可以将创建任务的TSK_INIT_PARAM_S参数的uwResved域设置为LOS_TASK_STATUS_DETACHED,即自删除状态,设置成自删除状态的任务会在运行完成后执行自删除操作。

自删除状态受LOSCFG_COMPAT_POSIX开关影响。
  • LOSCFG_COMPAT_POSIX打开,只有将任务状态设置为LOS_TASK_STATUS_DETACHED才能实现自删除,否则任务完成时不会自删除。
  • LOSCFG_COMPAT_POSIX关闭,任务完成时都会自删除,不管TSK_INIT_PARAM_S参数的uwResved域是否设置为LOS_TASK_STATUS_DETACHED。

TASK错误码

创建任务、删除任务、挂起任务、恢复任务、延时任务等操作存在失败的可能,失败时会返回对应的错误码,以便快速定位错误原因。

序号

定义

实际数值

描述

参考解决方案

1

LOS_ERRNO_TSK_NO_MEMORY

0x03000200

内存空间不足

增大动态内存空间,有两种方式可以实现:

  • 设置更大的系统动态内存池,配置项为OS_SYS_MEM_SIZE
  • 释放一部分动态内存

如果错误发生在LiteOS启动过程中的任务初始化,还可以通过减少系统支持的最大任务数来解决;如果错误发生在任务创建过程中,也可以减小任务栈大小来解决

2

LOS_ERRNO_TSK_PTR_NULL

0x02000201

传递给任务创建接口的任务参数initParam为空指针,或者传递给任务信息获取的接口的参数为空指针

确保传入的参数不为空指针

3

LOS_ERRNO_TSK_STKSZ_NOT_ALIGN

0x02000202

暂不使用该错误码

-

4

LOS_ERRNO_TSK_PRIOR_ERROR

0x02000203

创建任务或者设置任务优先级时,传入的优先级参数不正确

检查任务优先级,必须在[0, 31]的范围内

5

LOS_ERRNO_TSK_ENTRY_NULL

0x02000204

创建任务时传入的任务入口函数为空指针

定义任务入口函数

6

LOS_ERRNO_TSK_NAME_EMPTY

0x02000205

创建任务时传入的任务名为空指针

设置任务名

7

LOS_ERRNO_TSK_STKSZ_TOO_SMALL

0x02000206

创建任务时传入的任务栈太小

增大任务的任务栈大小使之不小于系统设置最小任务栈大小(配置项为LOS_TASK_MIN_STACK_SIZE)

8

LOS_ERRNO_TSK_ID_INVALID

0x02000207

无效的任务ID

检查任务ID

9

LOS_ERRNO_TSK_ALREADY_SUSPENDED

0x02000208

挂起任务时,发现任务已经被挂起

等待这个任务被恢复后,再去尝试挂起这个任务

10

LOS_ERRNO_TSK_NOT_SUSPENDED

0x02000209

恢复任务时,发现任务未被挂起

挂起这个任务后,再去尝试恢复这个任务

11

LOS_ERRNO_TSK_NOT_CREATED

0x0200020a

任务未被创建

创建这个任务,这个错误可能会发生在以下操作中:

  • 删除任务
  • 恢复/挂起任务
  • 设置指定任务的优先级
  • 获取指定任务的信息
  • 设置指定任务的运行cpu集合

12

LOS_ERRNO_TSK_DELETE_LOCKED

0x0300020b

删除任务时,任务处于锁定状态

解锁任务之后再删除任务

13

LOS_ERRNO_TSK_MSG_NONZERO

0x0200020c

暂不使用该错误码

-

14

LOS_ERRNO_TSK_DELAY_IN_INT

0x0300020d

中断期间,进行任务延时

等待退出中断后再进行延时操作

15

LOS_ERRNO_TSK_DELAY_IN_LOCK

0x0200020e

在任务锁定状态下,延时该任务

解锁任务之后再延时任务

16

LOS_ERRNO_TSK_YIELD_IN_LOCK

0x0200020f

在任务锁定状态下,进行Yield操作

任务解锁后再进行Yield操作

17

LOS_ERRNO_TSK_YIELD_NOT_ENOUGH_TASK

0x02000210

执行Yield操作时,发现具有相同优先级的就绪任务队列中没有其他任务

增加与当前任务具有相同优先级的任务数

18

LOS_ERRNO_TSK_TCB_UNAVAILABLE

0x02000211

创建任务时,发现没有空闲的任务控制块可以使用

调用LOS_TaskResRecyle接口回收空闲的任务控制块,如果回收后依然创建失败,再增加系统的任务控制块数量

19

LOS_ERRNO_TSK_HOOK_NOT_MATCH

0x02000212

暂不使用该错误码

-

20

LOS_ERRNO_TSK_HOOK_IS_FULL

0x02000213

暂不使用该错误码

-

21

LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK

0x02000214

不允许删除、挂起、延时系统级别的任务,例如idle任务、软件定时器任务,也不允许修改系统级别的任务优先级

检查任务ID,不要操作系统任务

22

LOS_ERRNO_TSK_SUSPEND_LOCKED

0x03000215

不允许将处于锁定状态的任务挂起

任务解锁后,再尝试挂起任务

23

LOS_ERRNO_TSK_FREE_STACK_FAILED

0x02000217

暂不使用该错误码

-

24

LOS_ERRNO_TSK_STKAREA_TOO_SMALL

0x02000218

暂不使用该错误码

-

25

LOS_ERRNO_TSK_ACTIVE_FAILED

0x03000219

暂不使用该错误码

-

26

LOS_ERRNO_TSK_CONFIG_TOO_MANY

0x0200021a

暂不使用该错误码

-

27

LOS_ERRNO_TSK_CP_SAVE_AREA_NOT_ALIGN

0x0200021b

暂不使用该错误码

-

28

LOS_ERRNO_TSK_MSG_Q_TOO_MANY

0x0200021d

暂不使用该错误码

-

29

LOS_ERRNO_TSK_CP_SAVE_AREA_NULL

0x0200021e

暂不使用该错误码

-

30

LOS_ERRNO_TSK_SELF_DELETE_ERR

0x0200021f

暂不使用该错误码

-

31

LOS_ERRNO_TSK_STKSZ_TOO_LARGE

0x02000220

创建任务时,设置了过大的任务栈

减小任务栈大小

32

LOS_ERRNO_TSK_SUSPEND_SWTMR_NOT_ALLOWED

0x02000221

暂不使用该错误码

-

34

LOS_ERRNO_TSK_CPU_AFFINITY_MASK_ERR

0x03000223

设置指定任务的运行cpu集合时,传入了错误的cpu集合

检查传入的cpu掩码

35

LOS_ERRNO_TSK_YIELD_IN_INT

0x02000224

不允许在中断中对任务进行Yield操作

不要在中断中进行Yield操作

36

LOS_ERRNO_TSK_MP_SYNC_RESOURCE

0x02000225

跨核任务删除同步功能,资源申请失败

通过设置更大的LOSCFG_BASE_IPC_SEM_LIMIT的值,增加系统支持的信号量个

37

LOS_ERRNO_TSK_MP_SYNC_FAILED

0x02000226

跨核任务删除同步功能,任务未及时删除

需要检查目标删除任务是否存在频繁的状态切换,导致系统无法在规定的时间内完成删除的动作

  • 错误码定义见错误码简介。8~15位的所属模块为任务模块,值为0x02。
  • 任务模块中的错误码序号 0x16、0x1c,未被定义,不可用。

开发流程

以创建任务为例,讲解开发流程。

  1. 执行make menuconfig命令,进入Kernel ---> Basic Config ---> Task菜单,完成任务模块的配置。

    配置项

    含义

    取值范围

    默认值

    依赖

    LOSCFG_BASE_CORE_TSK_LIMIT

    系统支持的最大任务数

    [0, OS_SYS_MEM_SIZE)

    不同平台默认值不一样

    LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE

    最小任务栈大小,一般使用默认值即可

    [0, OS_SYS_MEM_SIZE)

    不同平台默认值不一样

    LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE

    默认任务栈大小

    [0, OS_SYS_MEM_SIZE)

    不同平台默认值不一样

    LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE

    IDLE任务栈大小,一般使用默认值即可

    [0, OS_SYS_MEM_SIZE)

    不同平台默认值不一样

    LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO

    默认任务优先级,一般使用默认配置即可

    [0,31]

    10

    LOSCFG_BASE_CORE_TIMESLICE

    任务时间片调度开关

    YES/NO

    YES

    LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT

    同优先级任务最长执行时间(单位:Tick)

    [0, 65535]

    不同平台默认值不一样

    LOSCFG_OBSOLETE_API

    使能后,任务参数使用旧方式UINTPTR auwArgs[4],否则使用新的任务参数VOID *pArgs。建议关闭此开关,使用新的任务参数

    YES/NO

    不同平台默认值不一样

    LOSCFG_LAZY_STACK

    使能惰性压栈功能

    YES/NO

    YES

    M核

    LOSCFG_BASE_CORE_TSK_MONITOR

    任务栈溢出检查和轨迹开关

    YES/NO

    YES

    LOSCFG_TASK_STATIC_ALLOCATION

    支持创建任务时,由用户传入任务栈

    YES/NO

    NO

  2. 锁任务调度LOS_TaskLock,防止高优先级任务调度。
  3. 创建任务LOS_TaskCreate,或静态创建任务LOS_TaskCreateStatic(需要打开LOSCFG_TASK_STATIC_ALLOCATION宏)。
  4. 解锁任务LOS_TaskUnlock,让任务按照优先级进行调度。
  5. 延时任务LOS_TaskDelay,任务延时等待。
  6. 挂起指定的任务LOS_TaskSuspend,任务挂起等待恢复操作。
  7. 恢复挂起的任务LOS_TaskResume。

平台差异性

无。

相关文档