1# 小凌派-RK2206开发板OpenHarmonyOS内核开发-任务 2 3## 实验内容 4 5本例程演示如何在小凌派-RK2206开发板上使用鸿蒙LiteOS-M内核接口,进行任务编程开发。例程创建两个任务,任务1 1s执行一次,任务2 2s执行一次。 6 7 8 9## 程序设计 10 11从系统的角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并且独立于其它任务运行。鸿蒙LiteOS的任务模块可以给用户提供多个任务,实现了任务之间的切换和通信,帮助用户管理任务程序流程。鸿蒙LiteOS是一个支持多任务的操作系统,一个任务表示一个线程。 12 13鸿蒙LiteOS操作系统的任务管理是抢占式调度机制,同时支持时间片轮转调度方式。高优先级的任务可打断低优先级任务,低优先级任务只能在高优先级任务阻塞或结束后才能得到调度。鸿蒙LiteOS操作系统的任务一共有32个优先级(0-31),最高优先级为0,最低优先级为31(其中0和31为系统占用)。 14 15### API分析 16 17**头文件:** 18 19/kernel/liteos_m/kernel/include/los_task.h 20 21#### LOS_TaskCreate() 22 23```c 24UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *taskInitParam); 25``` 26 27**描述:** 28创建任务,并使该任务进入ready状态,如果就绪队列中没有更高优先级的任务,则运行该任务。 29 30**参数:** 31 32| 名字 | 描述 | 33| :------------ | :------------- | 34| taskID | 任务ID | 35| taskInitParam | 线程初始化参数 | 36 37**返回值:** 38 39| 返回值 | 描述 | 40| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--- | 41| LOS_OK | 成功 | 42| LOS_ERRNO_TSK_ID_INVALID`<br>` LOS_ERRNO_TSK_PTR_NULL `<br>` LOS_ERRNO_TSK_NAME_EMPTY `<br>` LOS_ERRNO_TSK_ENTRY_NULL `<br>` LOS_ERRNO_TSK_PRIOR_ERROR `<br>` LOS_ERRNO_TSK_STKSZ_TOO_LARGE `<br>` LOS_ERRNO_TSK_STKSZ_TOO_SMALL `<br>` LOS_ERRNO_TSK_TCB_UNAVAILABLE `<br>` LOS_ERRNO_TSK_NO_MEMORY | 失败 | 43 44#### LOS_TaskDelete() 45 46```c 47UINT32 LOS_TaskDelete(UINT32 taskID); 48``` 49 50**描述:** 51删除指定的任务。 52 53**参数:** 54 55| 名字 | 描述 | 56| :----- | :--------------- | 57| taskID | 需要删除的任务ID | 58 59**返回值:** 60 61| 返回值 | 描述 | 62| :---------------------------------------------------------------------------------------------------------------------------------------------- | :--- | 63| LOS_OK | 成功 | 64| LOS_ERRNO_TSK_OPERATE_IDLE`<br>` LOS_ERRNO_TSK_SUSPEND_SWTMR_NOT_ALLOWED `<br>` LOS_ERRNO_TSK_ID_INVALID `<br>` LOS_ERRNO_TSK_NOT_CREATED | 失败 | 65 66### 软件设计 67 68**主要代码分析** 69 70在task_example函数中,通过LOS_TaskCreate函数创建task_one和task_two两个任务。 71 72```c 73void task_example() 74{ 75 unsigned int thread_id1; 76 unsigned int thread_id2; 77 TSK_INIT_PARAM_S task1 = {0}; 78 TSK_INIT_PARAM_S task2 = {0}; 79 unsigned int ret = LOS_OK; 80 81 task1.pfnTaskEntry = (TSK_ENTRY_FUNC)task_one; 82 task1.uwStackSize = 2048; 83 task1.pcName = "Task_One"; 84 task1.usTaskPrio = 24; 85 ret = LOS_TaskCreate(&thread_id1, &task1); 86 if (ret != LOS_OK) 87 { 88 printf("Failed to create Task_One ret:0x%x\n", ret); 89 return; 90 } 91 92 task2.pfnTaskEntry = (TSK_ENTRY_FUNC)task_two; 93 task2.uwStackSize = 2048; 94 task2.pcName = "Task_Two"; 95 task2.usTaskPrio = 25; 96 ret = LOS_TaskCreate(&thread_id2, &task2); 97 if (ret != LOS_OK) 98 { 99 printf("Failed to create Task_Two ret:0x%x\n", ret); 100 return; 101 } 102} 103``` 104 105task_one函数每1秒执行一次打印日志。 106 107```c 108void task_one() 109{ 110 while (1) 111 { 112 printf("This is %s\n", __func__); 113 LOS_Msleep(1000); 114 } 115} 116``` 117 118task_two函数每2秒执行一次打印日志。 119 120```c 121void task_two() 122{ 123 while (1) 124 { 125 printf("This is %s\n", __func__); 126 LOS_Msleep(2000); 127 } 128} 129``` 130 131## 编译调试 132 133### 修改 BUILD.gn 文件 134 135修改 `vendor/lockzhiner/lingpi/sample` 路径下 BUILD.gn 文件,指定 `a1_kernal_task` 参与编译。 136 137```r 138"a1_kernel_task", 139``` 140 141在主目录下输入编译命令。 142 143```shell 144hb build -f 145``` 146 147### 运行结果 148 149例程代码编译烧写到开发板后,按下开发板的RESET按键,通过串口软件查看日志,task_one和task_two会交替打印信息,task_one 1s打印一次,task_two 2s打印一次。 150 151```c 152This is task_one 153This is task_one 154This is task_two 155This is task_one 156This is task_one 157This is task_two 158``` 159