[HarmonyOS][鴻蒙專欄開篇]快速入門OpenHarmony的LiteOS微核心
文章目錄
1、獲取原始碼
OpenHarmony
是HarmonyOS
的開源版,由華為捐贈給開放原子開源基金會(OpenAtom Foundation
)開源。第一個開源版本支援在128KB~128MB
裝置上執行,歡迎參加開源社群一起持續演進。
程式碼倉庫地址1:https://codechina.csdn.net/openharmony
程式碼倉庫地址2:https://openharmony.gitee.com
本專欄主要分析OpenHarmony
核心的相關程式碼:
Cortex-A系列處理器核心:kernel_liteos_a
Cortex-M系列處理器核心:kernel_liteos_m
2、什麼是LiteOS
Huawei LiteOS
是華為針對物聯網領域推出的輕量級物聯網作業系統,是華為物聯網戰略的重要組成部分,具備輕量級、低功耗、互聯互通、元件豐富、快速開發等關鍵能力,基於物聯網領域業務特徵打造領域性技術棧,為開發者提供 “一站式” 完整軟體平臺,有效降低開發門檻、縮短開發週期,可廣泛應用於可穿戴裝置、智慧家居、車聯網、LPWA
等領域。
Huawei LiteOS
微核心在OpenHarmony
原始碼中所處的位置:
3、LiteOS的目錄介紹
我們以Cortex-A
系列處理器核心為例:kernel_liteos_a
可以看到有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
之後 ,工作流程如下 :
- 頂 層
Makefile
呼叫解析頂層Kconfig
檔案,獲得待配置條目; - 判斷是否有已配置好的
.config
檔案,如果有則匯入; - 使用者在配置好後,將配置結果存入配置檔案。
與Linux
類似LiteOS
的Make
體系頂層 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
我們可以看見核心所以支援的功能,類似說明書一樣,等待你去開啟功能。
例如:
//包含其他的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適配的開發板: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:
最後編譯時候,會根據.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
############### 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整個程式碼框架有了整體的印象,後面我們就會深入到具體的驅動模組及子系統中看看,它是如何實現的。
我正在參加 CSDN 的鴻蒙技術徵文活動,給我點贊支援,感謝。
相關文章
- 華為鴻蒙系統HarmonyOS學習之十:鴻蒙HarmonyOS微核心技術鴻蒙
- 一、鴻蒙開發-ArkTS快速入門鴻蒙
- HarmonyOS快速開發入門
- 鴻蒙系統(OpenHarmony HarmonyOS):面向全場景的分散式作業系統鴻蒙分散式作業系統
- 鴻蒙Navigation入門使用鴻蒙Navigation
- 全網首發黑馬程式設計師鴻蒙 HarmonyOS NEXT星河版零基礎入門到實戰,零基礎也能快速入門鴻蒙開發教程程式設計師鴻蒙
- 初識鴻蒙OS,你好,HarmonyOS!鴻蒙
- 鴻蒙HarmonyOS實戰-Stage模型(開發卡片事件)鴻蒙模型事件
- HarmonyOS 鴻蒙隔離層設計鴻蒙
- 鴻蒙HarmonyOS實戰-ArkUI元件(Shape)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-ArkUI元件(Image)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-ArkUI元件(Menu)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-ArkUI元件(Navigation)鴻蒙UI元件Navigation
- 鴻蒙HarmonyOS實戰-ArkUI元件(Tabs)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-ArkUI元件(Canvas)鴻蒙UI元件Canvas
- 鴻蒙HarmonyOS實戰-ArkUI元件(Popup)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-ArkUI元件(Video)鴻蒙UI元件IDE
- 鴻蒙HarmonyOS實戰-ArkUI元件(CustomDialog)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-視窗管理鴻蒙
- 鴻蒙HarmonyOS實戰-ArkUI元件(List)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-ArkUI元件(Button)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-ArkUI元件(Progress)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-ArkUI元件(Toggle)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-ArkUI元件(Flex)鴻蒙UI元件Flex
- 鴻蒙HarmonyOS實戰-ArkUI元件(RelativeContainer)鴻蒙UI元件AI
- 鴻蒙HarmonyOS實戰-ArkUI元件(Swiper)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-ArkUI元件(Stack)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-ArkUI元件(mediaquery)鴻蒙UI元件
- 使用Taro開發鴻蒙原生應用——快速上手,鴻蒙應用開發指南鴻蒙
- 使用 Taro 開發鴻蒙原生應用 —— 快速上手,鴻蒙應用開發指南鴻蒙
- 鴻蒙HarmonyOS實戰-Stage模型(開發卡片頁面)鴻蒙模型
- HarmonyOS NEXT 5.0自定義增強版導航欄元件|鴻蒙ArkUI自定義標題欄元件鴻蒙UI
- 鴻蒙系統應用開發之入門解說鴻蒙
- 鴻蒙HarmonyOS實戰-Stage模型(UIAbility元件)鴻蒙模型UI元件
- 鴻蒙HarmonyOS實戰-Stage模型(ExtensionAbility元件)鴻蒙模型元件
- 鴻蒙HarmonyOS實戰-Stage模型(程序模型)鴻蒙模型
- 鴻蒙HarmonyOS實戰-ArkUI元件(TextInput/TextArea)鴻蒙UI元件
- 鴻蒙HarmonyOS實戰-ArkUI元件(GridRow/GridCol)鴻蒙UI元件