
# 开发指导
#### 使用场景
任务创建后，内核可以执行锁任务调度，解锁任务调度，挂起，恢复，延时等操作，同时也可以设置任务优先级，获取任务优先级。
#### 功能
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   | 注册空闲任务钩子函数，当系统空闲时调用                                                             |
   
![](https://support.huaweicloud.com/kernelmanual-LiteOS/public_sys-resources/notice_3.0-zh-cn.png)
- 可以通过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，即自删除状态，设置成自删除状态的任务会在运行完成后执行自删除操作。
![](https://support.huaweicloud.com/kernelmanual-LiteOS/public_sys-resources/notice_3.0-zh-cn.png)
自删除状态受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 | 跨核任务删除同步功能，任务未及时删除                                   | 需要检查目标删除任务是否存在频繁的状态切换，导致系统无法在规定的时间内完成删除的动作                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   
![](https://support.huaweicloud.com/kernelmanual-LiteOS/public_sys-resources/notice_3.0-zh-cn.png)
- 错误码定义见[错误码简介](https://support.huaweicloud.com/kernelmanual-LiteOS/zh-cn_topic_0311018405.html#ZH-CN_TOPIC_0311018405__zh-cn_topic_0175230332_section29852515161)。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。
 
#### 平台差异性
无。
