Hi3681 ----- HarmonyOS的程序框架 和 启动流程

HarmonyOS的程序框架

HarmonyOS的启动流程

由于 hi3681 的 liteos-m 被芯片 rom 化了,固化在芯片内部了。所以我们主 要看内核启动后的第一个入口函数。 代码路径: vendorhisihi3861hi3861appwifiiot_appsrcapp_main.c

hi_void app_main(hi_void) { 
#ifdef CONFIG_FACTORY_TEST_MODE        
	printf("factory test mode!
"); 
#endif 

   const hi_char* sdk_ver = hi_get_sdk_version();    
    printf("sdk ver:%s
", 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. "); } SYS_RUN(HelloWorld);

也就是说所有用 SYS_RUN() 宏设置的函数都会在使用 MODULE_INIT(run); 的时候被调用。 为了验证这一点,我们可以加一些打印信息,如下: 我们重新编译后烧录。打开串口查看打印信息,如下:

可以看到在 35 行之后,就打印 hello world 的信息。符合预期

HarmonyOS的第一个程序

编写一个 hello world 程序比较简单,可以参考官网: 链接:

经验分享 程序员 微信小程序 职场和发展