Hi3681 ----- HarmonyOS的程序框架 和 启动流程
HarmonyOS的程序框架
HarmonyOS的启动流程
由于 hi3681 的 liteos-m 被芯片 rom 化了,固化在芯片内部了。所以我们主 要看内核启动后的第一个入口函数。 代码路径: vendor\hisi\hi3861\hi3861\app\wifiiot_app\src\app_main.c
hi_void app_main(hi_void) {
#ifdef CONFIG_FACTORY_TEST_MODE
printf("factory test mode!\r\n");
#endif
const hi_char* sdk_ver = hi_get_sdk_version();
printf("sdk ver:%s\r\n", sdk_ver);
hi_flash_partition_table *ptable = HI_NULL;
peripheral_init();
…..中间省略代码
HOS_SystemInit();
}
app_main一开始打印了 SDK版本号,最后一行会调用HOS_SystemInit(); 函 数进行鸿蒙系统的初始化。我们进去看下初始化做了哪些动作。 路径:base/startup/services/bootstrap_lite/source/system_init.c
void HOS_SystemInit(void)
{
MODULE_INIT(bsp);
MODULE_INIT(device);
MODULE_INIT(core);
SYS_INIT(service);
SYS_INIT(feature);
MODULE_INIT(run);
SAMGR_Bootstrap();
}
我们可以看到主要是初始化了 一些相关模块、系统,包括有 bsp、device(设 备)。其中最终的是 MODULE_INIT(run); 它负责调用了,所有 run 段的代码,那么 run 段的代码是哪些呢? 事实上就是我们前面 application 中使用 SYS_RUN() 宏设置的函数名。 还记得我们前面写的 hello world 应用程序吗? #include “ohos_init.h” #include “ohos_types.h” void HelloWorld(void) { printf("[DEMO] Hello world.\n"); } SYS_RUN(HelloWorld);
也就是说所有用 SYS_RUN() 宏设置的函数都会在使用 MODULE_INIT(run); 的时候被调用。 为了验证这一点,我们可以加一些打印信息,如下:
我们重新编译后烧录。打开串口查看打印信息,如下:
可以看到在 35 行之后,就打印 hello world 的信息。符合预期
HarmonyOS的第一个程序
编写一个 hello world 程序比较简单,可以参考官网:
链接: 教你写第一个helloworld程序