電子產業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 2246|回復: 1
收起左側

[HarmonyOS][鴻蒙專欄開篇]快速入門OpenHarmony的LiteOS編譯體系介紹

[復制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

積分
7472
跳轉到指定樓層
樓主
發(fā)表于 2020-9-14 21:56:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
[HarmonyOS][鴻蒙專欄開篇]快速入門OpenHarmony的LiteOS編譯體系介紹,   
本帖最后由 jf_71794629 于 2020-9-14 20:04 編輯












1、LiteOS 中Make體系

頂層 `Makefile` 在編譯時是入口點,從整體上組織所有的 `Makefile` 文件,并定義終極目標,在這里還定義了與平臺無關的很多核心變量與一些很重要的 `make`目標。頂層 `Makefile` 位于內核源碼的根目錄,下面我們分析頂層 `Makefile` 的主要工作。



用戶在內核目錄中鍵入`make menuconfig`之后 ,工作流程如下 :

1. 頂 層 `Makefile`調用解析頂層`Kconfig`文件,獲得待配置條目;

2. 判斷是否有已配置好的`.config`文件,如果有則導入;

3. 用戶在配置好后,將配置結果存入配置文件。



與`Linux`類似`LiteOS`的`Make`體系頂層 `makefile`會通過讀取配置文件,遞歸編譯內核代碼樹的相關目錄。

[/kernel_liteos_a/Makefile](https://openharmony.gitee.com/openharmony/kernel_liteos_a/blob/master/Makefile)

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

復制代碼
2、LiteOS 中Kconfig的配置

無論在什么平臺上,軟件配置是用戶接觸程序的第一步,我們這里是內核配置,那么入口就是`Kconfig`文件。

2.1、頂層Kconfig

通過頂層的`Kconfig`我們可以看見內核所以支持的功能,類似說明書一樣,等待你去打開功能。

例如:

[kernel_liteos_a/Kconfig](https://openharmony.gitee.com/openharmony/kernel_liteos_a/blob/master/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](https://openharmony.gitee.com/openharmony/kernel_liteos_a/blob/master/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.

復制代碼

2.2、具體板級的deconfig文件

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



目前LiteOS中`Cortex-A`系列處理器內核為例:[kernel_liteos_a](https://openharmony.gitee.com/openharmony/kernel_liteos_a)適配的開發(fā)板:`hi3518`與`hi3516`,并提供了已經配置好的`.config`,下來我們以`hi3518`為例子對其進行分析。

源文件為:[tools/build/config/hi3516dv300_release.config](https://openharmony.gitee.com/openharmony/kernel_liteos_a/blob/master/tools/build/config/hi3516dv300_release.config)

通過該文件我們可以知道內核配置包括了些什么?

`CPU`、開發(fā)板、文件系統(tǒng)、驅動程序和調試等大量的待配置信息。

  • # 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`為切入點分析源碼,但在這之前,我們配置有了,下來就是編譯了。




3、編譯

[kernel_liteos_a/bsd/dev/usb/Makefile](https://openharmony.gitee.com/openharmony/kernel_liteos_a/blob/master/bsd/dev/usb/Makefile):

最后編譯時候,會根據(jù)`.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`的作用了。


4、頂層目錄下的config.mk文件主要完成如下功能的配置:

1、確定生成可執(zhí)行文件過程中需要的各種工具,如編譯器(`arm-linux-gcc`)、連接器(`arm-linux-ld`)、反匯編器(`arm-linux-objdump`等

2、確定`CPU`、板相關的配置文件,存在于各個目錄下的`config.mk`

3、確定編譯、鏈接、轉換等過程的操作選項

4、根據(jù)步驟`3`確定的編譯連接選項生成需要的文件

[kernel_liteos_a/Makefile](https://openharmony.gitee.com/openharmony/kernel_liteos_a/blob/master/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](https://openharmony.gitee.com/openharmony/kernel_liteos_a/blob/master/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](https://openharmony.gitee.com/openharmony/kernel_liteos_a/blob/master/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](https://openharmony.gitee.com/openharmony/kernel_liteos_a)整個代碼框架有了整體的印象,后面我們就會深入到具體的驅動模塊及子系統(tǒng)中看看,它是如何實現(xiàn)的。
回復

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表