HI3861學(xué)習(xí)筆記(3)——編譯構(gòu)建和代碼運(yùn)行過程

一约巷、Ninja編譯工具簡介

在Unix/Linux下通常使用Make/Makefile來控制代碼的編譯挠阁,但是Makefile對于比較大的項(xiàng)目有時(shí)候會(huì)比較慢榛瓮,Ninja是Google的一名程序員推出的注重速度的構(gòu)建工具日杈,通過將編譯任務(wù)并行組織律秃,大大提高了構(gòu)建速度。

Ninja的目標(biāo)是成為匯編程序冻河。

二箍邮、編譯生成bin文件過程

2.1 JSON文件

首先執(zhí)行 hpm dist

編譯的時(shí)候使用到了 json 文件 BearPi-HM_Nano.json 叨叙,位于 bulid/lite/product 中锭弊,該文件描述了一些編譯模塊的路徑。

  • 模塊:applications
    作用:這個(gè)路徑下存放了hi3681編寫的應(yīng)用程序代碼擂错,例如 hello world 代碼就放在這個(gè)路徑下味滞。
  • 模塊:iot_hardware
    作用:存放了 hi3681 芯片相關(guān)的驅(qū)動(dòng)、例如spi、gpio剑鞍、uart等昨凡。
  • 模塊:vendor
    作用:存放了 hi3681 相關(guān)的廠商SDK之類的文件。其中蚁署,app_io_init.c 是hi3681內(nèi)核啟動(dòng)后的io口相關(guān)設(shè)置便脊,用戶需根據(jù)應(yīng)用場景,合理選擇各外設(shè)的IO復(fù)用配置形用。app_main.c 是內(nèi)核啟動(dòng)進(jìn)入的應(yīng)用程序入口就轧。

例如 applications 模塊中的 sample:app 指向位于 applications/BearPi/BearPi-HM_Nano/sample 下的 模塊BUILD.gn 中的 app


2.2 模塊BUILD.gn

模塊BUILD.gnapp 下有許多模塊田度,其中 my_app:myapp 指向位于 applications/BearPi/BearPi-HM_Nano/sample/my_app 下的 業(yè)務(wù)BUILD.gn


2.3 業(yè)務(wù)BUILD.gn

業(yè)務(wù)BUILD.gnmyapp 會(huì)將 hello_world.c 編譯成 libmyapp.a 文件解愤。



隨后 libmyapp.a 跟著眾多 .a 文件被鏈接編譯進(jìn) Hi3861_wifiiot.bin 文件镇饺。

三、代碼運(yùn)行過程

3.1 app_main()

打開位于 vendor/hisi/hi3861/app/wifiiot_app/srcapp_main.c送讲,內(nèi)核啟動(dòng)進(jìn)入的應(yīng)用程序入口函數(shù)為 app_main()


app_main() 中奸笤,首先打印了 SDK 版本:

const hi_char* sdk_ver = hi_get_sdk_version();
printf("sdk ver:%s\r\n", sdk_ver);

然后進(jìn)行外設(shè)初始化、內(nèi)存初始化哼鬓、文件系統(tǒng)初始化监右、WIFI初始化,

最后執(zhí)行 HOS_SystemInit() 進(jìn)行鴻蒙系統(tǒng)的初始化异希。

3.2 HOS_SystemInit()

打開位于 base/startup/services/bootstrap_lite/sourcesystem_init.c

HOS_SystemInit() 中健盒,主要是初始化了一些相關(guān)模塊、系統(tǒng)称簿,包括有 bsp扣癣、device(設(shè)備)。其中最終的是 MODULE_INIT(run)憨降,它負(fù)責(zé)調(diào)用了所有 run 段的代碼父虑,那么 run 段的代碼是哪些呢?事實(shí)上就是我們前面 application 中 hello_world.c 使用 SYS_RUN() 宏設(shè)置的函數(shù)名授药。

include "ohos_init.h"
#include "ohos_types.h"
 
void HelloWorld(void)
{
    printf("[DEMO] Hello world.\n");
}
SYS_RUN(HelloWorld);

也就是說所有用SYS_RUN() 宏設(shè)置的函數(shù)都會(huì)在使用MODULE_INIT(run);的時(shí)候被調(diào)用士嚎,為了驗(yàn)證這一點(diǎn),我們可以加一些打印信息悔叽,如下:



我們重新編譯后燒錄莱衩。打開串口查看打印信息,如下:


3.3 MODULE_INIT(run)

SYS_RUN(app_entry) 定義的函數(shù)指針 __zinitcall_run_app_entry 通過強(qiáng)制編譯的方式進(jìn)入 .zinitcall.run2.init 段中骄蝇。在鏈接腳本中定義的兩個(gè)符號 __zinitcall_run_start (理解為數(shù)組名)和 __zinitcall_run_end 分別指向 __zinitcall_run_app_entry 所在數(shù)據(jù)段的起始位置和結(jié)束位置膳殷。 又因?yàn)?MODULE_INIT(run) 的功能就是遍歷 __zinitcall_run_start 和 __zinitcall_run_end 所指定的區(qū)域(理解為函數(shù)指針數(shù)組),并調(diào)用每個(gè)單元(指針)所指向的函數(shù),因此赚窃,__zinitcall_run_app_entry 所指向的函數(shù)必然被調(diào)用册招,即:app_entry() 必然被調(diào)用。


總結(jié):
通過強(qiáng)制編譯鏈接構(gòu)成一個(gè)全局指針數(shù)組(每個(gè) SYS_RUN() 定義一個(gè)數(shù)組元素)在鏈接腳本中定義符號自動(dòng)確認(rèn)這個(gè)數(shù)組的起始地址和結(jié)束地址
MODULE_INIT() 通過遍歷的方式調(diào)用數(shù)組元素所指向的函數(shù)勒极。


? 由 Leung 寫于 2021 年 5 月 16 日

? 參考:【鴻蒙2.0設(shè)備開發(fā)教程】小熊派HarmonyOS 鴻蒙·季 開發(fā)教程
    第3章 Hi3681開發(fā)入門是掰、啟動(dòng)流程_連志安-CSDN博客
    分析 helloworld程序是如何被調(diào)用,SYS_RUN做什么事情
    #2020征文-開發(fā)板#SYS_RUN()和MODULE_INIT()之間的那些事
    HarmonyOS編譯框架介紹_懿傕的博客-CSDN博客
    鴻蒙OS開源代碼精要解讀之—— 系統(tǒng)服務(wù)框架子系統(tǒng)(服務(wù)啟動(dòng))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辱匿,一起剝皮案震驚了整個(gè)濱河市键痛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匾七,老刑警劉巖絮短,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昨忆,居然都是意外死亡丁频,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門邑贴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來席里,“玉大人,你說我怎么就攤上這事拢驾〗贝牛” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵繁疤,是天一觀的道長咖为。 經(jīng)常有香客問我,道長嵌洼,這世上最難降的妖魔是什么案疲? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮麻养,結(jié)果婚禮上褐啡,老公的妹妹穿的比我還像新娘。我一直安慰自己鳖昌,他們只是感情好备畦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著许昨,像睡著了一般懂盐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糕档,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天莉恼,我揣著相機(jī)與錄音,去河邊找鬼。 笑死俐银,一個(gè)胖子當(dāng)著我的面吹牛尿背,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捶惜,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼田藐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吱七?” 一聲冷哼從身側(cè)響起汽久,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踊餐,沒想到半個(gè)月后景醇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡市袖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年啡直,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苍碟。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撮执,靈堂內(nèi)的尸體忽然破棺而出微峰,到底是詐尸還是另有隱情,我是刑警寧澤抒钱,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布蜓肆,位于F島的核電站,受9級特大地震影響谋币,放射性物質(zhì)發(fā)生泄漏仗扬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一蕾额、第九天 我趴在偏房一處隱蔽的房頂上張望早芭。 院中可真熱鬧,春花似錦诅蝶、人聲如沸退个。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽语盈。三九已至,卻和暖如春缰泡,著一層夾襖步出監(jiān)牢的瞬間刀荒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缠借,地道東北人干毅。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像烈炭,于是被迫代替她去往敵國和親溶锭。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容