一、前言
前一段時間,我寫過一篇關於LiteOS-A開發環境搭建的文章(實際上是將其作為獨立的RTOS來開發的),今天正式講一講LiteOS作為鴻蒙內核子系統該如何開發。
對於HarmonyOS,開發工作大致可以分為南向開發(內核、驅動)和北向開發(App應用)。我們主講南向開發。在目前的鴻蒙2.0版本下,南向輕內核開發的資料相對更加完善,主要是針對LiteOS內核。講到這里,能完整編譯到手機上運行的鴻蒙鏡像,可能大家還要再等一等了(筆者也很期待)。
二、概述
為了幫大家理清楚鴻蒙開發的套路,我們從頭再梳理一遍相關的脈絡。並為大家總結一些重點性的內容。在介紹OpenHarmony特性前,需要大家先明確以下兩個基本概念:
子系統
OpenHarmony整體遵從分層設計,從下向上依次為:內核層、系統服務層、框架層和應用層。系統功能按照“系統 > 子系統 > 組件”逐級展開。子系統是一個邏輯概念,它具體由對應的組件構成。我們這一系列文章主講的南向輕內核開發,就屬於內核子系統的開發。
組件
對子系統的進一步拆分,可復用的軟件單元,它包含源碼、配置文件、資源文件和編譯腳本;能獨立構建,以二進制方式集成,具備獨立驗證能力的二進制單元。
1. 整體介紹
OpenHarmony是由開放原子開源基金會(OpenAtom Foundation)孵化及運營的開源項目,目標是面向全場景、全連接、全智能時代,基於開源的方式,搭建一個智能終端設備操作系統的框架和平台,促進萬物互聯產業的繁榮發展。
重點一:開放原子開源基金會是由國家主導的。
2. 技術架構
OpenHarmony整體遵從分層設計,從下向上依次為:內核層、系統服務層、框架層和應用層。系統功能按照“系統 > 子系統 > 組件”逐級展開,在多設備部署場景下,支持根據實際需求裁剪某些非必要的組件。OpenHarmony技術架構如下所示:
重點二:可裁剪,靈活性高,適應碎片化復雜化的物聯網場景。
1) 內核層
內核子系統:采用多內核(Linux內核或者LiteOS)設計,支持針對不同資源受限設備選用適合的OS內核。內核抽象層(KAL,Kernel Abstract Layer)通過屏蔽多內核差異,對上層提供基礎的內核能力,包括進程/線程管理、內存管理、文件系統、網絡管理和外設管理等。
驅動子系統:驅動框架(HDF)是系統硬件生態開放的基礎,提供統一外設訪問能力和驅動開發、管理框架。
重點三:內核多樣化,適配不同資源的硬件平台,HDF框架,提供統一的生態接口。
系統服務層
系統服務層是OpenHarmony的核心能力集合,通過框架層對應用程序提供服務。該層包含以下幾個部分:
系統基本能力子系統集:為分布式應用在多設備上的運行、調度、遷移等操作提供了基礎能力,由分布式軟總線、分布式數據管理、分布式任務調度、公共基礎庫、多模輸入、圖形、安全、AI等子系統組成。
基礎軟件服務子系統集:提供公共的、通用的軟件服務,由事件通知、電話、多媒體、DFX(Design For X) 等子系統組成。
增強軟件服務子系統集:提供針對不同設備的、差異化的能力增強型軟件服務,由智慧屏專有業務、穿戴專有業務、IoT專有業務等子系統組成。
硬件服務子系統集:提供硬件服務,由位置服務、生物特征識別、穿戴專有硬件服務、IoT專有硬件服務等子系統組成。
根據不同設備形態的部署環境,基礎軟件服務子系統集、增強軟件服務子系統集、硬件服務子系統集內部可以按子系統粒度裁剪,每個子系統內部又可以按功能粒度裁剪。
重點四:深入細分到功能粒度級的可裁剪性。
2) 框架層
框架層為應用開發提供了C/C++/JS等多語言的用戶程序框架和Ability框架,適用於JS語言的JS UI框架,以及各種軟硬件服務對外開放的多語言框架API。根據系統的組件化裁剪程度,設備支持的API也會有所不同。
重點五:多語言框架、Ability框架、UI框架的豐富框架。
3) 應用層
應用層包括系統應用和第三方非系統應用。應用由一個或多個FA(Feature Ability)或PA(Particle Ability)組成。其中,FA有UI界面,提供與用戶交互的能力;而PA無UI界面,提供后台運行任務的能力以及統一的數據訪問抽象。基於FA/PA開發的應用,能夠實現特定的業務功能,支持跨設備調度與分發,為用戶提供一致、高效的應用體驗。
重點六:FA和PA對應用進行抽象和歸類,以提供跨設備調度與分發的能力。
4) 技術特性
總結起來,主要有以下特點:
- 硬件互助,資源共享
- 一次開發,多端部署
- 統一OS,彈性部署
那么實現出來的效果,就和鴻蒙2.0發布會上面展現的差不多:更低的延時、終端更智能化且更加貼合自身的場景、每個設備的自身優勢被無限放大、數據的可流轉性。
3. 系統特征
OpenHarmony支持如下幾種系統類型:
1) 輕量系統(mini system)
面向MCU類處理器例如Arm Cortex-M、RISC-V 32位的設備,硬件資源極其有限,支持的設備最小內存為128KiB,可以提供多種輕量級網絡協議,輕量級的圖形框架,以及豐富的IOT總線讀寫部件等。可支撐的產品如智能家居領域的連接類模組、傳感器設備、穿戴類設備等。
2) 小型系統(small system)
面向應用處理器例如Arm Cortex-A的設備,支持的設備最小內存為1MiB,可以提供更高的安全能力、標准的圖形框架、視頻編解碼的多媒體能力。可支撐的產品如智能家居領域的IP Camera、電子貓眼、路由器以及智慧出行域的行車記錄儀等。
3) 標准系統(standard system)
面向應用處理器例如Arm Cortex-A的設備,支持的設備最小內存為128MiB,可以提供增強的交互能力、3D GPU以及硬件合成能力、更多控件以及動效更豐富的圖形能力、完整的應用框架。可支撐的產品如高端的冰箱顯示屏。
小結
目前鴻蒙OS的代碼倉庫主要發布在gitee上的開放原子開源基金會中。其他平台的代碼,是作為分發編譯源碼使用的,比如hpm倉庫,下文我們將詳細講述。
你可以點擊下面的鏈接,跳轉到鴻蒙的代碼倉庫,閱讀核心源代碼。
三、搭建開發環境
對於LiteOS內核開發,官方給出了非常詳細的教程,但是內容很多,且平台復雜,工具鏈較長。在這里我會為大家做一下梳理,然后提供每一種開發環境的官方教程鏈接,同時提供完整的編譯鏈工具下載地址。在最后,我會采用小熊派·鴻蒙季開發板,搭建一個完整的開發環境,供大家參考。
1. 源碼獲取
一共有三種方法,我簡要列出來給大家看看。你可以通過下面的小結,跳轉到官方給出的教程,進行詳細閱讀。
1) 鏡像站下載
從鏡像站點下載歸檔后的發行版壓縮文件。如果要獲取舊版本的源碼,也可通過此方式獲取。
https://repo.huaweicloud.com/harmonyos/os/1.1.0/ipcamera_hi3518ev300-1.1.0.tar.gz
示例:編譯工具鏈
https://repo.huaweicloud.com/harmonyos/os/2.0/tool_chain/
2) HPM包拉取
通過HPM包管理器獲取。在HPM網站,查找滿足需求的開源發行版,直接下載(或者定制后下載),再通過hpm-cli命令工具將所需的組件及工具鏈下載、安裝到本地。
需要安裝的工具有:
工具名稱 | 用途 |
---|---|
Node.js | 提供前置環境 |
hpm | 獲取源碼的工具 |
下文將采用小熊派開發板來具體演示HPM包管理器獲取源碼,這里暫且不表。
3) 代碼倉庫克隆
從代碼倉庫獲取。通過repo或git工具從代碼倉庫中下載。
首先注冊碼雲gitee賬號。再注冊碼雲SSH公鑰,請參考碼雲幫助中心。
https://gitee.com/help/articles/4181
安裝git客戶端和git-lfs並配置用戶信息。
git config --global user.name "yourname"
git config --global user.email "your-email-address"
git config --global credential.helper store
安裝碼雲repo工具,可以執行如下命令。
curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo
chmod a+x /usr/local/bin/repo
pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests
4)小結
關於獲取鴻蒙源碼,為了便於后續開發,選擇一種適合自己的方法最好。
三種獲取源碼的官方教程鏈接
https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/源碼獲取.md
2. 工具鏈獲取
官方提供了兩個開發環境,兩個開發工具。開發環境主要指:基於HPM的Docker環境和獨立的Docker環境;開發工具主要指:設備開發工具(南向)和應用開發工具(北向)。
基於HPM的Docker環境:適用於使用HPM工具進行發行版編譯的場景。
基於獨立Docker環境:適用於直接基於Ubuntu、Windows操作系統平台進行版本編譯的場景。
設備開發工具(HUAWEI DevEco Device Tool),支持linux 和windows
除了官方介紹的,也可以自行搭建開發環境,具體需要安裝如下工具:
Linux部分:
Ubuntu16.04及以上64位系統版本,Shell使用bash
開發工具 | 用途 |
---|---|
gcc_riscv32 | 交叉編譯工具 |
Python3.7+(64 bit) | 編譯構建工具 |
SCons3.0.4+ | 編譯構建工具 |
bash | 命令處理器 |
build-essential | 編譯依賴的基礎軟件包 |
gn | 產生ninja編譯腳本 |
ninja | 執行ninja編譯腳本 |
Visual Studio Code(可選) | 代碼編輯器 |
其中 gn 和ninja 由於在國外,比較難安裝,可能需要FQ。
Windows部分
64位Windows工作台(主機電腦)
開發工具 | 用途 |
---|---|
Visual Studio Code(可選) | 代碼編輯器 |
MobaXterm、PuTTY(可替換) | 提供SSH鏈接和串口連接 |
Hiburn | 代碼燒錄工具 |
VMware(可選) | 虛擬機 |
但是大家放心,我已經將所有的工具鏈都打包好了,可以直接下載,后台回復鴻蒙OS
,即可獲得完整的工具包,其中我提供的linux鏡像包含完整的工具鏈,可以直接使用。
四、Demo演示
1. 部署Linux環境
1.解壓百度雲下載的HarmonyOSUbuntu18.4鏡像OVF.zip文件到某個目錄,建議不要放到在C盤。
2.打開VMware Workstation工具
3.選擇第1步解壓的Ubuntu18.4鏡像OVF文件夾中,點擊打開
4.導入鏡像到本地磁盤(選擇一個磁盤空間大小≥ 10G的盤),點擊導入。
5.點擊開啟此虛擬機,來開啟虛擬機電源
6.此時虛擬機進入登錄界面,點擊HarmonyOS
7.輸入密碼:bearpi,然后點擊登錄
8.進入桌面后,點擊桌面空白處右鍵,點擊打開終端(E)
9.在終端中輸入ifconfig,然后點擊回車,除lo外,另外一個就是你的網卡信息,記錄你獲取到的IP地址。
10.最小化VMware Workstation,回到Windows桌面上。
注意:如果連不上網絡(如果主機網絡需要撥號,如校園網絡、ADSL撥號等)在VMware Workstation中,點擊虛擬機>> 設置
然后在網絡適配器中,改成NAT 模式,點擊確定
然后再回復步驟8。
2. 部署windows環境
1.打開MobaXterm工具,並依次點擊:Session,SSH 按鈕。輸入連接信息,遠程地址,並點擊OK
2.輸入賬號:bearpi,點擊回車
3.輸入密碼:bearpi,注意,輸入密碼的時候屏幕不會顯示,輸完之后點擊回車
4.在彈出的界面上,點擊Yes保存賬號信息,以免下次輸入
3. 映射linux文件到window
這里可以使用VMWare自帶的虛擬磁盤映射服務,也可以使用RaiDrive。
1.安裝RaiDrive軟件,默認安裝即可
2.添加鏈接信息
SFTP://______ (這個輸入獲取到的IP地址),賬戶:賬號和密碼皆為 bearpi,其他默認,點擊確定
查看本地映射的ubuntu文件路徑
4. 獲取源碼
1.切換到MobaXterm
2.在MobaXterm中輸入以下內容,並回車:
cd /home/bearpi
3.在MobaXterm中輸入以下內容,並回車:
mkdir project && cd project
4.在MobaXterm中輸入以下內容,並回車:
hpm init -t default
5.在MobaXterm中輸入以下內容,並回車:
hpm i @bearpi/bearpi_hm_nano
等待1-3分鍾(根據不同網速),當屏幕中出現Installed.意味着代碼獲取完成如果卡死不動了,就ctrl+c 退出,重新輸入一遍並回車。
5. 編譯代碼
1.在MobaXterm中輸入以下內容,並回車:
hpm dist
等待直到屏幕出現:BUILD SUCCESS字樣,說明編譯成功。
2.查看編譯出的固件位置
當編譯完后,在Windows中可以直接查看到最終編譯的固件,具體路徑在:
6. 連接開發板
1.通過TypeC數據線,把電腦與BearPi-HM Nano連接。
2.安裝CH340驅動。
一般電腦自帶CH340的驅動。
3.關閉虛擬機捕獲USB功能。(有很多開發者都是因為虛擬機捕獲了USB設備,導致本機Windows電腦看不到串口)
如果上面操作不行,直接關閉VMware Workstation,選擇掛起,然后再重新插拔USB。
7. 燒錄程序
1.在Windows打開Hiburn工具,並點擊Refresh,會檢索出來COM號,如果你的電腦連接了多個串口,需要你在設備管理器中查看具體的串口號是哪一個。
2.然后點擊Setting,並選擇 Com settings,
在Com settings中設置Baud為:921600,點擊確定
3.點擊 Hiburn工具中的Select file按鈕,在彈出的文件框中,選擇對應的路徑,並選中:Hi3861_wifiiot_app_allinone.bin 文件。
4.勾選Auto burn復選框,然后點擊Connect
此時Connect按鈕變成Disconnect,等待下載,這一步要有耐心,不要着急。
5.復位開發板RESET按鍵,開始下載程序
直到出現Execution Successful字樣,程序下載完成。
下載完后,點擊Disconnect按鈕,便於后面調測使用。
8. 查看串口打印日志
1.打開MobaXterm,
點擊:Session、Serial按鈕;設置Seral port為 Hiburn 同一個串口;設置Speed為 115200;點擊OK。
2.如果顯示Unable to open...等字樣,需要看一下Hiburn的鏈接狀態是否為關閉。
3.復位開發板,此時COM打印出對應日志信息。
4.開發板現象:
9. 分析代碼
1.在windows下打開vscode
注意:看個人需要,再決定是否安裝官方提供的HUAWEI DevEco Device Tool,因為這個插件比較大,VsCode啟動以后,要花一定的時間加載它。所以這里我沒有裝,只是把vscode當作一個代碼編輯器。
2.我們看內核啟動后的第一個入口函數。
代碼路徑如下:
vendor\hisi\hi3861\hi3861\app\wifiiot_app\src\app_main.c
app_main函數,首先會打SDK的版本號,在完成外設的基本初始化,最后調用HOS_SystemInit函數進行鴻蒙系統的初始化。
3.按下F12
跳轉到HOS_SystemInit函數,具體代碼路徑如下:
base\startup\services\bootstrap_lite\source\system_init.c
同時,這個函數是一個虛函數,用戶可以根據自己需要來初始化鴻蒙系統。如果用戶不定義此函數,那么將運行系統默認的函數(即原函數),原函數具體代碼和截圖如下:
void HOS_SystemInit(void)
{
MODULE_INIT(bsp); // 初始化BSP板極支持包
MODULE_INIT(device); // 初始化系統設備
MODULE_INIT(core); // 初始化系統核心
SYS_INIT(service); // 初始化系統服務
SYS_INIT(feature); // 初始化系統特征段
MODULE_INIT(run); //調用所有 RUN段的代碼
SAMGR_Bootstrap();
}
這個函數,完成了系統的基本初始化,並指向我們業務邏輯代碼。
10. 小結
總的來說,構建這樣一個環境,還是相對比較繁瑣的。但是鴻蒙能夠在短時間內做到這種程度,是非常值得我們肯定的。
再補充一些東西:
1.鴻蒙使用Ninja來組織代碼進行編譯,相比Makefile+Kconfig 的形式,要快很多,這也是Ninja誕生的意義。
2.南向開發,相比北向開發,更加碎片化,也更加復雜和繁瑣。對比一下工具鏈就知道了,那么長....
3.官方給出了比較詳細的教程,但是方法太多,結構太散,需要自己仔細閱讀和甄別。本文相當於幫大家梳理了一番,具體細節還得個人好好把握。
4.配置開發環境,是一項體力活,技術含量不大,但是特別磨人,不過邁出了這一步,接下來的就輕松啦!
文中環境,關注:一口Linux,后台回復:鴻蒙,既可以獲取