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

相关实践学习
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
10月前
|
开发者 容器
鸿蒙HarmonyOS - SideBarContainer 组件自学指南
`SideBarContainer` 是 HarmonyOS 提供的双区域容器组件,适用于「左侧导航 + 右侧内容」布局,如后台管理界面、文件管理器等。它支持三种布局类型:Embed(并排)、Overlay(悬浮)和 Auto(自动切换),并提供折叠、拖拽、控制按钮等功能。本文通过示例代码详解其用法,包括子组件限制、显示模式控制、尺寸参数设置、控制按钮与分割线样式定制,以及常见问题解答。掌握该组件可高效构建复杂页面结构,推荐从 Embed 模式入手逐步进阶。
279 9
鸿蒙HarmonyOS - SideBarContainer 组件自学指南
|
6月前
|
存储 缓存 5G
鸿蒙 HarmonyOS NEXT端云一体化开发-云存储篇
本文介绍用户登录后获取昵称、头像的方法,包括通过云端API和AppStorage两种方式,并实现上传头像至云存储及更新用户信息。同时解决图片缓存问题,添加上传进度提示,支持自动登录判断,提升用户体验。
266 1
|
6月前
|
存储 负载均衡 数据库
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
本文介绍基于华为AGC的端云一体化开发流程,涵盖项目创建、云函数开通、应用配置及DevEco集成。重点讲解云函数的编写、部署、调用与传参,并涉及环境变量设置、负载均衡、重试机制与熔断策略等高阶特性,助力开发者高效构建稳定云端服务。
630 1
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
|
6月前
|
存储 JSON 数据建模
鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇
云数据库采用存储区、对象类型、对象三级结构,支持灵活的数据建模与权限管理,可通过AGC平台或本地项目初始化,实现数据的增删改查及端侧高效调用。
296 1
|
6月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
487 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
6月前
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段三
本文介绍了UI开发中的样式复用与组件构建技术,涵盖@Extend、@Styles和@Builder的使用方法,并通过Swiper轮播、Scroll滚动、Tabs导航等常用组件实现典型界面效果,结合生肖抽卡、小米轮播、回顶按钮等案例,展示实际应用技巧。
177 1
|
6月前
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段二
本文介绍鸿蒙应用界面开发中的弹性布局(Flex)、绝对定位、层叠布局及ArkTS语法进阶,涵盖字符串拼接、类型转换、数组操作、条件与循环语句,并结合B站视频卡、支付宝首页等案例,深入讲解点击事件、状态管理与界面交互功能。
387 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段二
|
9月前
|
测试技术 开发工具 开发者
HarmonyOS Next快速入门:了解项目工程目录结构
本教程旨在帮助开发者快速上手HarmonyOS应用开发,涵盖从环境搭建到工程创建的全流程。通过DevEco Studio创建首个项目时,选择“Application”与“Empty Ability”,配置项目名称、包名、保存路径等关键信息后完成创建。代码示例展示了基本UI组件的使用,如`Hello World`文本显示与交互逻辑。此外,详细解析了工程目录结构,包括AppScope自动生成规则、主模块(entry)的功能划分、依赖配置文件(oh-package.json5)的作用,以及app.json5中包名、版本号等全局配置项的含义。
412 5
|
9月前
|
传感器 移动开发 API
【HarmonyOS 5】鸿蒙中的UIAbility详解(一)
HarmonyOS 5 中的 UIAbility 是应用框架的核心组件,负责管理用户界面生命周期和上下文信息。它类似于 Android 的 Activity 或 iOS 的 UIViewController,主要用于与用户交互。本文详细解析了 UIAbility 的基本概念、启动页面设置、上下文获取、生命周期管理及常用操作(如终止实例、跨 Ability 信息传递)。
843 9
|
9月前
|
开发者 UED
HarmonyOS Next快速入门:通用属性
本教程以《HarmonyOS Next快速入门》为基础,涵盖应用开发核心技能。通过代码实例讲解尺寸、位置、布局约束、Flex布局、边框、背景及图像效果等属性设置方法。如`.width()`调整宽度,`.align()`设定对齐方式,`.border()`配置边框样式,以及模糊、阴影等视觉效果的实现。结合实际案例,帮助开发者掌握HarmonyOS组件属性的灵活运用,提升开发效率与用户体验。适合初学者及进阶开发者学习。
253 0

热门文章

最新文章