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

阅读量0
0
2






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)
  1. ##### make menuconfig #####
  2. export CONFIG_=LOSCFG_
  3. MENUCONFIG_PATH = $(LITEOSTOPDIR)/tools/menuconfig
  4. 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)
  1. //包含其他的Kconfig
  2. source "../../vendor/hisi/hi35xx/platform/hiedmac/Kconfig"
  3. source "../../kernel/liteos_a/bsd/dev/u***/Kconfig"
  4. source "../../drivers/hdf/lite/Kconfig"

  5. config USB_DEBUG
  6.     bool "Enable USB Debug"
  7.     default n
  8.     depends on SHELL && DRIVERS_USB && DEBUG_VERSION
  9.     help
  10.       Answer Y to enable LiteOS support u*** debug.
  11.       use shell command to open the specified debug level print.
  12.       
  13. config MEM_DEBUG
  14.     bool "Enable MEM Debug"
  15.     default n
  16.     depends on DEBUG_VERSION
  17.     help
  18.       Answer Y to enable LiteOS support mem debug.
复制代码
通过`source`加载其他的`Kconfig`例如加载`USB`相关配置
[kernel_liteos_a/bsd/dev/u***/Kconfig](https://openharmony.gitee.com/openharmony/kernel_liteos_a/blob/master/bsd/dev/u***/Kconfig):
  1. config DRIVERS_USB
  2.     bool "Enable USB"
  3.     default y
  4.     depends on DRIVERS && COMPAT_BSD
  5.     help
  6.       Answer Y to enable LiteOS support u***.

  7. config DRIVERS_USB_HOST_DRIVER
  8.     bool "Enable USB HCD"
  9.     default y
  10.     depends on DRIVERS_USB && DRIVERS
  11.     help
  12.       Answer Y to enable LiteOS to support u*** 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`、开发板、文件系统、驱动程序和调试等大量的待配置信息。
  1. # Automatically generated file; DO NOT EDIT.
  2. # Huawei LiteOS Configuration

  3. # Compiler
  4. ...
  5. # Platform
  6. ...
  7. # Extra Configurations
  8. ...
  9. # Kernel
  10. ...
  11. # Lib
  12. ...
  13. # Compat
  14. ...
  15. # FileSystem
  16. ...
  17. # Net
  18. ...
  19. # Debug
  20. ...
  21. # Driver
  22. LOSCFG_DRIVERS=y
  23. LOSCFG_DRIVERS_USB=y
  24. LOSCFG_DRIVERS_USB_HOST_DRIVER=y
  25. # LOSCFG_DRIVERS_USB_HOST_EHCI is not set
  26. LOSCFG_DRIVERS_USB_HOST_XHCI=y
  27. LOSCFG_DRIVERS_USB_DEVICE_CLASS_DRIVERS=y
复制代码



后面我们就将以`LOSCFG_DRIVERS_USB`为切入点分析源码,但在这之前,我们配置有了,下来就是编译了。

3、编译
[kernel_liteos_a/bsd/dev/u***/Makefile](https://openharmony.gitee.com/openharmony/kernel_liteos_a/blob/master/bsd/dev/u***/Makefile):
最后编译时候,会根据`.config`编译相关的源代码:
例如下面这些代码都将会进行编译,生成了目标文件`u***_bask`
  1. include $(LITEOSTOPDIR)/config.mk

  2. MODULE_NAME := u***_base

  3. ifeq ($(LOSCFG_DRIVERS_USB), y)
  4. LOCAL_SRCS += $(CORE_SRC)/u***_dynamic.c  
  5.               $(CORE_SRC)/u***_parse.c  
  6.               $(CORE_SRC)/u***_error.c  
  7.               $(CORE_SRC)/u***_handle_request.c  
  8.               $(CORE_SRC)/u***_util.c  
  9.               $(CORE_SRC)/u***_lookup.c  
  10.               $(CONTROLLER_HOST_SRC)/u***_controller.c  
  11.               $(QUIRK_SRC)/u***_quirk.c
  12.               $(CORE_SRC)/u***_device.c  
  13.               $(CORE_SRC)/u***_process.c  
  14.               $(CORE_SRC)/u***_hub.c  
  15.               $(CORE_SRC)/u***_request.c  
  16.               $(CORE_SRC)/u***_transfer.c  
  17.               $(CORE_SRC)/u***_dev.c  
  18.               $(CORE_SRC)/u***_mbuf.c  
  19.               $(CORE_SRC)/u***_generic.c
  20.               $(CORE_SRC)/u***_if.c
  21. 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):
  1. $(LD) $(LITEOS_LDFLAGS) $(LITEOS_TABLES_LDFLAGS) $(LITEOS_DYNLDFLAGS) -Map=$(OUT)/$@.map -o $(OUT)/$@ --start-group $(LITEOS_LIBDEP) --end-group
复制代码

[kernel_liteos_aconfig.mk](https://openharmony.gitee.com/openharmony/kernel_liteos_a/blob/master/config.mk):
  1. ############### this is a makefile that you can config it ###############
  2. -include $(LITEOSTOPDIR)/tools/build/mk/los_config.mk
  3. ...
  4. LITEOS_LIBDEP   := $(LITEOS_BASELIB)
复制代码

目录:[kernel_liteos_atoolsbuildmklos_config.mk](https://openharmony.gitee.com/openharmony/kernel_liteos_a/blob/master/tools/build/mk/los_config.mk)

  1. ############################# Platform Option Begin#################################
  2. include $(LITEOSTOPDIR)/platform/bsp.mk
  3. ...
  4. ifeq ($(LOSCFG_DRIVERS_USB), y)
  5.     LITEOS_BASELIB  += -lu***_base
  6.     LIB_SUBDIRS     += $(LITEOSTOPDIR)/bsd/dev/u***
  7.     LITEOS_USB_INCLUDE += -I $(LITEOSTOPDIR)/bsd/dev/u***
  8. ifeq ($(LOSCFG_USB_DEBUG), y)
  9.     LITEOS_CMACRO   += -DLOSCFG_USB_DEBUG
  10. endif
  11. endif
  12. ...
复制代码

看到这里,我相信大家对[kernel_liteos_a](https://openharmony.gitee.com/openharmony/kernel_liteos_a)整个代码框架有了整体的印象,后面我们就会深入到具体的驱动模块及子系统中看看,它是如何实现的。


回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友