开发指导
使用场景
任务创建后,内核可以执行锁任务调度,解锁任务调度,挂起,恢复,延时等操作,同时也可以设置任务优先级,获取任务优先级。
功能
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。
平台差异性
无。