当前位置:网站首页>#夏日挑战赛#【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()之间的那些事
本篇文章主要参考上述文章对启动流程进行了分析验证
流程图如下:
上面两篇文章强烈建议大家去读一读,然后自己动手实验一下加深理解~
如果发现本篇文章有不对的地方,欢迎交流探讨哦!
边栏推荐
- protobuf 反射使用总结
- When mobile applications go overseas, is your "network optimization" holding back?
- 甲方不让用开源【监控软件】?大不了我自己写一个
- 【There is no tracking information for the current branch. Please specify which branch you want to 】
- 一文看懂推荐系统:召回03:基于用户的协同过滤(UserCF),要计算用户之间的相似度
- 83. Remove Duplicates from Sorted List
- 13 and OOM simulation
- Not to be ignored!Features and advantages of outdoor LED display
- TCP 可靠吗?为什么?
- 【带你了解SDN和网络虚拟化】
猜你喜欢
罗克韦尔AB PLC RSLogix5000中创建新项目、任务、程序和例程的具体方法和步骤
如何选择合适的导电滑环型号
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!.
如何使用MATLAB绘制极坐标堆叠柱状图
spark入门学习-1
《安富莱嵌入式周报》第276期:2022.07.25--2022.07.31
Windows 事件查看器记录到 MYSQL
全新探险者以40万的产品击穿豪华SUV价格壁垒
TCP 可靠吗?为什么?
QT QT 】 【 to have developed a good program for packaging into a dynamic library
随机推荐
[QT] Qt project demo: data is displayed on the ui interface, double-click the mouse to display specific information in a pop-up window
【There is no tracking information for the current branch. Please specify which branch you want to 】
vector类
AI+BI+Visualization, Deep Analysis of Sugar BI Architecture
Introduction to the advantages of the new generation mesh network protocol T-Mesh wireless communication technology
Detailed explanation of ReentrantReadWriteLock
罗克韦尔AB PLC RSLogix5000中创建新项目、任务、程序和例程的具体方法和步骤
When mobile applications go overseas, is your "network optimization" holding back?
devops-2:Jenkins的使用及Pipeline语法讲解
To add digital wings to education, NetEase Yunxin released the overall solution of "Internet + Education"
Small Tools(4) 整合Seata1.5.2分布式事务
C专家编程 第2章 这不是Bug,而是语言特性 2.1 这关语言特性何事,在Fortran里这就是Bug呀
C语言01、数据类型、变量常量、字符串、转义字符、注释
MATLAB | 一种简易的随机曼陀罗图形生成函数
[Unity Getting Started Plan] Basic Concepts (8) - Tile Map TileMap 02
How much do you know about the intelligent operation and maintenance service of data warehouse based on DMS?
Why do I strongly recommend using smart async?
AI也有健忘症?英国41岁教授专访:解决灾难性遗忘
一文看懂推荐系统:召回01:基于物品的协同过滤(ItemCF),item-based Collaboration Filter的核心思想与推荐过程
为教育插上数字化的翅膀,网易云信发布「互联网+教育」整体解决方案