开发指导
使用场景
任务创建后,内核可以执行锁任务调度,解锁任务调度,挂起,恢复,延时等操作,同时也可以设置任务优先级,获取任务优先级。
功能
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打开,只有将任务状态设置为LOS_TASK_STATUS_DETACHED才能实现自删除,否则任务完成时不会自删除。
- LOSCFG_COMPAT_POSIX关闭,任务完成时都会自删除,不管TSK_INIT_PARAM_S参数的uwResved域是否设置为LOS_TASK_STATUS_DETACHED。
TASK错误码
创建任务、删除任务、挂起任务、恢复任务、延时任务等操作存在失败的可能,失败时会返回对应的错误码,以便快速定位错误原因。
序号 | 定义 | 实际数值 | 描述 | 参考解决方案 |
|---|---|---|---|---|
1 | LOS_ERRNO_TSK_NO_MEMORY | 0x03000200 | 内存空间不足 | 增大动态内存空间,有两种方式可以实现:
如果错误发生在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 | 任务未被创建 | 创建这个任务,这个错误可能会发生在以下操作中:
|
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,未被定义,不可用。
开发流程
以创建任务为例,讲解开发流程。
- 执行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
无
- 锁任务调度LOS_TaskLock,防止高优先级任务调度。
- 创建任务LOS_TaskCreate,或静态创建任务LOS_TaskCreateStatic(需要打开LOSCFG_TASK_STATIC_ALLOCATION宏)。
- 解锁任务LOS_TaskUnlock,让任务按照优先级进行调度。
- 延时任务LOS_TaskDelay,任务延时等待。
- 挂起指定的任务LOS_TaskSuspend,任务挂起等待恢复操作。
- 恢复挂起的任务LOS_TaskResume。
平台差异性
无。

