[HarmonyOS][鴻蒙專欄開篇]快速入門OpenHarmony的LiteOS微核心

雪松研究所發表於2020-09-13

在這裡插入圖片描述

1、獲取原始碼

OpenHarmonyHarmonyOS的開源版,由華為捐贈給開放原子開源基金會(OpenAtom Foundation)開源。第一個開源版本支援在128KB~128MB裝置上執行,歡迎參加開源社群一起持續演進。

程式碼倉庫地址1:https://codechina.csdn.net/openharmony
在這裡插入圖片描述

程式碼倉庫地址2:https://openharmony.gitee.com
在這裡插入圖片描述

本專欄主要分析OpenHarmony核心的相關程式碼:
Cortex-A系列處理器核心:kernel_liteos_a
Cortex-M系列處理器核心:kernel_liteos_m

2、什麼是LiteOS

Huawei LiteOS是華為針對物聯網領域推出的輕量級物聯網作業系統,是華為物聯網戰略的重要組成部分,具備輕量級、低功耗、互聯互通、元件豐富、快速開發等關鍵能力,基於物聯網領域業務特徵打造領域性技術棧,為開發者提供 “一站式” 完整軟體平臺,有效降低開發門檻、縮短開發週期,可廣泛應用於可穿戴裝置、智慧家居、車聯網、LPWA等領域。

Huawei LiteOS微核心在OpenHarmony原始碼中所處的位置:
在這裡插入圖片描述

3、LiteOS的目錄介紹

我們以Cortex-A系列處理器核心為例:kernel_liteos_a
在這裡插入圖片描述
可以看到有12目錄、4個檔案。

  • 目錄的作用
名稱描述
apps使用者態的init和shell應用程式。
arch體系架構的目錄,如arm等。
bsdfreebsd相關的驅動和適配層模組程式碼引入,例如USB等。
compat核心posix介面的相容。
fs檔案系統模組,主要來源於NuttX開源專案。
kernel程式、記憶體、IPC等模組。
lib核心的lib庫。
net網路模組,主要來源於lwip開源專案。
platform支援不同的晶片平臺程式碼,如Hi3516DV300等。
security安全特性相關的程式碼,包括程式許可權管理和虛擬id對映管理。
syscall系統呼叫。
tools構建工具及相關配置和程式碼。
  • 檔案的作用
名稱描述
Makefile儲存了原始碼檔案構建目標檔案的規則,具體是否按著規則去執行還要看配置變數。
Kconfig配置變數
config.mk主要進行編譯選項的設定、編譯工具的定義、編譯時包含的檔案、編譯的連結地址。
build.sh編譯指令碼

4、LiteOS 中Make體系

頂層 Makefile 在編譯時是入口點,從整體上組織所有的 Makefile 檔案,並定義終極目標,在這裡還定義了與平臺無關的很多核心變數與一些很重要的 make目標。頂層 Makefile 位於核心原始碼的根目錄,下面我們分析頂層 Makefile 的主要工作。

使用者在核心目錄中鍵入make menuconfig之後 ,工作流程如下 :

  1. 頂 層 Makefile呼叫解析頂層Kconfig檔案,獲得待配置條目;
  2. 判斷是否有已配置好的.config檔案,如果有則匯入;
  3. 使用者在配置好後,將配置結果存入配置檔案。

Linux類似LiteOSMake體系頂層 makefile會通過讀取配置檔案,遞迴編譯核心程式碼樹的相關目錄。
/kernel_liteos_a/Makefile

##### make menuconfig #####
export CONFIG_=LOSCFG_
MENUCONFIG_PATH = $(LITEOSTOPDIR)/tools/menuconfig
KCONFIG_FILE_PATH = $(LITEOSTOPDIR)/Kconfig

5、LiteOS 中Kconfig的配置

無論在什麼平臺上,軟體配置是使用者接觸程式的第一步,我們這裡是核心配置,那麼入口就是Kconfig檔案。

5.1、頂層Kconfig

通過頂層的Kconfig我們可以看見核心所以支援的功能,類似說明書一樣,等待你去開啟功能。
例如:

kernel_liteos_a/Kconfig

//包含其他的Kconfig
source "../../vendor/hisi/hi35xx/platform/hiedmac/Kconfig"
source "../../kernel/liteos_a/bsd/dev/usb/Kconfig"
source "../../drivers/hdf/lite/Kconfig"

config USB_DEBUG
    bool "Enable USB Debug"
    default n
    depends on SHELL && DRIVERS_USB && DEBUG_VERSION
    help
      Answer Y to enable LiteOS support usb debug.
      use shell command to open the specified debug level print.
      
config MEM_DEBUG
    bool "Enable MEM Debug"
    default n
    depends on DEBUG_VERSION
    help
      Answer Y to enable LiteOS support mem debug.

通過source載入其他的Kconfig例如載入USB相關配置

kernel_liteos_a/bsd/dev/usb/Kconfig:

config DRIVERS_USB
    bool "Enable USB"
    default y
    depends on DRIVERS && COMPAT_BSD
    help
      Answer Y to enable LiteOS support usb.

config DRIVERS_USB_HOST_DRIVER
    bool "Enable USB HCD"
    default y
    depends on DRIVERS_USB && DRIVERS
    help
      Answer Y to enable LiteOS to support usb host controller driver.
...

5.2、具體板級的deconfig檔案

可配置說明書有了,我們也不能每次都重新配置一遍把,這個時候就有板級預設配置。

目前LiteOS中Cortex-A系列處理器核心為例:kernel_liteos_a適配的開發板:hi3518hi3516,並提供了已經配置好的.config,下來我們以hi3518為例子對其進行分析。
原始檔為:tools/build/config/hi3516dv300_release.config
在這裡插入圖片描述
通過該檔案我們可以知道核心配置包括了些什麼?
CPU、開發板、檔案系統、驅動程式和除錯等大量的待配置資訊。

# Automatically generated file; DO NOT EDIT.
# Huawei LiteOS Configuration

# Compiler
...
# Platform
...
# Extra Configurations
...
# Kernel
...
# Lib
...
# Compat
...
# FileSystem
...
# Net
...
# Debug
...
# Driver
LOSCFG_DRIVERS=y
LOSCFG_DRIVERS_USB=y
LOSCFG_DRIVERS_USB_HOST_DRIVER=y
# LOSCFG_DRIVERS_USB_HOST_EHCI is not set
LOSCFG_DRIVERS_USB_HOST_XHCI=y
LOSCFG_DRIVERS_USB_DEVICE_CLASS_DRIVERS=y

後面我們就將以LOSCFG_DRIVERS_USB為切入點分析原始碼,但在這之前,我們配置有了,下來就是編譯了。

6、編譯

kernel_liteos_a/bsd/dev/usb/Makefile
最後編譯時候,會根據.config編譯相關的原始碼:

例如下面這些程式碼都將會進行編譯,生成了目標檔案usb_bask

include $(LITEOSTOPDIR)/config.mk

MODULE_NAME := usb_base

ifeq ($(LOSCFG_DRIVERS_USB), y)
LOCAL_SRCS += $(CORE_SRC)/usb_dynamic.c  \
              $(CORE_SRC)/usb_parse.c  \
              $(CORE_SRC)/usb_error.c  \
              $(CORE_SRC)/usb_handle_request.c  \
              $(CORE_SRC)/usb_util.c  \
              $(CORE_SRC)/usb_lookup.c  \
              $(CONTROLLER_HOST_SRC)/usb_controller.c  \
              $(QUIRK_SRC)/usb_quirk.c \
              $(CORE_SRC)/usb_device.c  \
              $(CORE_SRC)/usb_process.c  \
              $(CORE_SRC)/usb_hub.c  \
              $(CORE_SRC)/usb_request.c  \
              $(CORE_SRC)/usb_transfer.c  \
              $(CORE_SRC)/usb_dev.c  \
              $(CORE_SRC)/usb_mbuf.c  \
              $(CORE_SRC)/usb_generic.c \
              $(CORE_SRC)/usb_if.c
endif

這裡生成目標檔案是如何連結的核心中,這個時候我們就要開始分析config.mk的作用了:

7、頂層目錄下的config.mk檔案主要完成如下功能的配置:

1、確定生成可執行檔案過程中需要的各種工具,如編譯器(arm-linux-gcc)、聯結器(arm-linux-ld)、反彙編器(arm-linux-objdump
2、確定CPU、板相關的配置檔案,存在於各個目錄下的config.mk
3、確定編譯、連結、轉換等過程的操作選項
4、根據步驟3確定的編譯連線選項生成需要的檔案
kernel_liteos_a/Makefile:

$(LD) $(LITEOS_LDFLAGS) $(LITEOS_TABLES_LDFLAGS) $(LITEOS_DYNLDFLAGS) -Map=$(OUT)/$@.map -o $(OUT)/$@ --start-group $(LITEOS_LIBDEP) --end-group

kernel_liteos_a\config.mk:

############### this is a makefile that you can config it ###############
-include $(LITEOSTOPDIR)/tools/build/mk/los_config.mk
...
LITEOS_LIBDEP   := $(LITEOS_BASELIB)

目錄:kernel_liteos_a\tools\build\mk\los_config.mk

############################# Platform Option Begin#################################
include $(LITEOSTOPDIR)/platform/bsp.mk
...
ifeq ($(LOSCFG_DRIVERS_USB), y)
    LITEOS_BASELIB  += -lusb_base
    LIB_SUBDIRS     += $(LITEOSTOPDIR)/bsd/dev/usb
    LITEOS_USB_INCLUDE += -I $(LITEOSTOPDIR)/bsd/dev/usb
ifeq ($(LOSCFG_USB_DEBUG), y)
    LITEOS_CMACRO   += -DLOSCFG_USB_DEBUG
endif
endif
...

看到這裡,我相信大家對kernel_liteos_a整個程式碼框架有了整體的印象,後面我們就會深入到具體的驅動模組及子系統中看看,它是如何實現的。

我正在參加 CSDN 的鴻蒙技術徵文活動,給我點贊支援,感謝。

相關文章