关于物联网:一分钟带你了解Huawei-LiteOS组件开发指南

39次阅读

共计 9166 个字符,预计需要花费 23 分钟才能阅读完成。

摘要: 本文将基于 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/…,下载失去的文件名为 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/Lite…

结语

将来咱们还会继续新增更多组件、开发板、架构、个性等。

感谢您的浏览,有任何问题、倡议,都能够留言给咱们,让咱们一起提高:

https://gitee.com/LiteOS/Lite…

为了更容易找到“LiteOS”代码仓,倡议拜访 https://gitee.com/LiteOS/LiteOS,关注“Watch”、点赞“Star”、并“Fork”到本人账号下,如下图。

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0