一種OpenHarmony輕量系統(tǒng)適配方案

1. 簡(jiǎn)介
本文在不改變?cè)邢到y(tǒng)基礎(chǔ)框架的基礎(chǔ)上坏晦, 介紹了一種OpenAtom OpenHarmony(以下簡(jiǎn)稱(chēng)“OpenHarmony”)輕量系統(tǒng)適配方案疤坝。
本方案使用的是 OpenHarmony v3.2 Release版本源碼槽驶。

2. 方案設(shè)計(jì)
本文使用的硬件模塊的主要特性及功能如下:

通常,適配OpenHarmony的方案是莱睁,將內(nèi)核由RTOS改為L(zhǎng)iteOS-M,并移植原生所有功能模塊和鏡像打包功能芒澜。采用該方案面臨了諸多困難:

●編譯系統(tǒng)更改Gn+Ninjia仰剿,重寫(xiě)和調(diào)試編譯腳本,需要學(xué)習(xí)成本
●適配和測(cè)試全部的原生功能痴晦,原本測(cè)試通過(guò)的功能需要重新測(cè)試南吮,付出重復(fù)的勞動(dòng)
●適配新的OS接口,需要修改原生系統(tǒng)的OSI層接口誊酌,以對(duì)接LiteOS-M

該方案的改動(dòng)較多部凑,將導(dǎo)致開(kāi)發(fā)人員無(wú)法將精力聚焦于項(xiàng)目的新功能露乏、工作量大、難度大涂邀,無(wú)法滿足項(xiàng)目的工期要求瘟仿,項(xiàng)目風(fēng)險(xiǎn)大。
OpenHarmony的輕量系統(tǒng)編譯過(guò)程是比勉,首先將各模塊編譯鏈接為靜態(tài)庫(kù)劳较,再將靜態(tài)庫(kù)鏈接為應(yīng)用程序,最后打包為鏡像文件敷搪。燒錄入硬件后兴想,系統(tǒng)運(yùn)行單一進(jìn)程,各個(gè)不同的任務(wù)以多個(gè)線程運(yùn)行赡勘。
結(jié)合原生編譯系統(tǒng)和 OpenHarmony的特點(diǎn)嫂便,最終采用的適配方案如下:

●不改變?cè)a的編譯系統(tǒng)和打包系統(tǒng)
●使用原生代碼的交叉編譯工具鏈編譯OpenHarmony為靜態(tài)庫(kù),將靜態(tài)庫(kù)集成到原生代碼中
●OpenHarmony中不編譯LiteOS-M內(nèi)核闸与,使用原生代碼的RTOS內(nèi)核
●原生代碼中新增適配代碼毙替,以提供OpenHarmony需要的接口

整體的軟件框架設(shè)計(jì)如下:

方案保留了原始系統(tǒng)框架的大部分功能,新增OpenHarmony的模塊功能和其他項(xiàng)目需求功能践樱,修改或升級(jí)部分原生功能(FreeRTOS厂画、 MbedTLS等)

3. OpenHarmony編譯

3.1 創(chuàng)建虛擬設(shè)備編譯

創(chuàng)建新的vendor和新的device配置,目錄如下:
●vendor/ohemu/L0_xts_demo
●device/qemu/L0_xts_demo

3.2 子系統(tǒng)配置

修改vendor/ohemu/L0_xts_demo/config.json拷邢,該文件包含了所有必須的子系統(tǒng)配置袱院。

3.3 工具鏈配置

修改device/qemu/L0_xts_demo/liteos_m/config.gni,該文件包含了板級(jí)編譯配置瞭稼,根據(jù)原生編譯系統(tǒng)的編譯設(shè)置來(lái)修改忽洛。

3.4 編譯命令

編譯命令如下:

python3 ./build.py -p L0_xts_demo -f -b debug --gn-args build_xts=true

3.5 優(yōu)化剪裁

對(duì)manifest和prebuild進(jìn)行剪裁,只下 載必須的軟件和源碼环肘。
●修改build/prebuilts_download_config.json欲虚,只保留GN、Ninja和Python悔雹。
●修改.repo/manifests/ohos/ohos.xml复哆,刪除不需要的包和源碼。

3.6 集成

將編譯后的靜態(tài)庫(kù)拷貝到原生編譯系統(tǒng)中腌零,并編寫(xiě)demo程序梯找,進(jìn)行編譯。

3.6.1 編寫(xiě)demo

OpenHarmony的demo分為兩個(gè)單元main.c和demo.c益涧。
main.c 主線程锈锤,調(diào)用OHOS_SystemInit()函數(shù),啟動(dòng)OpenHarmony
demo.c 示例線程,調(diào)用hilog接口循環(huán)打印日志

3.6.2 編譯demo

在demo目錄下創(chuàng)建CMakeFile.txt文件牙咏。
定義OpenHarmony的頭文件包含目錄及庫(kù)文件臼隔,編譯main.c和demo.c,生成demo鏡像文件妄壶。

3.6.3 編譯XTS

將XTS編譯生成的靜態(tài)庫(kù)鏈接為鏡像摔握,每一項(xiàng)XTS測(cè)試生成一個(gè)鏡像。

3.6.4 鏈接

修改ld文件的.TEXT段丁寄,新增OpenHarmony的自定義段設(shè)置氨淌。

4. 原生系統(tǒng)修改

在原生代碼中升級(jí)模塊或新增OpenHarmony調(diào)用的接口。

4.1 升級(jí)RTOS

由于不支持OpenHarmony中的底層接口伊磺,F(xiàn)reeRTOS內(nèi)核從版本10.0.1升級(jí)到版本v10.3.1盛正,適配其HAL層和 OSI層接口。

4.2 升級(jí)MbedTLS

因?yàn)樵鶰bedTLS代碼的版本較低屑埋,所以拷貝OpenHarmony中的MbedTLS源碼覆蓋到原生系統(tǒng)中豪筝。修改在OpenHarmony中不編譯三方庫(kù)MbedTLS。
修改CMakeFile.txt和config.h摘能,打開(kāi)OpenHarmony和原生系統(tǒng)需要的功能開(kāi)關(guān)续崖。

4.3 新增CMSIS接口

原生系統(tǒng)kernel中新增cmsis目錄,包含CMSIS的源碼和頭文件团搞。

4.4 新增打印接口

新增打印接口严望,對(duì)接原生系統(tǒng)打印功能,比如打印到串口逻恐、保存文件等像吻。新增加的功能模塊和OpenHarmony均調(diào)用新增的打印接口。

4.5 新增文件系統(tǒng)接口

適配OpenHarmony的文件系統(tǒng)調(diào)用的接口

●_open()
●_close()
●_read()
●_write()
●_lseek()
●_unlink()

需要注意的是复隆,OpenHarmony要求打開(kāi)文件最多為32個(gè)拨匆,這里需要控制通過(guò)_open()接口打開(kāi)的文件 總數(shù)不能超過(guò)32個(gè)。

4.6 新增POSIX接口

適配編譯中報(bào)錯(cuò)缺失的POSIX接口
●_exit()
●kill()
●sleep()
●_fini()
4.7 新增LiteOS接口
LiteOS中調(diào)用的接口
●ArchIntLock()
●ArchIntRestore()
●LOS_MuxCreate()
●LOS_MuxPend()
●LOS_MuxDelete()
●LOS_TickCountGet()
●osThreadGetArgument()
4.8 其他接口
適配缺失的其他接口
●OhosMalloc()
●OhosFree()
●RefreshAllServiceTimeStamp()
●HiLogWriteInternal()

5. OpenHarmony修改

5.1 三方庫(kù)

修改third_party/bounds_checking_function/BUILD.gn昏名,編譯生成libsec_static靜態(tài)庫(kù)

5.2 修改hiview_lite

●base/hiviewdfx/hiview_lite/BUILD.gn涮雷,改為無(wú)緩存阵面,直接輸出到串口轻局。
●base/hiviewdfx/hiview_lite/hiview_util.c ,修改打印函數(shù)样刷,調(diào)用原生系統(tǒng)新增的打印接口

5.3 修改HUKS

修改文件base/security/huks/utils/mutex/hks_mutex.c
因?yàn)樵到y(tǒng)并不支持POSIX的mutex系列接口仑扑,這里修改為L(zhǎng)OS接口。如果原生系統(tǒng)支持POSIX接口置鼻,則這里不需要進(jìn)行修改镇饮。

5.4 修改bootstrap_lite

修改文件base/startup/bootstrap_lite/services/source/core_main.h,取消宏里面的重復(fù)調(diào)用箕母。

5.5 刪除-fPIC

刪除BUILD.gn文件里的-fPIC储藐,否則會(huì)導(dǎo)致程序運(yùn)行異常俱济。
●foundation/ability/ability_lite/frameworks/want_lite/BUILD.gn
●foundation/bundlemanager/bundle_framework_lite/frameworks/bundle_lite/BUILD.gn

5.6 修改XTS

修改日志打印,將日志輸出到串口钙勃。

6. 總結(jié)

該方案與通用方案相比蛛碌,降低了適配復(fù)雜度和開(kāi)發(fā)難度,減少了工作量辖源,使項(xiàng)目進(jìn)度符合了工期要求蔚携,是一種快速的適配方案。采用該方案進(jìn)行開(kāi)發(fā)的輕量設(shè)備已經(jīng)成功通過(guò)了OpenHarmony兼容性測(cè)評(píng)克饶。請(qǐng)各位讀者根據(jù)項(xiàng)目的實(shí)際情況在兩種方案中進(jìn)行選擇酝蜒。

寫(xiě)在最后

如果你覺(jué)得這篇內(nèi)容對(duì)你還蠻有幫助,我想邀請(qǐng)你幫我三個(gè)小忙

  • 點(diǎn)贊矾湃,轉(zhuǎn)發(fā)亡脑,有你們的 『點(diǎn)贊和評(píng)論』,才是我創(chuàng)造的動(dòng)力邀跃。
  • 關(guān)注小編远豺,同時(shí)可以期待后續(xù)文章ing??,不定期分享原創(chuàng)知識(shí)坞嘀。
  • 想要獲取更多完整鴻蒙最新學(xué)習(xí)知識(shí)點(diǎn)躯护,請(qǐng)移步前往小編:https://gitee.com/MNxiaona/733GH/blob/master/jianshu
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丽涩,隨后出現(xiàn)的幾起案子棺滞,更是在濱河造成了極大的恐慌,老刑警劉巖矢渊,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件继准,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡矮男,警方通過(guò)查閱死者的電腦和手機(jī)移必,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)毡鉴,“玉大人崔泵,你說(shuō)我怎么就攤上這事≈硭玻” “怎么了憎瘸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)陈瘦。 經(jīng)常有香客問(wèn)我幌甘,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任锅风,我火速辦了婚禮酥诽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皱埠。我一直安慰自己盆均,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布漱逸。 她就那樣靜靜地躺著泪姨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饰抒。 梳的紋絲不亂的頭發(fā)上肮砾,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音袋坑,去河邊找鬼仗处。 笑死,一個(gè)胖子當(dāng)著我的面吹牛枣宫,可吹牛的內(nèi)容都是我干的婆誓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼也颤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洋幻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起翅娶,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤文留,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后竭沫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體燥翅,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年蜕提,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了森书。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谎势,死狀恐怖凛膏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情它浅,我是刑警寧澤译柏,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布镣煮,位于F島的核電站姐霍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镊折,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一胯府、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恨胚,春花似錦骂因、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至升熊,卻和暖如春俄烁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背级野。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工页屠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓖柔。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓辰企,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親况鸣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牢贸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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