一分鐘帶你了解Huawei LiteOS之組件開發指南
在開發工作過程中,面對龐大的代碼量,你是否因擔心出現牽一發而動全身的情況而不知從何下手?
今天為大家帶來開發者效率提升利器:組件
本文將基于Huawei LiteOS系統,從組件定義開始帶你走進組件開發指南。
組件定義
組件是Huawei LiteOS系統的組成部分,屬于Huawei LiteOS應用。從系統層面看,除內核、構建腳本、輔助工具、系統函數庫外,其余組成Huawei LiteOS系統功能的軟件包均可稱為組件。本文檔將詳細介紹組件的構成、規范及組件開發流程,幫助組件開發人員進行組件開發。Huawei LiteOS的組件分為在線組件和離線組件。在線組件的組件源碼不在Huawei LiteOS代碼倉中,使用時需要從網上下載;而離線組件的源碼則存放在Huawei LiteOS代碼倉中。離線組件一般都是基礎組件,如網絡、文件系統等。
組件構成
下面以在線組件curl為例,對Huawei LiteOS的組件構成及組件管理進行詳細說明。
目錄結構
新增一個組件涉及新建和修改的文件/目錄如下所示。其中components下的curl、demos下的curl及它們包含的文件為新增目錄和文件,其余文件為各組件或demos的共有文件,新增組件時一般也需要修改。
須知:
新增組件或demo,都需要新建其自身的Kconfig、Makefile、.mk文件,本文檔以新增組件為主題,新增demo的方法和新增組件類似,本文檔不再贅述。
curl-7.54.1、curl-7.54.1.zip 提交時需刪除,無須提交到LiteOS倉庫。
origin.patch、patch.sha256、src.sha256 是開發過程中生成的文件,需提交到LiteOS_Components倉庫。
online_components
在線組件的源碼需要從網上下載,下載信息記錄在online_components文件中。該文件具有特定格式,保存了各在線組件的相關信息(或稱參數)。如下所示,每個組件各有四個參數,各參數之間使用&分開。
curl-7.54.1 & components/utility/curl & LOSCFG_COMPONENTS_CURL=y & https://github.com/curl/curl/archive/refs/tags/curl-7_54_1.zip
? 參數一:組件源碼名(一般命名為:源碼名-版本號)。
須知:該名字即相當于對源碼的重命名,與直接在網頁上點擊下載得到的名字不一定相同。如此處直接訪問https://github.com/curl/curl/archive/refs/tags/curl-7_54_1.zip,下載得到的文件名為curl-curl-7_54_1.zip,解壓該文件得到的文件為curl-curl-7_54_1。但download.sh在執行下載時,會根據參數一及參數四將下載的文件命名為curl-7.54.1.zip(命名方式:參數一 + 參數四中的下載類型),解壓該文件得到的文件為curl-7.54.1,即參數一。因此開發人員在開發過程中,對源碼進行的一切操作,必須以參數一寫的名字為準,如果下載的源碼名與參數一寫的不一致,請根據上述說明,重命名之后再進行后續開發。
? 參數二:組件所在路徑(將組件源碼下載到該目錄下)。
? 參數三:組件使能的標志(用于判斷是否下載組件源碼,該標志就是組件Kconfig文件中的配置項)。
? 參數四:組件源碼的-或獲取組件源碼的命令(因后面涉及源碼校驗,推薦優先下載源碼壓縮包,校驗時更加方便快捷)。
須知:在線組件目前支持如下幾種下載方式:
? 下載壓縮包:目前僅支持.zip、.tar.gz類型的壓縮包,如:
https://github.com/curl/curl/archive/refs/tags/curl-7_54_1.zip https://github.com/curl/curl/archive/refs/tags/curl-7_54_1.tar.gz
? 使用git克隆,如:
git clone -b curl-7.54.1 https://github.com/curl/curl.git
? 如使用上述方式無法獲取源碼,可自行編寫shell腳本完成源碼下載,并返回下載結果(成功/失敗)。參數四填寫調用該腳本的方法即可。
download.sh
下載在線組件源碼和補丁文件,進行sha256sum校驗,校驗成功后,將補丁文件打入源碼。
components/utility/curl
curl目錄是curl組件的源碼及其相關文件所在目錄。新增組件時,請根據組件功能在components目錄相應位置下新建組件目錄(分為語言類組件language、媒體類組件media、工具類組件utility、安全組件security等。而curl屬于工具類組件,故其位于utility目錄下)。
命名規范:一般和組件源碼同名(不可簡寫,如libpng不可寫為png)或參考業界通用命名。
curl/curl-7.54.1
組件源碼,目錄名需要與online_components文件中的參數保持一致。在線組件由download.sh從網上下載獲得,不需要將組件源碼上傳到Huawei LiteOS代碼倉,只有離線組件的源碼需要上傳。
src.sha256
文件內容為組件源碼的sha256校驗碼。為確保組件的正常使用,需要保證從網上下載的源碼與開發組件時使用的源碼為同一份。LiteOS通過對下載的源碼進行sha256校驗來保證為同一份源碼。因此,開發組件時需要計算生成源文件的sha256校驗碼,并將其復制到src.sha256文件。curl組件的src.sha256的文件內容如下:
7eec2c7f863c17d8586e94255cd0c2934822f1ae3cb40283a892b46e44f93bdf curl-7.54.1.zip
生成sha256校驗碼的方法可參考如下命令:
? 如果下載的源碼包是壓縮包:
sha256sum 參數一.zip > src.sha256 # sha256sum curl-7.54.1.zip > src.sha256
? 如果源碼包不是壓縮包:
find 參數一 -type f -print0 | xargs -0 sha256sum > src.sha256 # find curl-7.54.1 -type f -print0 | xargs -0 sha256sum > src.sha256
須知:如果需要在Windows中執行以上命令,可以安裝Git工具,使用Git自帶的終端即可執行。注意需提前設置Git為禁止換行符轉換,參考命令git config --global core.autocrlf input。
注意:
校驗碼文件采用統一命名src.sha256,文件名不可修改。
開發組件時,請使用online_components文件中的參數四的方式下載源碼文件。
src.sha256
源碼的補丁文件。該文件采用統一命名origin.patch,不可修改。在Huawei LiteOS上開發組件,建議盡量避免對開源源碼直接修改如無法避免(例如:不修改源碼無法編譯成功,或源碼無法直接運行在Huawei LiteOS上,則需要適配),則應該將修改內容生成為補丁文件origin.patch,在后續使用中,采取打補丁的方式修改源碼。打補丁時采用patch -p1的方式,生成補丁文件時請注意。
origin.patch補丁文件的生成可參考如下方式:
? 新建a、b目錄,將沒有被修改的組件源碼拷貝到a目錄下,將修改過后的組件源碼拷貝到b目錄下,目錄結構如下:
? 執行如下命令
diff -Nur a/curl-7.54.1 b/curl-7.54.1 > orinig.patch
注意:請確保origin.patch文件在本地校驗前已經是unix格式。因為該文件上傳到LiteOS_Components倉庫時會自動轉換為unix格式,如果本地校驗時不是unix格式,會導致該在線組件執行download.sh失敗。
patch.sha256
源碼補丁文件origin.patch的校驗碼文件。該文件采用統一命名patch.sha256,不可修改。其作用是保證下載的補丁文件正確,文件格式與src.patch的要求一致。
Kconfig
components/utility/curl/Kconfig
組件配置文件。通過該文件將組件納入到LiteOS的菜單項界面中管理,編寫時可參考已有組件的Kconfig文件進行修改。Kconfig的基本語法可自行搜索或參考官方文檔《kconfig-language.txt》。
components/utility/curl/Kconfig的文件內容及說明如下:
config LOSCFG_COMPONENTS_CURL # 配置項:一般固定為"LOSCFG_COMPONENTS_目錄名" bool "Enable Curl" # bool: 配置項類型; Enable Curl: 配置項提示 select LOSCFG_COMPONENTS_NET_LWIP # 依賴關系:如依賴其他組件,請指明依賴關系 select LOSCFG_COMPONENTS_FS_FATFS default n # 組件默認是否使能:一般默認不使能 help Answer y to enable curl. # 幫助信息:該配置項的說明
? 如果組件下還包含其他多個組件,可靈活命名配置項。如LOSCFG_COMPONENTS_目錄名_XXX,但不宜過長。
? 配置項提示是menuconfig菜單項中的顯示信息,可理解為配置項的別名。各單詞首字母需大寫,其余小寫(專有名詞除外)。
? 幫助信息的首字母大寫,其余小寫(專有名詞除外),同時要有結束符。
? 縮進請使用空格,不得使用tab鍵。
上級目錄中的Kconfig
新增組件時,除了需要在本級組件目錄下新建本組件的Kconfig文件,還需要修改上級目錄下的Kconfig文件。該文件用于調用下一級子目錄中的Kconfig,可參考該文件中的其他組件進行修改。components/utility/Kconfig文件內容如下,其包含了utility目錄下所有組件的Kconfig文件。
menu "Utility" # 菜單項 source "components/utility/bidireference/Kconfig" source "components/utility/curl/Kconfig" # 本次新增的內容 source "components/utility/freetype/Kconfig" source "components/utility/iconv/Kconfig" source "components/utility/iniparser/Kconfig" source "components/utility/json-c/Kconfig" source "components/utility/libxml2/Kconfig" endmenu
.mk文件
.mk用于導出組件的對外頭文件,供其他組件或模塊調用本組件中的API。為避免頭文件關系混亂,Huawei LiteOS使用.mk文件管理和限制組件對外頭文件,并通過各目錄下的.mk文件將組件的對外接口層層導出,最終所有組件的頭文件通過components.mk對外提供。
新增組件時一般涉及的.mk文件為:
? 在新增組件目錄下新建本組件的.mk文件,可參考已有組件的.mk文件。
? 修改上級目錄下的.mk文件,可參考該文件中的其他組件進行修改。
如curl.mk與utility.mk:
####################### curl.mk的內容如下 ######################## CURL_VERSION=curl-7.54.1 # 組件版本 COMPONENTS_CURL_INCLUDE := \ -I $(LITEOSTOPDIR)/components/utility/curl/$(CURL_VERSION)/include \ -I $(LITEOSTOPDIR)/components/utility/curl/$(CURL_VERSION)/src
##################### utility.mk的內容如下 ####################### ifeq ($(LOSCFG_COMPONENTS_CURL), y) # 只有組件已使能,才執行以下操作 include $(LITEOSTOPDIR)/components/utility/curl/curl.mk # 調用子目錄下其他組件的.mk文件 COMPONENTS_UTILITY_INCLUDE += $(COMPONENTS_CURL_INCLUDE) # 導出該組件對外開放的頭文件 endif
文件規范及說明:
? CURL_VERSION:組件版本宏定義,一般命名為源碼名_VERSION。
? COMPONENTS_CURL_INCLUDE:頭文件宏定義,一般命名為COMPONENTS_源碼名_INCLUDE。
? 一般在組件的上級目錄.mk文件中,調用具體組件的.mk文件時必須有條件限制,只有組件被使能的情況下才允許調用組件的.mk文件。
? 如需縮進,統一縮進四個空格,注意不得使用tab鍵。
Makefile
components/utility/curl/Makefile組件化編譯文件。通過該文件將組件加入到Huawei LiteOS的組件化編譯框架中。新增組件時需要在組件目錄下新建該文件以實現組件編譯,可參考已有組件的Makefile文件。components/utility/curl/Makefile文件內容如下:
include $(LITEOSTOPDIR)/config.mk include $(LITEOSTOPDIR)/components/net/lwip/lwip.mk include $(LITEOSTOPDIR)/components/utility/curl/curl.mk MODULE_NAME := $(notdir $(CURDIR)) # $(notdir $(CURDIR)) 等價于 curl LOCAL_SRCS_y := LOCAL_DIRS_y := LOCAL_DIRS_y += $(CURL_VERSION)/lib LOCAL_DIRS_y += $(CURL_VERSION)/lib/vauth LOCAL_DIRS_y += $(CURL_VERSION)/lib/vtls LOCAL_DIRS_y += $(CURL_VERSION)/src LOCAL_INCLUDE := $(LWIP_INCLUDE) LOCAL_INCLUDE += \ -I $(LITEOSTOPDIR)/components/utility/curl/$(CURL_VERSION)/lib \ -I $(LITEOSTOPDIR)/components/utility/curl/$(CURL_VERSION)/include \ -I $(LITEOSTOPDIR)/components/utility/curl/$(CURL_VERSION)/src LOCAL_SRCS_y += $(foreach dir, $(LOCAL_DIRS_y), $(wildcard $(dir)/*.c)) LOCAL_SRCS = $(LOCAL_SRCS_y) LOCAL_EXT_FLAG := -Wno-error -Wno-implicit-function-declaration -Wno-unused-variable CURL_DEFS = \ -D HAVE_CONFIG_H \ -D BUILDING_LIBCURL LOCAL_FLAGS := $(LOCAL_INCLUDE) $(CURL_DEFS) $(LOCAL_EXT_FLAG) include $(MODULE)
下面對幾個重要參數進行說明(部分參數不是每個Makefile都必須的,請根據實際需求選擇寫/不寫):
? include $(LITEOSTOPDIR)/config.mk:引入Huawei LiteOS系統的宏定義,所有Makefile都需要引用該文件。
? MODULE_NAME:模塊名,編譯生成的靜態鏈接庫的名稱就是模塊名。例如這里模塊名為curl,那么生成的靜態鏈接庫就是libcurl.a。在bsp.mk文件中需要增加新組件的庫文件的鏈接,請參考bsp.mk文件中已有組件的鏈接進行修改。
注意:如果組件名本身是以lib開頭的,模塊名中不需要體現lib,如libpng應寫為MODULE_NAME := png,而不應寫為MODULE_NAME := libpng,避免生成的靜態庫文件名為liblibpng.a。
? LOCAL_INCLUDE:編譯需要用到的頭文件集合。
? LOCAL_SRCS:本模塊需要參與編譯的所有除頭文件以外的源文件。
? LOCAL_EXT_FLAG:本模塊的編譯參數集合(非必須)。
? CURL_DEFS:本模塊編譯需要用到的宏定義集合(非必須)。
? 如需縮進,統一縮進四個空格,注意不得使用tab鍵。
上級目錄中的Makefile
該文件用于調用下一級子目錄中的Makefile,components/utility/Makefile文件內容如下:
include $(LITEOSTOPDIR)/config.mk MODULE_$(LOSCFG_COMPONENTS_BIDIREFERENCE) += bidireference MODULE_$(LOSCFG_COMPONENTS_CURL) += curl # 本次新增的內容 MODULE_$(LOSCFG_COMPONENTS_FREETYPE) += freetype MODULE_$(LOSCFG_COMPONENTS_ICONV) += iconv MODULE_$(LOSCFG_COMPONENTS_INIPARSER) += iniparser MODULE_$(LOSCFG_COMPONENTS_JSON_C) += json-c MODULE_$(LOSCFG_COMPONENTS_LIBXML2) += libxml2 include $(MODULE)
LOSCFG_COMPONENTS_CURL是組件Kconfig文件中的配置項,MODULE_$(LOSCFG_COMPONENTS_CURL)表示只有使能了組件后,才編譯curl組件。
組件demo
原則上每個組件都應提供一個參考demo,demo必須自研,禁止直接拷貝網絡上的代碼。每個demo只允許提供一個對外接口,統一在demo_entry.c文件中進行調用。
bsp.mk
Huawei LiteOS采用組件化編譯框架,每個組件或demo編譯完成后會在out目錄下生成相應的靜態庫文件。因Windows平臺無法自動鏈接靜態庫文件,因此需要在bsp.mk文件中進行手動鏈接。如新增鏈接curl組件和demo的靜態庫文件:
ifneq ($(OS), Linux) ifeq ($(LOSCFG_COMPONENTS_CURL), y) LITEOS_BASELIB += -lcurl # curl是組件的模塊名 endif ifeq ($(LOSCFG_DEMOS_CURL), y) LITEOS_BASELIB += -lcurl_demo # curl_demo是組件demo的模塊名 endif endif
demo_entry.c
所有demo的入口。demo完成后,統一在該文件的DemoEntry函數中調用。
#ifdef LOSCFG_DEMOS_CURL #include "curl_demo.h" #endif VOID DemoEntry(VOID) { #ifdef LOSCFG_DEMOS_CURL CurlDemoTask(); #endif }
注意:必須以#include頭文件的方式調用函數,禁止使用extern的方式。
在線組件下載流程
Linux平臺
下載LiteOS代碼倉。在Huawei LiteOS源碼根目錄下執行make menuconfig命令后會自動調用download.sh腳本。該腳本讀取online_components文件的內容以獲取組件下載信息,判斷組件是否被使能。如果組件已經使能,繼續判斷組件源碼是否存在。如不存在則下載組件源碼、origin.patch、src.sha256和patch.sha256,通過.sha256文件判斷下載的組件源碼及origin.patch文件是否正確。正確則打入patch,完成在線組件的下載流程。
注意:如果想要重新下載組件源碼和補丁,需要在本地刪除已有源碼和補丁文件。同時,在腳本運行過程中,如果被外部信號強制中斷,如ctrlz、ctrlc等,可能會導致下載流程失敗,請及時清理此次下載中殘留文件。
Windows平臺
在HUAWEI LiteOS Studio開發工具中,完成工程配置——>組件配置后,會自動調用download.sh文件,其余邏輯與Linux平臺一致。
測試組件
完成組件開發的全部工作后,需要對組件進行測試,確保在線組件下載流程執行通過。
提交代碼
組件測試通過后,即可將代碼提交到Huawei LiteOS的各代碼倉,代碼提交的要求如下:
? 在線組件不需要提交組件源碼。
? origin.patch、src.sha256和patch.sha256提交到LiteOS_Components倉庫下的對應目錄(目錄結構需與開發時的目錄結構保持一致。例如curl的這些文件,應置于該倉庫的components/utility/curl目錄下)。對于離線組件,不需要src.sha256文件。
? 其余文件提交到LiteOS倉庫。
須知:代碼提交流程請參考LiteOS 代碼&文檔貢獻指南。
https://gitee.com/LiteOS/LiteOS/blob/master/doc/LiteOS_Contribute_Guide.md
結語
未來我們還會持續新增更多組件、開發板、架構、特性等。
感謝您的閱讀,有任何問題、建議,都可以留言給我們,讓我們一起進步:
https://gitee.com/LiteOS/LiteOS/issues
為了更容易找到“LiteOS”代碼倉,建議訪問https://gitee.com/LiteOS/LiteOS,關注“ Watch”、“Star”、并“Fork”到自己賬號下,如下圖。
-end-
IoT 輕量級操作系統 LiteOS
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。