当前位置:网站首页>#夏日挑战赛#【FFH】OpenHarmony设备开发基础(四)启动流程
#夏日挑战赛#【FFH】OpenHarmony设备开发基础(四)启动流程
2022-08-03 16:17:00 【51CTO】
一、前言
至于如何编写一个简单的Hello_World程序打印出来,应该不用多说了吧。上篇文章我们详细阐述了如何添加编译依赖使得最终指向my_first_demo.c文件,让我们的.c文件能够编译进去。本篇文章将介绍SYSTEM(demo)是如何将.c文件注册进OH从而执行的,即启动流程分析。
二、准备
话不多说,先上代码:
注意看该文件的最后一行,如果没有SYS_RUN(demo)的话,demo函数是不会被调用的。如果想要demo函数被调用,就必须要有HarmonyOS启动恢复模块接口SYS_RUN(demo)启动业务。那SYS_RUN是函数调用吗(虽然长得有点像)? 但因为C语言里的函数调用不能独立于任何函数体之外,所以,显然不是。简单来说,我们可以把SYS_RUN(demo)看作一个注册语句,注册demo。系统想要运行这个函数的话就要把这个函数加进来。注册后,demo作为一个入口就可以被运行。
至于为什么在SYS_RUN中注册demo后就能运行鸿蒙设备程序,那得从内核启动后的第一个入口函数说起。
在原版相关教程提过放在vendor子系统下的两个重要文件:app_io_init.c和app_main.c。
其路径分别为:
vendor\hisi\hi3861\app\wifiiot_app\init\app_io_init.c
vendor\hisi\hi3861\app\wifiiot_app\src\app_main.c
其中,app_io_init.c是hi3861内核启动后的io相关设置,用户可以根据应用场景,合理选择各外设的IO复用配置。
我们可以找找现在的最新版官方代码(在原有注释的基础上我加了中文注释)来看看:
如今官方代码的路径变成了device/soc/hisilicon/hi3861v100/sdk_liteos/app/demo/init/app_io_init.c。
app_main.c则是内核启动进入的应用程序入口,如今官方代码的路径也变成了device/soc/hisilicon/hi3861v100/sdk_liteos/app/wifiiot_app/src/app_main.c
之前的文章我们提到过,vendor文件夹存放的是厂商相关的配置,包括组件配置、HDF 相关配置。原版vendor\hisi\hi3861存放的则是与hi3861相关产商SDK之类的文件,app_io_init.c作为hi3861内核启动后的io口相关配置文件,为什么在最新代码中被移进了device/soc中去呢?
当时我在写第一篇文章的时候还不能理解为什么教程里说的源码目录代码结构和我自己看到的代码结构不一样呢?原来是更新换代了呀。在《OpenHarmony设备开发基础【2022最新版】》一书中:
“因为后续可能存在一个soc多个board的情况”。
三、启动流程介绍
好了,回到正题,继续从内核启动后的第一个入口函数app_main.c文件说起。
其实连老师的介绍已经写得非常详细了
OpenHarmony轻量系统开发【4】编写第一个程序、启动流程分析
这里我就来试验一下吧,我将会在一些特定的位置加上下面这行代码:
通过__FILE__指明当前文件路径,一般情况下,和__LINE__结合一起使用,用于打印我们代码信息,方便快速定位代码位置。
以下是流程重点截图:
app_main先会打印了SDK版本号,中间会进行一些初始化
app_main的最后一行会调用OHOS_Main函数
OHOS_Main函数原型如下,最后一行调用了OHOS_SystemInit()
(注意是base\startup\bootstrap_lite\services\source\system_init.c路径下的OHOS_SystemInit())OHOS_SystemInit()函数原型如下:
进行了一系列模块的初始化——bsp(板级支持包)、device(设备)、core(代码)、service(服务)、feature(功能)
当执行到MODULE_INIT(run)时就会去调用run段的代码,其实就是我们之前注册进宏设置SYS_RUN()的函数。
此时我们可以再在原来的代码中加入一行提示语句进行验证:
至于为什么执行到MODULE_INIT(run)时就会去调用注册函数呢?大家可以看看唐老师的这篇文章:
SYS_RUN()和MODULE_INIT()之间的那些事
最后就到了检验的时候了:
如果仔细比对我前面贴出来的截图的话就会发现我根本没有打印“这是提示语句:…”的操作,而希望打印的“49下面这行执行了OHOS_SystemInit()”却没被打印,这是因为没有执行OHOS_SystemInit()吗?显然不是,因为从后面几行的打印语句中知道OHOS_SystemInit()函数里面的语句被执行。经过仔细检查,发现正确的路径是我第一次进行注释时的文件,即“这是提示语句”后的路径————app/wifiiot_app/src/app_main.c,而下面右图的文件根本不是我们需要执行的文件中,所以不会被打印出来。这也阴差阳错地从另一个角度佐证了我们的证明。
修正后:
我们发现,所有打印语句本身带有的行数与后面打印出来的一致,对照前面说明的启动流程顺序一致,该执行的都执行了。而且除了打印SDK后那一行的“上面这行…”被打印出来以外,其他的“上面这行…”都没被紧接着打印出来,说明其调用OHOS_Main()和OHOS_SystemInit()后进行了跳转,暂时不会执行其下面还剩的打印语句。
同时,由打印语句知:在执行MODUILE_INIT(run)后就打印了my_first_demo中注册的demo函数,在demo01.c文件中完成了目标操作。
最后,在跳转完成后,又回到原来的启动程序完成未打印的语句“上面这行…”。
至此,打印输出符合预期,证毕!
四、后记
参考文档:
OpenHarmony轻量系统开发【4】编写第一个程序、启动流程分析
SYS_RUN()和MODULE_INIT()之间的那些事
本篇文章主要参考上述文章对启动流程进行了分析验证
流程图如下:
上面两篇文章强烈建议大家去读一读,然后自己动手实验一下加深理解~
如果发现本篇文章有不对的地方,欢迎交流探讨哦!
边栏推荐
猜你喜欢
罗克韦尔AB PLC RSLogix5000中创建新项目、任务、程序和例程的具体方法和步骤
一文看懂推荐系统:召回03:基于用户的协同过滤(UserCF),要计算用户之间的相似度
spark入门学习-2
2年开发经验去面试,吊打面试官,即将面试的程序员这些笔记建议复习
Windows 事件查看器记录到 MYSQL
STM32 GPIO LED and buzzer implementation [Day 4]
甲方不让用开源【监控软件】?大不了我自己写一个
为什么我强烈推荐使用智能化async?
C专家编程 第3章 分析C语言的声明 3.8 理解所有分析过程的代码段
Not to be ignored!Features and advantages of outdoor LED display
随机推荐
【Unity入门计划】基本概念(8)-瓦片地图 TileMap 02
C专家编程 第3章 分析C语言的声明 3.5 typedef可以成为你的朋友
MySQL窗口函数
移动应用出海,你的“网络优化”拖后腿了吗?
Introduction to spark learning - 1
罗克韦尔AB PLC RSLogix5000中创建新项目、任务、程序和例程的具体方法和步骤
一文看懂推荐系统:召回02:Swing 模型,和itemCF很相似,区别在于计算相似度的方法不一样
C专家编程 第1章 C:穿越时空的迷雾 1.10 “安静的改变”究竟有多少安静
How much do you know about the intelligent operation and maintenance service of data warehouse based on DMS?
一文看懂推荐系统:召回03:基于用户的协同过滤(UserCF),要计算用户之间的相似度
Difference and performance comparison between HAL and LL library of STM32
protobuf 中数据编码规则
CopyOnWriteArrayList details
window.open不显示favicon.icon
leetcode:187. 重复的DNA序列
STM32 GPIO LED and buzzer implementation [Day 4]
MPLS的wpn实验
Yuan xiaolin: Volvo focus on travel security, and put it perfectly
带你了解什么是 Web3.0
How to get the 2 d space prior to ViT?UMA & Hong Kong institute of technology & ali SP - ViT, study for visual Transformer 2 d space prior knowledge!.