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

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

本文原文链接:https://xuesong.blog.csdn.net/article/details/108560890?spm=1001.2014.3001.5502


1、获取源码


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

代码仓库地址1:https://codechina.csdn.net/openharmony

1675866381805.jpg

代码仓库地址2:https://openharmony.gitee.com

1675866386501.jpg本专栏主要分析OpenHarmony内核的相关代码:

Cortex-A系列处理器内核:kernel_liteos_a

Cortex-M系列处理器内核:kernel_liteos_m


2、什么是LiteOS


Huawei LiteOS是华为针对物联网领域推出的轻量级物联网操作系统,是华为物联网战略的重要组成部分,具备轻量级、低功耗、互联互通、组件丰富、快速开发等关键能力,基于物联网领域业务特征打造领域性技术栈,为开发者提供 “一站式” 完整软件平台,有效降低开发门槛、缩短开发周期,可广泛应用于可穿戴设备、智能家居、车联网、LPWA等领域。

Huawei LiteOS微内核在OpenHarmony源码中所处的位置:

1675866421000.jpg

3、LiteOS的目录介绍


我们以Cortex-A系列处理器内核为例:kernel_liteos_a

1675866434595.jpg

可以看到有12目录、4个文件。

  • 目录的作用
名称 描述
apps 用户态的init和shell应用程序。
arch 体系架构的目录,如arm等。
bsd freebsd相关的驱动和适配层模块代码引入,例如USB等。
compat 内核posix接口的兼容。
fs 文件系统模块,主要来源于NuttX开源项目。
kernel 进程、内存、IPC等模块。
lib 内核的lib库。
net 网络模块,主要来源于lwip开源项目。
platform 支持不同的芯片平台代码,如Hi3516DV300等。
security 安全特性相关的代码,包括进程权限管理和虚拟id映射管理。
syscall 系统调用。
tools 构建工具及相关配置和代码。


  • 文件的作用
名称 描述
Makefile 存储了源码文件构建目标文件的规则,具体是否按着规则去执行还要看配置变量。
Kconfig 配置变量
config.mk 主要进行编译选项的设置、编译工具的定义、编译时包含的文件、编译的链接地址。
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/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

1675866615645.jpg

通过该文件我们可以知道内核配置包括了些什么?

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 ($(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:

$(LD) $(LITEOS_LDFLAGS) $(LITEOS_TABLES_LDFLAGS) $(LITEOS_DYNLDFLAGS) -Map=$(OUT)/$@.map -o $(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/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 ($(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整个代码框架有了整体的印象,后面我们就会深入到具体的驱动模块及子系统中看看,它是如何实现的。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
18天前
|
JavaScript 安全 前端开发
【HarmonyOS开发】ArkTS基础语法及使用(鸿蒙开发基础教程)
【HarmonyOS开发】ArkTS基础语法及使用(鸿蒙开发基础教程)
252 4
|
2月前
|
存储 JavaScript 开发者
探索鸿蒙新世界:ArkUI框架实战指南,解锁HarmonyOS应用UI设计的无限可能!
【10月更文挑战第19天】ArkUI框架是华为鸿蒙系统中用于开发用户界面的核心工具,支持ArkTS和eTS两种开发语言。本文介绍了ArkUI的基本概念、组件使用、布局管理和状态管理,通过示例代码帮助开发者轻松构建美观、高效的跨设备UI。
133 3
|
2月前
|
Android开发 iOS开发 容器
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
|
2月前
|
存储 数据管理 调度
HarmonyOS架构理解:揭开鸿蒙系统的神秘面纱
【10月更文挑战第21天】华为的鸿蒙系统(HarmonyOS)以其独特的分布式架构备受关注。该架构包括分布式软总线、分布式数据管理和分布式任务调度。分布式软总线实现设备间的无缝连接;分布式数据管理支持跨设备数据共享;分布式任务调度则实现跨设备任务协同。这些特性为开发者提供了强大的工具,助力智能设备的未来发展。
131 1
|
2月前
|
JavaScript API 开发者
掌握ArkTS,打造HarmonyOS应用新视界:从“Hello World”到状态管理,揭秘鸿蒙UI开发的高效秘诀
【10月更文挑战第19天】ArkTS(ArkUI TypeScript)是华为鸿蒙系统中用于开发用户界面的声明式编程语言,结合了TypeScript和HarmonyOS的UI框架。本文介绍ArkTS的基本语法,包括组件结构、模板和脚本部分,并通过“Hello World”和计数器示例展示其使用方法。
78 1
|
2月前
|
数据可视化 JavaScript API
HarmonyOS NEXT原生重榜发布-安利一款鸿蒙可视化代码生成器
鸿蒙低代码可视化开发平台是基于华为鸿蒙操作系统构建的创新开发环境,旨在通过简化开发流程、降低技术门槛,加速应用从设计到上线的全过程。它融合了低代码开发的核心理念与鸿蒙系统的技术优势,为开发者提供了一条高效、便捷的应用开发之路。
63 2
|
2月前
|
安全 物联网 大数据
基于开元鸿蒙(OpenHarmony)的【智能药房与药品管理综合应用系统
基于开元鸿蒙(OpenHarmony)的【智能药房与药品管理综合应用系统
94 8
|
2月前
|
传感器 监控 算法
基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
125 6
|
2月前
|
传感器 人工智能 监控
【基于开源鸿蒙(OpenHarmony)的智慧农业综合应用系统】
【基于开源鸿蒙(OpenHarmony)的智慧农业综合应用系统】
154 6
|
2月前
|
搜索推荐 物联网 开发工具
基于OpenHarmony(开源鸿蒙)的智慧医疗综合应用系统
基于OpenHarmony(开源鸿蒙)的智慧医疗综合应用系统
114 5