hi3861主板开发【内核编译】:编写一个hello world程序 原创
很多小伙伴面对编译器不知道从何下手,不知道怎么去编写一个可以在板子上跑的程序,下面我就给大家讲解一下具体的原理。
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+.,点击编辑路径设置。
或者直接修改。
选择.vscode文件夹进入到c_cpp_properties.jason文件里面"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/utils/native/lite/include"
注意在"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
然后我们创建一个新文件名称叫hello.c,注意文件名必须以.c结尾。在文件里开始编写代码如下图:
#include <stdio.h>
#include "ohos_init.h"
void hello(void)
{
printf("Hello World\n");
}
SYS_RUN(hello);
然后我们需要在BUILD.gn里面将其注册
我们需要在souces里面加入刚刚写的文件名称。并在 include_dirs里面加入头文件地址。
然后我们进入到app里面D:\DevEcoProjects\3861\src\applications\sample\wifi-iot\app
点击BUILD.gn。如下图:
然后在features里面添加注册好的组件就可以了
注意这里面加入的是startup,也就是总组件名称。
然后点击rebuild和upload就行了,欢迎大家在底下留言交流讨论。