https://harmonyos.51cto.com/#zz
和大家一样,拿到板子后,就急不可耐的按照老师们的教程开始各种操作了。但是一段时间后,我突然发现,我对项目的结构和启动流程还都一知半解。为了能更深入的理解HarmonyOS的代码,我决定从基础开始,再从头学习。
一、整体情况
首先,咱们HarmonyOS是用C语言写的(废话),编译用gcc。项目构建上,没有用传统的make,而是用的GN。什么是GN?
什么是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的教程我就不再重复了,推荐参考连老师的文章。关键弄懂一个地方:
- SYS_RUN(HelloWorld);
这个SYS_RUN是系统自带的宏,是告诉项目,咱们的业务代码的入口函数是HelloWorld。SYS_RUN宏的定义在ohos_init.h头文件中,位置在\utils\native\lite\include\ohos_init.h,定义如下:
- /**
- * @brief Identifies the entry for initializing and starting a system running phase by the
- * priority 2.
- *
- * This macro is used to identify the entry called at the priority 2 in the system startup
- * phase of the startup process. \n
- *
- * @param func Indicates the entry function for initializing and starting a system running phase.
- * The type is void (*)(void).
- */
- #define SYS_RUN(func) LAYER_INITCALL_DEF(func, run, "run")
定义了系统启动阶段的初始化和启动入口,类型必须是void (*)(void),即不能有参数,也没有返回值。LAYER_INITCALL_DEF也是宏,是为了方便灵活调整启动阶段和优先级而设定的,具体读者可以自行研究。
回到咱们的HelloWorld中,这里说一下线程。一般业务代码都会通过一个主循环来执行各项任务,最佳的方法是启动一个线程,这样入口函数不会阻塞导致一系列问题。启动线程的方法如下:
- osThreadAttr_t attr;
- attr.name = "HelloTask";
- attr.attr_bits = 0U;
- attr.cb_mem = NULL;
- attr.cb_size = 0U;
- attr.stack_mem = NULL;
- attr.stack_size = 10240;
- attr.priority = osPriorityNormal;
- if (osThreadNew(HelloTaskFunc, NULL, &attr) == NULL) {
- printf("[HelloTaskDemo] Falied to create HelloTask!\n");
- }
至此,已经可以顺利完成HelloWorld,且对项目结构和启动流程有了一个初步的理解。
https://harmonyos.51cto.com/#zz
调用DescribeTasks查询一个或多个异步请求的进度。 调试 您可以在OpenAPI Explor...
本文为您介绍弹性公网 IP(EIP)的出/入网带宽上限、不同计费模式下的带宽峰值区...
TOP云 (west.cn)5月18日消息,昨天两数字 域名 11.cx通过TOP云一口价成交,成...
网络视频点播主要有两种方式:视频点播和准视频点播,这两种方式都可以利用网络...
哈喽各位同学们大家好呀 今天是开发者学院中课程“Spring Cloud微服务架构设计与...
操作场景 本文以服务器的操作系统为“Windows Server 2016 Standard 64bit”为例...
操作场景 本文将为您指导如何通过 Web Function,将您的本地 Express 项目快速部...
TOP云 (west.cn)10月12日讯,海外消息,近日威瑞信发布了9月份 域名注册 热门...
在您成功补全证书信息后,CA机构(证书的签发机构)将审核您的域名和提交的证书...
调用DescribeAvailableResource查询某一可用区的资源列表。您可以在某一可用区创...