# 开发指导
- [接口说明](#section158501652121514)
- [开发流程](#section783435801510)
- [编程实例](#section460018317164)
- [结果验证](#section189023104457)
任务创建后,内核可以执行锁任务调度,解锁任务调度,挂起,恢复,延时等操作,同时也可以设置任务优先级,获取任务优先级。
## 接口说明
OpenHarmony LiteOS-M内核的任务管理模块提供下面几种功能,接口详细信息可以查看API参考。
**表 1** 任务管理模块接口
功能分类
|
接口名
|
描述
|
创建和删除任务
|
LOS_TaskCreateOnly
|
创建任务,并使该任务进入suspend状态,不对该任务进行调度。如果需要调度,可以调用LOS_TaskResume使该任务进入ready状态。
|
LOS_TaskCreate
|
创建任务,并使该任务进入ready状态,如果就绪队列中没有更高优先级的任务,则运行该任务。
|
LOS_TaskDelete
|
删除指定的任务。
|
控制任务状态
|
LOS_TaskResume
|
恢复挂起的任务,使该任务进入ready状态。
|
LOS_TaskSuspend
|
挂起指定的任务,然后切换任务
|
LOS_TaskDelay
|
任务延时等待,释放CPU,等待时间到期后该任务会重新进入ready状态。传入参数为Tick数目。
|
LOS_Msleep
|
传入参数为毫秒数,转换为Tick数目,调用LOS_TaskDelay。
|
LOS_TaskYield
|
当前任务时间片设置为0,释放CPU,触发调度运行就绪任务队列中优先级最高的任务。
|
控制任务调度
|
LOS_TaskLock
|
锁任务调度,但任务仍可被中断打断。
|
LOS_TaskUnlock
|
解锁任务调度。
|
LOS_Schedule
|
触发任务调度。
|
控制任务优先级
|
LOS_CurTaskPriSet
|
设置当前任务的优先级。
|
LOS_TaskPriSet
|
设置指定任务的优先级。
|
LOS_TaskPriGet
|
获取指定任务的优先级。
|
获取任务信息
|
LOS_CurTaskIDGet
|
获取当前任务的ID。
|
LOS_NextTaskIDGet
|
获取任务就绪队列中优先级最高的任务的ID。
|
LOS_NewTaskIDGet
|
等同LOS_NextTaskIDGet。
|
LOS_CurTaskNameGet
|
获取当前任务的名称。
|
LOS_TaskNameGet
|
获取指定任务的名称。
|
LOS_TaskStatusGet
|
获取指定任务的状态。
|
LOS_TaskInfoGet
|
获取指定任务的信息,包括任务状态、优先级、任务栈大小、栈顶指针SP、任务入口函数、已使用的任务栈大小等。
|
LOS_TaskIsRunning
|
获取任务模块是否已经开始调度运行。
|
任务信息维测
|
LOS_TaskSwitchInfoGet
|
获取任务切换信息,需要开启宏LOSCFG_BASE_CORE_EXC_TSK_SWITCH。
|
## 开发流程
以创建任务为例,讲解开发流程。
1. 锁任务调度LOS\_TaskLock,防止高优先级任务调度。
2. 创建任务LOS\_TaskCreate。
3. 解锁任务LOS\_TaskUnlock,让任务按照优先级进行调度。
4. 延时任务LOS\_TaskDelay,任务延时等待。
5. 挂起指定的任务LOS\_TaskSuspend,任务挂起等待恢复操作。
6. 恢复挂起的任务LOS\_TaskResume。
>![](public_sys-resources/icon-note.gif) **说明:**
>- 执行Idle任务时,会对待回收链表中的任务控制块和任务栈进行回收。
>- 任务名是指针,并没有分配空间,在设置任务名时,禁止将局部变量的地址赋值给任务名指针。
>- 任务栈的大小按8字节大小对齐。确定任务栈大小的原则是,够用就行,多了浪费,少了任务栈溢出。
>- 挂起当前任务时,如果已经锁任务调度,则无法挂起。
>- Idle任务及软件定时器任务不能被挂起或者删除。
>- 在中断处理函数中或者在锁任务的情况下,执行LOS\_TaskDelay会失败。
>- 锁任务调度,并不关中断,因此任务仍可被中断打断。
>- 锁任务调度必须和解锁任务调度配合使用。
>- 设置任务优先级时可能会发生任务调度。
>- 可配置的系统最大任务数是指:整个系统的任务总个数,而非用户能使用的任务个数。例如:系统软件定时器多占用一个任务资源,那么用户能使用的任务资源就会减少一个。
>- LOS\_CurTaskPriSet和LOS\_TaskPriSet接口不能在中断中使用,也不能用于修改软件定时器任务的优先级。
>- LOS\_TaskPriGet接口传入的task ID对应的任务未创建或者超过最大任务数,统一返回-1。
>- 在删除任务时要保证任务申请的资源(如互斥锁、信号量等)已被释放。
## 编程实例
本实例介绍基本的任务操作方法,包含2个不同优先级任务的创建、任务延时、任务锁与解锁调度、挂起和恢复等操作,阐述任务优先级调度的机制以及各接口的应用。示例代码如下:
```
UINT32 g_taskHiId;
UINT32 g_taskLoId;
#define TSK_PRIOR_HI 4
#define TSK_PRIOR_LO 5
UINT32 Example_TaskHi(VOID)
{
UINT32 ret;
printf("Enter TaskHi Handler.\n");
/* 延时100个Ticks,延时后该任务会挂起,执行剩余任务中最高优先级的任务(TaskLo任务) */
ret = LOS_TaskDelay(100);
if (ret != LOS_OK) {
printf("Delay TaskHi Failed.\n");
return LOS_NOK;
}
/* 100个Ticks时间到了后,该任务恢复,继续执行 */
printf("TaskHi LOS_TaskDelay Done.\n");
/* 挂起自身任务 */
ret = LOS_TaskSuspend(g_taskHiId);
if (ret != LOS_OK) {
printf("Suspend TaskHi Failed.\n");
return LOS_NOK;
}
printf("TaskHi LOS_TaskResume Success.\n");
return ret;
}
/* 低优先级任务入口函数 */
UINT32 Example_TaskLo(VOID)
{
UINT32 ret;
printf("Enter TaskLo Handler.\n");
/* 延时100个Ticks,延时后该任务会挂起,执行剩余任务中最高优先级的任务 */
ret = LOS_TaskDelay(100);
if (ret != LOS_OK) {
printf("Delay TaskLo Failed.\n");
return LOS_NOK;
}
printf("TaskHi LOS_TaskSuspend Success.\n");
/* 恢复被挂起的任务g_taskHiId */
ret = LOS_TaskResume(g_taskHiId);
if (ret != LOS_OK) {
printf("Resume TaskHi Failed.\n");
return LOS_NOK;
}
return ret;
}
/* 任务测试入口函数,创建两个不同优先级的任务 */
UINT32 Example_TskCaseEntry(VOID)
{
UINT32 ret;
TSK_INIT_PARAM_S initParam;
/* 锁任务调度,防止新创建的任务比本任务高而发生调度 */
LOS_TaskLock();
printf("LOS_TaskLock() Success!\n");
initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskHi;
initParam.usTaskPrio = TSK_PRIOR_HI;
initParam.pcName = "TaskHi";
initParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
/* 创建高优先级任务,由于锁任务调度,任务创建成功后不会马上执行 */
ret = LOS_TaskCreate(&g_taskHiId, &initParam);
if (ret != LOS_OK) {
LOS_TaskUnlock();
printf("Example_TaskHi create Failed!\n");
return LOS_NOK;
}
printf("Example_TaskHi create Success!\n");
initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskLo;
initParam.usTaskPrio = TSK_PRIOR_LO;
initParam.pcName = "TaskLo";
initParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
/* 创建低优先级任务,由于锁任务调度,任务创建成功后不会马上执行 */
ret = LOS_TaskCreate(&g_taskLoId, &initParam);
if (ret != LOS_OK) {
LOS_TaskUnlock();
printf("Example_TaskLo create Failed!\n");
return LOS_NOK;
}
printf("Example_TaskLo create Success!\n");
/* 解锁任务调度,此时会发生任务调度,执行就绪队列中最高优先级任务 */
LOS_TaskUnlock();
return LOS_OK;
}
```
### 结果验证
编译运行得到的结果为:
```
LOS_TaskLock() Success!
Example_TaskHi create Success!
Example_TaskLo create Success!
Enter TaskHi Handler.
Enter TaskLo Handler.
TaskHi LOS_TaskDelay Done.
TaskHi LOS_TaskSuspend Success.
TaskHi LOS_TaskResume Success.
```