hi3861主板开发【内核编译】:编写一个hello world程序 原创

StackFarmGQ
发布于 2023-6-5 22:35
浏览
1收藏

很多小伙伴面对编译器不知道从何下手,不知道怎么去编写一个可以在板子上跑的程序,下面我就给大家讲解一下具体的原理。

OpenHarmony启动的八个阶段

首先给大家讲解一下openharmony启动流程。

阶段1:core 内核启动

阶段2:core system service 内核系统服务

阶段3:core system feature 内核系统特性

阶段4:system startup 系统启动

阶段5:system service 系统服务

阶段6:system future 系统特性

阶段7:application-layer service 应用层服务

阶段8:application-layer feature 应用层特性

上述八个阶段是从编译器开始build文件,然后一步一步传入到主板让主板进行编译的过程。

如何让函数随系统启动执行

ohos_init.h定义了8个宏,用于让一个函数以“优先级2”在系统启动过程的1-8阶段执行。

即函数会被标记为入口,在系统启动过程的1-8阶段,以“优先级2”被调用。

优先级

这里涉及到一个优先级问题

在系统启动的某个阶段,会有多个函数被调用,优先级决定了调用顺序。

优先级范围:0-4。

优先级顺序:0, 1, 2, 3, 4。

上述就是程序编译的优先顺序。

ohos_init.h定义的8个宏

CORE_INIT(): 阶段1. core

SYS_SERVICE_INIT(): 阶段2. core systemservice

SYS_FEATURE_INIT(): 阶段3. core system feature

SYS_RUN(): 阶段4. system startup

SYSEX_SERVICE_INIT(): 阶段5. system service

SYSEX_FEATURE_INIT(): 阶段6. system feature

APP_SERVICE_INIT(): 阶段7. application-layer service

APP_FEATURE_INIT(): 阶段8. application-layer feature

注意:

如果#includePath冒红,鼠标移动至改行,按下ctrl+.,点击编辑路径设置。

或者直接修改。

hi3861主板开发【内核编译】:编写一个hello world程序-鸿蒙开发者社区

选择.vscode文件夹进入到c_cpp_properties.jason文件里面"includePath": [

"${workspaceFolder}/**",

"${workspaceFolder}/utils/native/lite/include"

hi3861主板开发【内核编译】:编写一个hello world程序-鸿蒙开发者社区

注意在"includePath"里面添加的地址是头文件所在的地址。伙伴们如果找不到地址,博主在这里推荐一个超实用的软件everything。

everything下载地址

下载地址:​​https://www.voidtools.com/zh-cn/。​

如何快速查找文件和代码

按照内容查找:greap -nr +你要查找的内容。

按照文件名查找:find.-name'xxx'。

OpenHarmony的编译构建系统

build / lite

├── components # 组件描述文件

├── config # 编译相关的配置项

│ ├── component # 组件相关的模板定义

│ ├── kernel # 内核的编译配置参数

│ └── subsystem # 子系统模板

├── figures # readme中的图片

├── hb # hb pip安装包源码

├── make_rootfs # 文件系统镜像制作脚本

├── ndk # Native API相关编译脚本与配置参数

├── platform # ld脚本

├── testfwk # 测试编译框架

└── toolchain # 编译工具链配置,包括编译器路径、编译选项、链接选项等。

编译构建系统的配置原则

1.源码路径命名规则

{领域} / {子系统} / {组件}

2.源码目录树规则

component

├── interfaces

│ ├── innerkits # 系统内接口,组件间使用

│ └── kits # 应用接口,应用开发者使用

├── frameworks # framework实现

├── services # service实现

└── BUILD.gn # 组件编译脚本

3.组件的定义

1.定义的位置

build\lite\components<对应子系统>.json

2.定义的内容

组件属性,包括名称、功能简介、是否必选、源码路径、编译目标、RAM、ROM、编译输出、已适配的内核、可配置的特性和依赖等。

3.注意事项

新增组件时需要在对应子系统json文件中添加相应的组件定义。产品所配置的组件必须在某个子系统中被定义过,否则会校验失败。

编写一个hello world

下面就是上述理论的尝试

首先我们进入到D:\DevEcoProjects\3861\src\applications\sample\wifi-iot\app\startup

hi3861主板开发【内核编译】:编写一个hello world程序-鸿蒙开发者社区

然后我们创建一个新文件名称叫hello.c,注意文件名必须以.c结尾。在文件里开始编写代码如下图:

hi3861主板开发【内核编译】:编写一个hello world程序-鸿蒙开发者社区

#include <stdio.h>

#include "ohos_init.h"

 void hello(void)


{


    printf("Hello World\n");


}


SYS_RUN(hello);

然后我们需要在BUILD.gn里面将其注册

hi3861主板开发【内核编译】:编写一个hello world程序-鸿蒙开发者社区

我们需要在souces里面加入刚刚写的文件名称。并在 include_dirs里面加入头文件地址。

然后我们进入到app里面D:\DevEcoProjects\3861\src\applications\sample\wifi-iot\app

点击BUILD.gn。如下图:

hi3861主板开发【内核编译】:编写一个hello world程序-鸿蒙开发者社区

然后在features里面添加注册好的组件就可以了

hi3861主板开发【内核编译】:编写一个hello world程序-鸿蒙开发者社区

注意这里面加入的是startup,也就是总组件名称。

然后点击rebuild和upload就行了,欢迎大家在底下留言交流讨论。


©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
1
收藏 1
回复
举报
回复
    相关推荐