【鸿蒙开发板试用报告】从点灯开始理解鸿蒙OS的项目结构与启动流程

开发 前端
和大家一样,拿到板子后,就急不可耐的按照老师们的教程开始各种操作了。但是一段时间后,我突然发现,我对项目的结构和启动流程还都一知半解。为了能更深入的理解HarmonyOS的代码,我决定从基础开始,再从头学习。

 想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/#zz

和大家一样,拿到板子后,就急不可耐的按照老师们的教程开始各种操作了。但是一段时间后,我突然发现,我对项目的结构和启动流程还都一知半解。为了能更深入的理解HarmonyOS的代码,我决定从基础开始,再从头学习。

一、整体情况

首先,咱们HarmonyOS是用C语言写的(废话),编译用gcc。项目构建上,没有用传统的make,而是用的GN。什么是GN?

  • Generate Ninja,是Google为Ninja专门开发的上层编译框架,可以生成Ninja可以识别的输入文件。GN由c++编译,相比于基于python的gyp,速度快接近20倍。

什么是Ninja?

  • Ninja 是Google的一名程序员推出的注重速度的构建工具,一般在Unix/Linux上的程序通过make/makefile来构建编译,而Ninja通过将编译任务并行组织,大大提高了构建速度。

重点突出一个“快”字。总而言之,有了这俩先进工具的加持,咱这个鸿蒙编译速度那是飞快。相信大家都深有体会。

二、项目结构

1.applications,自然就是用户的各种应用代码了,这里是咱们的主战场。具体来说,applications/sample/wifi-iot/app/,这个app目录里是咱们的业务代码。

2.base,OS的基础代码。主要包含全球化(global),DFX(hiviewdfx),公共基础(iot_hardware),安全(security),启动恢复(startup)等若干模块。

3.build,构建目录。编译过程中的文件存放目录。

4.docs,文档。很多新手往往忽略了自带的文档。

5.domains,领域。看样子是几个demo。

6.drivers,驱动。OpenHarmony驱动子系统采用C面向对象编程模型构建,通过平台解耦、内核解耦,兼容不同内核,提供了归一化的驱动平台底座,旨在为开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。

7.foundation,基础模块。内容很复杂,包含Ability、ACE、Graphics等等很多模块。

8.kernel,内核代码。

9.out,输出目录。生成的固件文件就在这里。

10.prebuilts,LiteOS预先编译好的文件。一些LiteOS的.o和.a文件放在这里,可用来加快编译速度。

11.test,测试目录。具体都是干嘛的暂时没有搞清楚。

12.third_party,第三方代码。

13.utils,工具模块。像文件访问、timer、task什么的。

14.vendor,制造商提供的代码。这里有程序启动的入口代码,应给予一定的关注。有时间可以研究一下。

15.build.py,编译脚本。基本用法:python build.py wifiiot

三、启动流程

HelloWorld的教程我就不再重复了,推荐参考连老师的文章。关键弄懂一个地方:

  1. SYS_RUN(HelloWorld); 

这个SYS_RUN是系统自带的宏,是告诉项目,咱们的业务代码的入口函数是HelloWorld。SYS_RUN宏的定义在ohos_init.h头文件中,位置在\utils\native\lite\include\ohos_init.h,定义如下: 

  1. /** 
  2.  * @brief Identifies the entry for initializing and starting a system running phase by the 
  3.  * priority 2. 
  4.  * 
  5.  * This macro is used to identify the entry called at the priority 2 in the system startup 
  6.  * phase of the startup process. \n 
  7.  * 
  8.  * @param func Indicates the entry function for initializing and starting a system running phase. 
  9.  * The type is void (*)(void). 
  10.  */ 
  11. #define SYS_RUN(func) LAYER_INITCALL_DEF(func, run, "run"

 定义了系统启动阶段的初始化和启动入口,类型必须是void (*)(void),即不能有参数,也没有返回值。LAYER_INITCALL_DEF也是宏,是为了方便灵活调整启动阶段和优先级而设定的,具体读者可以自行研究。

回到咱们的HelloWorld中,这里说一下线程。一般业务代码都会通过一个主循环来执行各项任务,最佳的方法是启动一个线程,这样入口函数不会阻塞导致一系列问题。启动线程的方法如下:

  1. osThreadAttr_t attr; 
  2.  
  3.  attr.name = "HelloTask"
  4.  attr.attr_bits = 0U; 
  5.  attr.cb_mem = NULL
  6.  attr.cb_size = 0U; 
  7.  attr.stack_mem = NULL
  8.  attr.stack_size = 10240; 
  9.  attr.priority = osPriorityNormal; 
  10.  
  11.  if (osThreadNew(HelloTaskFunc, NULL, &attr) == NULL) { 
  12.      printf("[HelloTaskDemo] Falied to create HelloTask!\n"); 
  13.  } 

至此,已经可以顺利完成HelloWorld,且对项目结构和启动流程有了一个初步的理解。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/#zz

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2020-11-17 12:15:36

MQTT开发

2020-11-03 09:53:04

体验官方固件程序

2020-10-30 17:42:36

鸿蒙 OS Hi386

2020-12-09 09:44:29

Hi3861硬件介绍鸿蒙开发板

2020-11-27 11:52:40

OneNet

2020-11-26 12:02:07

OneNet平台

2020-11-25 11:55:47

FlappyBird

2021-01-28 14:46:29

鸿蒙HarmonyOS应用开发

2020-10-21 10:01:47

HiSpark Wi-智能家居套件

2020-10-29 09:53:06

Hi3861硬件开发板

2020-10-23 09:50:15

HiSpark Wi-开发套件

2020-10-20 09:32:43

HiSparkWi-FiIoT

2020-12-29 09:59:01

鸿蒙HarmonyOS智能家居

2020-11-23 09:32:43

WIFI连接

2020-12-31 12:22:15

鸿蒙Hi3861应用开发

2020-11-04 13:20:14

HiSpark

2020-12-02 11:55:40

OLED

2020-12-16 10:05:48

鸿蒙开发板Onenet平台

2020-11-06 11:58:01

hi3681

2021-12-30 16:12:07

鸿蒙HarmonyOS应用
点赞
收藏

51CTO技术栈公众号