[HarmonyOS][鸿蒙专栏开篇]快速入门OpenHarmony的LiteOS微内核

内核笔记
发布于 2020-9-13 16:57
浏览
5收藏

[HarmonyOS][鸿蒙专栏开篇]快速入门OpenHarmony的LiteOS微内核-鸿蒙开发者社区

# 1、获取源码

`OpenHarmony`是`HarmonyOS`的开源版,由华为捐赠给开放原子开源基金会(`OpenAtom Foundation`)开源。第一个开源版本支持在`128KB~128MB`设备上运行,欢迎参加开源社区一起持续演进。

代码仓库地址:[https://openharmony.gitee.com](https://openharmony.gitee.com)

本专栏主要分析`OpenHarmony`内核的相关代码:
Cortex-A系列处理器内核:[kernel_liteos_a](https://openharmony.gitee.com/openharmony/kernel_liteos_a)
Cortex-M系列处理器内核:[kernel_liteos_m](https://gitee.com/openharmony/kernel_liteos_m)


# 2、什么是LiteOS
`Huawei LiteOS`是华为针对物联网领域推出的轻量级物联网操作系统,是华为物联网战略的重要组成部分,具备轻量级、低功耗、互联互通、组件丰富、快速开发等关键能力,基于物联网领域业务特征打造领域性技术栈,为开发者提供 “一站式” 完整软件平台,有效降低开发门槛、缩短开发周期,可广泛应用于可穿戴设备、智能家居、车联网、`LPWA`等领域。
 
 `Huawei LiteOS`微内核在`OpenHarmony`源码中所处的位置:
[HarmonyOS][鸿蒙专栏开篇]快速入门OpenHarmony的LiteOS微内核-鸿蒙开发者社区

 


# 3、LiteOS的目录介绍
我们以`Cortex-A`系列处理器内核为例:[kernel_liteos_a](https://openharmony.gitee.com/openharmony/kernel_liteos_a)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200913124552569.png#pic_center)
可以看到有12目录、4个文件。

 - 文件的作用

名称 描述
Makefile  存储了源码文件构建目标文件的规则,具体是否按着规则去执行还要看配置变量。
Kconfig  配置变量
config.mk 主要进行编译选项的设置、编译工具的定义、编译时包含的文件、编译的链接地址。
build.sh 编译脚本

 

# 4、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

 

# 5、LiteOS 中Kconfig的配置
无论在什么平台上,软件配置是用户接触程序的第一步,我们这里是内核配置,那么入口就是`Kconfig`文件。

## 5.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.
...

 

 

## 5.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]
通过该文件我们可以知道内核配置包括了些什么?
`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](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`的作用了:

# 7、顶层目录下的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)整个代码框架有了整体的印象,后面我们就会深入到具体的驱动模块及子系统中看看,它是如何实现的。

2
收藏 5
回复
举报
1条回复
按时间正序
/
按时间倒序
wx5f5cc4292fefb
wx5f5cc4292fefb

谢谢资料,

南向开发起步困难一些,希望尽快迁移到更多liteos原先支持的硬件。

wifi、ble等热门芯片的内嵌系统模块也能尽快面世,让更多硬件应用开发者可以用简单串口协议就能对接到鸿蒙生态里。

回复
2020-9-17 09:39:35
回复
    相关推荐