
文章目錄
- 1、獲取原始碼
- 2、什么是LiteOS
- 3、LiteOS的目錄介紹
- 4、LiteOS 中Make體系
- 5、LiteOS 中Kconfig的配置
- 5.1、頂層Kconfig
- 5.2、具體板級的deconfig檔案
- 6、編譯
- 7、頂層目錄下的config.mk檔案主要完成如下功能的配置:
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我們可以看見內核所以支持的功能,類似說明書一樣,等待你去打開功能,
例如:
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適配的開發板: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
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整個代碼框架有了整體的印象,后面我們就會深入到具體的驅動模塊及子系統中看看,它是如何實作的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/35856.html
標籤:其他
上一篇:【STM32】內部溫度傳感器示例
