1. 簡(jiǎn)介
本文在不改變?cè)邢到y(tǒng)基礎(chǔ)框架的基礎(chǔ)上, 介紹了一種OpenAtom OpenHarmony(以下簡(jiǎn)稱“OpenHarmony”)輕量系統(tǒng)適配方案。 本方案使用的是 OpenHarmony v3.2 Release版本源碼。
2. 方案設(shè)計(jì)
本文使用的硬件模塊的主要特性及功能如下:
通常,適配OpenHarmony的方案是,將內(nèi)核由RTOS改為LiteOS-M,并移植原生所有功能模塊和鏡像打包功能。采用該方案面臨了諸多困難:
●編譯系統(tǒng)更改Gn+Ninjia,重寫和調(diào)試編譯腳本,需要學(xué)習(xí)成本
●適配和測(cè)試全部的原生功能,原本測(cè)試通過的功能需要重新測(cè)試,付出重復(fù)的勞動(dòng)
●適配新的OS接口,需要修改原生系統(tǒng)的OSI層接口,以對(duì)接LiteOS-M
該方案的改動(dòng)較多,將導(dǎo)致開發(fā)人員無法將精力聚焦于項(xiàng)目的新功能、工作量大、難度大,無法滿足項(xiàng)目的工期要求,項(xiàng)目風(fēng)險(xiǎn)大。
OpenHarmony的輕量系統(tǒng)編譯過程是,首先將各模塊編譯鏈接為靜態(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è)置來修改。
3.4 編譯命令
編譯命令如下:
python3 ./build.py -p L0_xts_demo -f -b debug --gn-args build_xts=true
編譯出的靜態(tài)庫(kù)位于out/L0_xts_demo/L0_xts_demo/libs
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)中,并編寫demo程序,進(jìn)行編譯。
3.6.1 編寫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層接口。
FreeRTOS源碼來自于官網(wǎng)地址: https://github.com/FreeRTOS/FreeRTOS
4.2 升級(jí)MbedTLS
因?yàn)樵鶰bedTLS代碼的版本較低,所以拷貝OpenHarmony中的MbedTLS源碼覆蓋到原生系統(tǒng)中。修改在OpenHarmony中不編譯三方庫(kù)MbedTLS。
修改CMakeFile.txt和config.h,打開OpenHarmony和原生系統(tǒng)需要的功能開關(guān)。
4.3 新增CMSIS接口
原生系統(tǒng)kernel中新增cmsis目錄,包含CMSIS的源碼和頭文件。
CMSIS源碼來自于開源項(xiàng)目CMSIS-FreeRTOS,地址:https://github.com/ARM-software/CMSIS-FreeR TOS
修改部分源碼適配系統(tǒng)源碼,并修改kernel的CMakeFile.txt,將源碼中的cmsis_os2.c文件加入編譯。
4.4 新增打印接口
新增打印接口,對(duì)接原生系統(tǒng)打印功能,比如打印到串口、保存文件等。新增加的功能模塊和OpenHarmony均調(diào)用新增的打印接口。
4.5 新增文件系統(tǒng)接口
適配OpenHarmony的文件系統(tǒng)調(diào)用的接口
●_open()
●_close()
●_read()
●_write()
●_lseek()
●_unlink()
需要注意的是,OpenHarmony要求打開文件最多為32個(gè),這里需要控制通過_open()接口打開的文件 總數(shù)不能超過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,改為無緩存,直接輸出到串口。
●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ù)雜度和開發(fā)難度,減少了工作量,使項(xiàng)目進(jìn)度符合了工期要求,是一種快速的適配方案。采用該方案進(jìn)行開發(fā)的輕量設(shè)備已經(jīng)成功通過了OpenHarmony兼容性測(cè)評(píng)。請(qǐng)各位讀者根據(jù)項(xiàng)目的實(shí)際情況在兩種方案中進(jìn)行選擇。
審核編輯:劉清
-
CMSIS
+關(guān)注
關(guān)注
0文章
39瀏覽量
11825 -
RTOS
+關(guān)注
關(guān)注
20文章
804瀏覽量
119113 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
483瀏覽量
61724 -
HAL庫(kù)
+關(guān)注
關(guān)注
1文章
114瀏覽量
6030 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3548瀏覽量
15736
原文標(biāo)題:一種OpenHarmony輕量系統(tǒng)適配方案
文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論