电子产业一站式赋能平台

PCB联盟网

搜索
查看: 2309|回复: 1
收起左侧

[HarmonyOS][鸿蒙专栏开篇]快速入门OpenHarmony的LiteOS编译体系介绍

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 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)适配的开发板:`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`、开发板、文件系统、驱动程序和调试等大量的待配置信息。

  • # 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):

最后编译时候,会根据`.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、确定生成可执行文件过程中需要的各种工具,如编译器(`arm-linux-gcc`)、连接器(`arm-linux-ld`)、反汇编器(`arm-linux-objdump`等

2、确定`CPU`、板相关的配置文件,存在于各个目录下的`config.mk`

3、确定编译、链接、转换等过程的操作选项

4、根据步骤`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)整个代码框架有了整体的印象,后面我们就会深入到具体的驱动模块及子系统中看看,它是如何实现的。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表