一分鍾帶你了解Huawei LiteOS組件開發指南


摘要:本文將基於Huawei LiteOS系統,從組件定義開始帶你走進組件開發指南。

本文分享自華為雲社區《一分鍾帶你了解Huawei LiteOS之組件開發指南》,作者: Lionlace。

在開發工作過程中,面對龐大的代碼量,你是否因擔心出現牽一發而動全身的情況而不知從何下手?

今天為大家帶來開發者效率提升利器:組件

本文將基於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”到自己賬號下,如下圖。

 

 

點擊關注,第一時間了解華為雲新鮮技術~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM