天天看點

一分鐘帶你了解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的共有檔案,新增元件時一般也需要修改。

一分鐘帶你了解Huawei LiteOS元件開發指南

須知:

新增元件或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檔案中的參數四的方式下載下傳源碼檔案。

源碼的更新檔檔案。該檔案采用統一命名origin.patch,不可修改。在Huawei LiteOS上開發元件,建議盡量避免對開源源碼直接修改如無法避免(例如:不修改源碼無法編譯成功,或源碼無法直接運作在Huawei LiteOS上,則需要适配),則應該将修改内容生成為更新檔檔案origin.patch,在後續使用中,采取打更新檔的方式修改源碼。打更新檔時采用patch -p1的方式,生成更新檔檔案時請注意。

origin.patch更新檔檔案的生成可參考如下方式:

• 建立a、b目錄,将沒有被修改的元件源碼拷貝到a目錄下,将修改過後的元件源碼拷貝到b目錄下,目錄結構如下:

一分鐘帶你了解Huawei LiteOS元件開發指南

• 執行如下指令

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:本子產品編譯需要用到的宏定義集合(非必須)。

上級目錄中的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”到自己賬号下,如下圖。

一分鐘帶你了解Huawei LiteOS元件開發指南

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

繼續閱讀