当前位置:网站首页>#夏日挑战赛#【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()之间的那些事
本篇文章主要参考上述文章对启动流程进行了分析验证
流程图如下:
上面两篇文章强烈建议大家去读一读,然后自己动手实验一下加深理解~
如果发现本篇文章有不对的地方,欢迎交流探讨哦!
边栏推荐
- Difference and performance comparison between HAL and LL library of STM32
- 一文看懂推荐系统:召回02:Swing 模型,和itemCF很相似,区别在于计算相似度的方法不一样
- C语言03、数组
- To add digital wings to education, NetEase Yunxin released the overall solution of "Internet + Education"
- #夏日挑战赛# HarmonyOS 实现一个绘画板
- 使用uniapp 封装一个request 请求
- C专家编程 第2章 这不是Bug,而是语言特性 2.3 误做之过
- Introduction to spark learning - 1
- C专家编程 第2章 这不是Bug,而是语言特性 2.4 少做之过
- MATLAB | 一种简易的随机曼陀罗图形生成函数
猜你喜欢
黄致绮 荣获第六季完美童模全球总决赛 全国总冠军
参与便有奖,《新程序员》杂志福利来袭!
带你了解什么是 Web3.0
元宇宙系列--Value creation in the metaverse
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!.
2年开发经验去面试,吊打面试官,即将面试的程序员这些笔记建议复习
Small Tools (4) integrated Seata1.5.2 distributed transactions
袁小林:沃尔沃专注于出行的安全感,并且把它做到极致
leetcode-268.丢失的数字
2021年数据泄露成本报告解读
随机推荐
【翻译】关于扩容一个百万级别用户系统的六个课程
C专家编程 第3章 分析C语言的声明 3.5 typedef可以成为你的朋友
[Deep Learning] Today's bug (August 2)
Some optional strategies and usage scenarios for PWA application Service Worker caching
纯纯粹粹纯纯粹粹
C专家编程 第3章 分析C语言的声明 3.3 优先级规则
【Unity入门计划】基本概念(7)-Input Manager&Input类
袁小林:沃尔沃专注于出行的安全感,并且把它做到极致
WordPress建站技术笔记
【带你了解SDN和网络虚拟化】
Small Tools (4) integrated Seata1.5.2 distributed transactions
攻防世界----bug
元宇宙系列--Value creation in the metaverse
mysql delete execution error: You can't specify target table 'doctor_info' for update in FROM clause
STM32 GPIO LED and buzzer implementation [Day 4]
Cookie和Session的关系
I am doing open source in Didi
C专家编程 第1章 C:穿越时空的迷雾 1.10 “安静的改变”究竟有多少安静
C专家编程 第1章 C:穿越时空的迷雾 1.9 阅读ANSI C标准,寻找乐趣和裨益
一文看懂推荐系统:召回03:基于用户的协同过滤(UserCF),要计算用户之间的相似度