鸿蒙来啦!快速入门OpenHarmony的LiteOS微内核,你不看看吗?,2024年最新HarmonyOS鸿蒙面试题handler

75 阅读3分钟

| 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/menuconfigKCONFIGFILEPATH=(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 [图片上传失败...(image-5e5f6e-1600494723897)]

通过该文件我们可以知道内核配置包括了些什么? 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 ((LOSCFGDRIVERSUSB),y)LOCALSRCS+=(LOSCFG_DRIVERS_USB), y) LOCAL_SRCS += (CORE_SRC)/usb_dynamic.c
(CORESRC)/usbparse.c (CORE_SRC)/usb_parse.c \ (CORE_SRC)/usb_error.c
(CORESRC)/usbhandlerequest.c (CORE_SRC)/usb_handle_request.c \ (CORE_SRC)/usb_util.c
(CORESRC)/usblookup.c (CORE_SRC)/usb_lookup.c \ (CONTROLLER_HOST_SRC)/usb_controller.c
(QUIRKSRC)/usbquirk.c (QUIRK_SRC)/usb_quirk.c \ (CORE_SRC)/usb_device.c
(CORESRC)/usbprocess.c (CORE_SRC)/usb_process.c \ (CORE_SRC)/usb_hub.c
(CORESRC)/usbrequest.c (CORE_SRC)/usb_request.c \ (CORE_SRC)/usb_transfer.c
(CORESRC)/usbdev.c (CORE_SRC)/usb_dev.c \ (CORE_SRC)/usb_mbuf.c
(CORESRC)/usbgeneric.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)(LD) (LITEOS_LDFLAGS) (LITEOSTABLESLDFLAGS)(LITEOS_TABLES_LDFLAGS) (LITEOS_DYNLDFLAGS) -Map=(OUT)/(OUT)/@.map -o (OUT)/(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/losconfig.mk...LITEOSLIBDEP:=(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((LITEOSTOPDIR)/platform/bsp.mk ... ifeq ((LOSCFG_DRIVERS_USB), y) LITEOS_BASELIB += -lusb_base LIB_SUBDIRS += (LITEOSTOPDIR)/bsd/dev/usbLITEOSUSBINCLUDE+=I(LITEOSTOPDIR)/bsd/dev/usb LITEOS_USB_INCLUDE += -I (LITEOSTOPDIR)/bsd/dev/usb ifeq ($(LOSCFG_USB_DEBUG), y) LITEOS_CMACRO += -DLOSCFG_USB_DEBUG endif

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取