• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 小凌派-RK2206开发板OpenHarmonyOS内核开发-任务
2
3## 实验内容
4
5本例程演示如何在小凌派-RK2206开发板上使用鸿蒙LiteOS-M内核接口,进行任务编程开发。例程创建两个任务,任务1 1s执行一次,任务2 2s执行一次。
6
7![小凌派-RK2206开发板](../../docs/figures/lockzhiner-rk2206.jpg)
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