README_zh.md
1# 小凌派-RK2206开发板OpenHarmony内核开发-Hello World
2
3## 实验内容
4
5本例程演示如何在小凌派-RK2206开发板上使用鸿蒙LiteOS-M内核接口,进行编程开发。例程创建两个任务,任务1每隔1s执行一次,打印Hello World;任务2每隔2s执行一次,打印Hello OpenHarmony。
6
7
8
9## 程序设计
10
11### 创建a0_hello_world文件夹
12
13在OpenHarmony源代码主目录vendor/lockzhiner/lingpi/samples创建a0_hello_world文件夹。
14
15```shell
16mkdir -p a0_hello_world
17```
18
19### 创建hello_world.c文件
20
21在a0_hello_world文件夹下创建hello_world.c文件。其中,task_example函数负责创建2个任务,分别为task_helloworld和task_openharmony任务,task_helloworld函数负责每隔1秒打印Hello World,task_openharmony任务负责每隔2秒打印Hello OpenHarmony。具体代码如下所示:
22
23```c
24#include "los_task.h" // OpenHarmony LiteOS的任务管理头文件
25
26/***************************************************************
27* 函数名称: task_helloworld
28* 说 明: 线程函数helloworld
29* 参 数: 无
30* 返 回 值: 无
31***************************************************************/
32void task_helloworld()
33{
34 while (1)
35 {
36 printf("Hello World\n");
37 /* 睡眠1秒。该函数为OpenHarmony LiteoS内核睡眠函数,单位为:毫秒 */
38 LOS_Msleep(1000);
39 }
40}
41
42/***************************************************************
43* 函数名称: task_openharmony
44* 说 明: 线程函数
45* 参 数: 无
46* 返 回 值: 无
47***************************************************************/
48void task_openharmony()
49{
50 while (1)
51 {
52 printf("Hello OpenHarmony\n");
53 /* 睡眠1秒。该函数为OpenHarmony内核睡眠函数,单位为:毫秒 */
54 LOS_Msleep(2000);
55 }
56}
57
58/***************************************************************
59* 函数名称: task_example
60* 说 明: 内核任务创建例程
61* 参 数: 无
62* 返 回 值: 无
63***************************************************************/
64void task_example()
65{
66 /* 任务id */
67 unsigned int thread_id1;
68 unsigned int thread_id2;
69 /* 任务参数 */
70 TSK_INIT_PARAM_S task1 = {0};
71 TSK_INIT_PARAM_S task2 = {0};
72 /* 返回值 */
73 unsigned int ret = LOS_OK;
74
75 /* 创建HelloWorld任务 */
76 task1.pfnTaskEntry = (TSK_ENTRY_FUNC)task_helloworld; // 运行函数入口
77 task1.uwStackSize = 2048; // 堆栈大小
78 task1.pcName = "task_helloworld"; // 函数注册名称
79 task1.usTaskPrio = 24; // 任务的优先级,从0~63
80 ret = LOS_TaskCreate(&thread_id1, &task1); // 创建任务
81 if (ret != LOS_OK)
82 {
83 printf("Failed to create task_helloworld ret:0x%x\n", ret);
84 return;
85 }
86
87 task2.pfnTaskEntry = (TSK_ENTRY_FUNC)task_openharmony; // 运行函数入口
88 task2.uwStackSize = 2048; // 堆栈大小
89 task2.pcName = "task_openharmony"; // 函数注册名称
90 task2.usTaskPrio = 25; // 任务的优先级,从0~63
91 ret = LOS_TaskCreate(&thread_id2, &task2); // 创建任务
92 if (ret != LOS_OK)
93 {
94 printf("Failed to create task_openharmony ret:0x%x\n", ret);
95 return;
96 }
97}
98```
99
100### 创建BUILG.gn
101
102在a0_hello_world文件夹下创建BUILD.gn文件。BUILD.gn负责将hello_world.c文件编译成到内核中。BUILD.gn的语法为gn语法,对gn语法感兴趣的同学可以上gn官网阅读相关文档。BUILD.gn具体内容如下:
103
104```gn
105import("//kernel/liteos_m/liteos.gni")
106
107config("public") {
108 include_dirs = [ "." ]
109}
110
111kernel_module("task_helloworld") {
112 sources = [
113 "hello_world.c",
114 ]
115
116 include_dirs = [
117 "//utils/native/lite/include",
118 ]
119}
120```
121
122### 修改main.c文件
123
124修改OpenHarmony主目录device/soc/rockchip/rk2206/sdk_liteos/platform/main目录下的main.c。该文件为OpenHarmony操作系统的主函数。在main.c文件中添加运行hello_world.c文件的task_example函数。具体内容如下:
125
126```c
127#include "los_tick.h"
128#include "los_task.h"
129#include "los_config.h"
130#include "los_interrupt.h"
131#include "los_debug.h"
132#include "los_compiler.h"
133#include "lz_hardware.h"
134#include "config_network.h"
135
136#define MAIN_TAG "MAIN"
137int DeviceManagerStart();
138void IotInit(void);
139void task_example(); // 申明函数
140
141/*****************************************************************************
142 Function : main
143 Description : Main function entry
144 Input : None
145 Output : None
146 Return : None
147 *****************************************************************************/
148LITE_OS_SEC_TEXT_INIT int Main(void)
149{
150 int ret;
151 LZ_HARDWARE_LOGD(MAIN_TAG, "%s: enter ...", __func__);
152
153 HalInit();
154
155 ret = LOS_KernelInit();
156 if (ret == LOS_OK) {
157 IotInit();
158 task_example(); // 添加hello_world.c文件的函数
159 OHOS_SystemInit();
160 ClkDevInit();
161 /* 开启驱动管理服务 */
162 //DeviceManagerStart();
163 //ExternalTaskConfigNetwork();
164 LZ_HARDWARE_LOGD(MAIN_TAG, "%s: LOS_Start ...", __func__);
165 LOS_Start();
166 }
167
168 while (1) {
169 __asm volatile("wfi");
170 }
171}
172```
173
174## 编译步骤
175
176在主目录下输入:
177
178```shell
179hb build -f
180```
181
182## 烧写程序
183
184请参照[编译环境搭建](vendor/lockzhiner/lingpi/README_zh.md)
185
186## 实验结果
187
188例程代码编译烧写到开发板后,按下开发板的RESET按键,通过串口软件查看日志,task_helloworld和task_openharmony会交替打印信息,task_helloworld任务每隔1s打印一次Hello World,task_openharmony任务每隔2s打印一次Hello OpenHarmony。
189
190```sh
191Hello World
192Hello OpenHarmony
193Hello World
194Hello OpenHarmony
195Hello World
196Hello World
197Hello OpenHarmony
198Hello World
199Hello World
200Hello OpenHarmony
201Hello World
202Hello World
203Hello OpenHarmony
204Hello World
205Hello World
206......
207```
208
209