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