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