自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OpenHarmony輕量系統(tǒng)解耦設計思想

系統(tǒng) OpenHarmony
事實上這些工程都是在vendor文件夾中的,為了驗證,我們可以在vendor中創(chuàng)建一個空的文件夾:gd,然后gd文件夾下面又創(chuàng)建了gd32f303_lianzhian文件夾。

??想了解更多內(nèi)容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??

??https://ost.51cto.com??

1、 hb編譯原理

當我們輸入hb set命令后,會提示我們選擇要編譯構(gòu)建的工程。

那么,hb 怎么知道有哪些工程可以編譯呢?

事實上這些工程都是在vendor文件夾中的,為了驗證,我們可以在vendor中創(chuàng)建一個空的文件夾:gd,然后gd文件夾下面又創(chuàng)建了gd32f303_lianzhian文件夾。

但是這里還不夠,一個標準簡單的vendor文件夾結(jié)構(gòu)如下:

其中debug.config內(nèi)容為空即可,因為它的內(nèi)容是自動生成的,后面我們配置的內(nèi)核的時候需要用到。

這幾個文件我們可以直接復制3861的過來,然后刪去我們不需要的子系統(tǒng),我們只需要保留如下即可:

config.json文件:

{
"product_name": "gd32f303_lianzhian",
"type": "mini",
"version": "3.0",
"device_company": "lianzhian",
"board": "gd32f303_lianzhian",
"kernel_type": "liteos_m",
"kernel_version": "",
"subsystems": [
{
"subsystem": "kernel",
"components": [
{ "component": "liteos_m",
"features":[
]
}
]
}
],
"third_party_dir": "",
"product_adapter_dir": ""
}

BUILD.gn文件:

group("gd32f303_lianzhian") {
}

此時,我們再去執(zhí)行hb set,就可以看到我們自己創(chuàng)建的工程了:gd32f303_lianzhian。

2、設計思想

最新的master分支的代碼設計采用Board和SoC解耦的設計思路,具體可以看這個文章:https://gitee.com/openharmony-sig/sig-content/blob/master/devboard/docs/board-soc-arch-design.md

按照硬件進行層次劃分為芯片架構(gòu)層、片上系統(tǒng)層和單板層。從下向上依次進行包含關系,例如:

(1)架構(gòu)

ARMv7E-M架構(gòu)具有ARM Cortex-M4, ARM Cortex-M7等CPU實現(xiàn)

(2)芯片系列

ARM Cortex-M4 CPU對應的SoC Family有STMicro STM32、NXP i.MX等,反過來,如圖SoC Family 2跨越CPU1和CPU2,意味著一個SoC Family可以包含多個CPU實現(xiàn),

例如STMicro STM32可以包含Cortex-M0、Cortex-M4等CPU,又例如復雜的STM32MP157 SoC包含兩個Cortex-A7 CPU核與一個Cortex-M4 CPU核,對于異構(gòu)多核SoC,需要通過OpenAMP來進行分解成多個同構(gòu)多核的部分。

(3)芯片與開發(fā)板對應關系

STM32 SoC Family有STM32F4、STM32G4等SoC Series。

STM32F4 SoC Series 有 STM32F401、STM32F429等SoC。

STM32F429 SoC 有 野火STM32F429挑戰(zhàn)者開發(fā)板、正點原子stm32f429阿波羅開發(fā)板等。如圖Board 5上面還有一個shields,意味著一個Board可以通過增加擴展板的形式來提供更強的功能。例如,單板可以利用串口通信外接Hi3861模組,以提供WLAN能力。

基于硬件結(jié)構(gòu)劃分層次圖,OpenHarmony頂層目錄結(jié)構(gòu)設計如下,

3、board配置

(1)創(chuàng)建 board文件夾

當我們輸入hb set命令后,

我們選擇 gd32f303_lianzhian 可以看到會提示報錯:

我們需要創(chuàng)建該文件夾:device/board/lianzhian

為啥是lianzhian ????

因為我們在vendor中的config.json中指定了device_company 設備廠家是lianzhian,大家可以回頭看看

標準的board文件夾目錄結(jié)構(gòu)如下:

(2) Kconfig配置文件

我們可以在kernel/liteos_m內(nèi)核目錄下執(zhí)行make menuconfig進行圖形化配置,Makefile文件會遍歷board下的所有Kconfig文件,所以我們需要添加對應的Kconfig文件。

這里內(nèi)核是分層設計的,即廠商配置和具體開發(fā)板分開,一個廠商下面可以有多個開發(fā)板。

例如我們現(xiàn)在移植的設備廠商是是lianzhian,那么lianzhian是廠商文件夾,lianzhian下面有Kconfig,主要是廠商級別的配置。

然后lianzhian下面可以有多個開發(fā)板,我們這里只寫了gd32f303_lianzhian開發(fā)板。同樣gd32f303_lianzhian文件夾下面也有Kconfig配置文件。

(3) 廠商Kconfig配置文件

我們先看下lianzhian廠商的Kconfig文件

Kconfig.liteos_m.boards 文件內(nèi)容:

orsource "*/Kconfig.liteos_m.board"

可以看到很簡單,事實上它就是簡單的把當前目錄下的所有文件夾下的Kconfig.liteos_m.board文件都導入進來。

Kconfig.liteos_m.defconfig.boards文件

orsource "*/Kconfig.liteos_m.defconfig.board"

同樣把當前目錄下的所有文件夾下的Kconfig.liteos_m.defconfig.board文件都導入進來。

(3)Kconfig.liteos_m.shields 文件

這里我們暫時不需要,可以內(nèi)容為空

(4)具體開發(fā)板的Kconfig配置文件

我們先看下gd32f303_lianzhian廠商的Kconfig文件

Kconfig.liteos_m.board文件:

需要配置選擇該單板的選項,以及它依賴的SoC

config BOARD_GD32F303_LIANZHIAN
bool "select board gd32f303 lianzhian"
depends on SOC_GD32F303 #只有當我們芯片型號選擇為GD32F303時才可見

這里是增加一個配置選項,即后面我們可以在make menuconfig中看到"select board gd32f303 lianzhian"配置項。

Kconfig.liteos_m.defconfig.board 文件:

需要配置選擇該單板后,默認定義 BOARD 的名字,該文件我們可以留空,也可以如下配置:

if BOARD_GD32F303_LIANZHIAN
config BOARD
string
default "gd32f303_lianzhian"

endif #BOARD_GD32F303_LIANZHIAN

gd32f303_lianzhian_defconfig 文件:

內(nèi)容為:

LOSCFG_BOARD_GD32F303_LIANZHIAN=y
LOSCFG_SOC_SERIES_GD32F303=y
LOSCFG_SOC_GD32F303ZET6=y

這里表示我們選中的板卡、SOC、SOC具體子型號系列等。

(5)config.gni配置文件

liteos_m文件夾下的config.gni文件是用來進行內(nèi)核配置的

該文件內(nèi)容如下:

# Copyright (C) 2020 Hisilicon (Shanghai) Technologies Co., Ltd. All rights reserved.

# 選擇內(nèi)核類型, e.g. "linux", "liteos_a", "liteos_m".
kernel_type = "liteos_m"

# 內(nèi)核版本,留空即可.
kernel_version = ""

# 芯片架構(gòu), e.g. "cortex-a7", "riscv32".
board_cpu = "cortex-m4"

# 這里一般不用謝, e.g. "armv7-a", "rv32imac".
board_arch = ""

# Toolchain name used for system compiling.
# E.g. gcc-arm-none-eabi, arm-linux-harmonyeabi-gcc, ohos-clang, riscv32-unknown-elf.
# Note: The default toolchain is "ohos-clang". It's not mandatory if you use the default toolchain.
# 交叉編譯器名稱
board_toolchain = "arm-none-eabi-gcc"

# The toolchain path installed, it's not mandatory if you have added toolchain path to your ~/.bashrc.
# 這里一般可以不寫
board_toolchain_path = ""

# 交叉編譯器Compiler prefix.
board_toolchain_prefix = "arm-none-eabi-"

# 編譯器類型 Compiler type, "gcc" or "clang".
board_toolchain_type = "gcc"

# 編譯選項Board related common compile flags.
board_cflags = [
"-mcpu=cortex-m4",
"-mfpu=fpv4-sp-d16",
"-mfloat-abi=hard",
"-mthumb",
"-Og",
# "-g",
#"-Wall",
"-fdata-sections",
"-ffunction-sections",
# 注意,這里我們需要定義GD32F30X_HD宏
"-DGD32F30X_HD",
# 我們需要浮點數(shù)計算
"-D__FPU_PRESENT",
]
board_cxx_flags = board_cflags
board_ld_flags = []
# 頭文件路徑,一般需要soc相關 Board related headfiles search path.
board_include_dirs = [
"${ohos_root_path}device/soc/gd32/gd32f303/liteos_m",
"${ohos_root_path}device/soc/gd32/CMSIS",
"${ohos_root_path}device/soc/gd32/CMSIS/GD/GD32F30x/Include",
"${ohos_root_path}device/soc/gd32/gd32f303/GD32F3XX_Driver/Inc",
"${ohos_root_path}device/soc/gd32/gd32f303",
"${ohos_root_path}utils/native/lite/include",
"${ohos_root_path}kernel/liteos_m/components/cpup",
"${ohos_root_path}kernel/liteos_m/components/exchook",
]
# 開發(fā)板用到哪個soc Board adapter dir for OHOS components.
board_adapter_dir = "${ohos_root_path}device/soc/gd32"
# Sysroot path.
board_configed_sysroot = ""
# Board storage type, it used for file system generation.
storage_type = ""

4、 SOC配置

(1)創(chuàng)建 SOC文件夾

我們進入到device/soc文件夾,創(chuàng)建 gd32文件夾,gd32文件夾內(nèi)容如下:

其中GD32官方標準庫文件和CMSIS都可以在GD官網(wǎng)下載到,而且不需要我們修改編寫,故而本節(jié)不會講其中的內(nèi)容,重點放在Kconfig配置文件中。

同樣,soc也是分為芯片廠家的Kconfig 和具體芯片信號的Kconfig,gd32是芯片廠家,gd32f303只是其中的一款型號而已。

(2)gd32芯片廠家Kconfig配置文件

先看Kconfig.liteos_m.soc文件:

config SOC_COMPANY_GD32
bool
if SOC_COMPANY_GD32
config SOC_COMPANY
default "gd32"
rsource "*/Kconfig.liteos_m.soc"
endif # SOC_COMPANY_GD32

這里很簡單,就是配置我們的芯片廠商默認為 gd32

之后導入所有文件夾的 Kconfig.liteos_m.soc 配置文件

Kconfig.liteos_m.series文件:

這個文件就比較簡單了,導入所有文件夾的 Kconfig.liteos_m.series 配置文件

rsource "*/Kconfig.liteos_m.series"

Kconfig.liteos_m.defconfig:

同樣,導入所有文件夾的Kconfig.liteos_m.defconfig

rsource "*/Kconfig.liteos_m.defconfig.series"

(3) gd32F303芯片的Kconfig配置文件

我們來看看具體的芯片型號gd32f303的配置文件吧

)Kconfig.liteos_m.series文件:

需要配置芯片系列,以及它的芯片架構(gòu)等信息

內(nèi)容:

config SOC_SERIES_GD32F303
bool "GD32F303 chip"
select ARM
select SOC_COMPANY_GD32
select CPU_CORTEX_M4
help
Enable support for GD32F303

復制這個是芯片系列的選擇,我們的芯片系列是GD32F303,架構(gòu)是ARM、CORTEX_M4 芯片廠家是 SOC_COMPANY_GD32,這個在上一級gd32的Kconfig配置文件中有定義。

Kconfig.liteos_m.soc文件:

需要配置芯片系列有多少個型號的芯片。

內(nèi)容:

choice
prompt "GD32F303 series SoC"
depends on SOC_SERIES_GD32F303 #只有選擇了芯片系列SOC_SERIES_GD32F303后才會出現(xiàn)如下選項
config SOC_GD32F303ZET6 #增加一個SOC_GD32F303ZET6選項,我們現(xiàn)在只有GD32F303ZET6,后面可以還有GD32F303RCT6等。
bool "SoC GD32F303ZET6"
endchoice

Kconfig.liteos_m.defconfig.series 文件:

選擇芯片系列后默認的配置

內(nèi)容:

if SOC_SERIES_GD32F303
rsource "Kconfig.liteos_m.defconfig.gd32f303"
config SOC_SERIES
string
default "gd32f303"
config NUM_IRQS #中斷數(shù)量,跟具體芯片相關
int
default 90
config SYS_CLOCK_HW_CYCLES_PER_SEC #時鐘周期,GD32F303是120MHz
int
default 120000000
endif

Kconfig.liteos_m.defconfig.gd32f303 文件:

Gd32f303的配置,內(nèi)容比較簡單:

config SOC
string
default "gd32f303zet6"
depends on SOC_GD32F303ZET6

默認是gd32f303zet6。

至此我們的soc的kconfig配置基本完成。

(4)內(nèi)核配置頭文件

還有一個比較重要的內(nèi)核配置頭文件,target_config.h。這個大家可以直接復制我的就行,主要是內(nèi)核功能配置相關。

其中有一個比較重要的配置項:

/**
* @ingroup los_config
* Memory size
*/
#define LOSCFG_SYS_HEAP_SIZE (60*1024)

這個是配置內(nèi)核的堆棧大小,這里可以根據(jù)自己芯片的內(nèi)存大小來定,GD32F303內(nèi)存是64KB,這里我用60k即可。

(5) make menuconfig配置

完成上面移植內(nèi)容后,接下來,我們就可以進行menuconfig配置了。

注意,這里我們需要先執(zhí)行一次hb set選擇我們的開發(fā)板gd32f303_lianzhian。

我們進入 kernel/liteos_m 文件夾。

執(zhí)行 make menuconfig。

進入Platform,我們選擇gd32f303芯片、gd32f303_lianzhian開發(fā)板,如下:

退出保存。

結(jié)果將自動保存在$(PRODUCT_PATH)/kernel_configs/debug.config

(6) gn編譯

在上一步Kconfig的圖形化配置后,將其生成的配置結(jié)果可以作為gn編譯的輸入,以控制不同模塊是否編譯。另外為了解決之前gn編寫時,隨意include的問題,內(nèi)核編譯做了模塊化編譯的設計,使得整個編譯邏輯更加清晰。

我們需要編寫device/board/lianzhian 和 device/soc/gd32兩個文件夾下的BUILD.gn。

這幾個BUILD.gn文件比較簡單,都是模塊化編譯,大家可以直接參考我的。

(7) 編譯器安裝

我們使用的編譯器是arm-none-eabi-gcc,下載地址:

git clone https://gitee.com/harylee/gcc-arm-none-eabi-10-2020-q4-major.git。

將交叉編譯器環(huán)境變量bin目錄配置到.bashrc文件中。

(8)開始編譯

配置完BUILD.gn后,我們就可以開始執(zhí)行hb build -f編譯了。

可以看到已經(jīng)能編譯過一大半了:

我們今天的目標就是要能讓編譯系統(tǒng)能開始編譯我們的開發(fā)板。

一步一腳印,接下來我們將繼續(xù)開始移植,接下來將配置libc庫、系統(tǒng)啟動、main函數(shù)、鏈接腳本,直到編譯通過并且在開發(fā)板中成功運行~

??想了解更多內(nèi)容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??

??https://ost.51cto.com??


責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關推薦

2022-04-15 14:31:02

鴻蒙操作系統(tǒng)

2022-01-21 21:22:24

OpenHarmon操作系統(tǒng)鴻蒙

2022-02-09 19:45:41

MQTTOpenHarmon鴻蒙

2024-01-05 15:32:47

鴻蒙SNTP智慧時鐘

2022-02-10 15:07:10

云平臺OpenHarmon系統(tǒng)開發(fā)

2023-04-03 15:39:31

2022-09-02 08:23:12

軟件開發(fā)解耦架構(gòu)

2023-03-24 14:39:17

鴻蒙系統(tǒng)開發(fā)

2022-02-08 15:21:59

Hi3861開發(fā)鴻蒙

2022-01-24 18:43:20

OpenHarmon操作系統(tǒng)鴻蒙

2022-02-09 19:25:49

Hi3861WiFi操作鴻蒙

2022-02-09 19:31:41

Hi3861OpenHarmon鴻蒙

2023-06-13 14:55:04

2022-01-24 18:35:56

OpenHarmon鴻蒙操作系統(tǒng)

2023-04-24 15:11:51

系統(tǒng)開發(fā)鴻蒙

2020-10-16 18:41:43

command設計模式代碼

2022-06-09 14:40:14

系統(tǒng)移植鴻蒙

2023-07-28 15:32:26

鴻蒙操作系統(tǒng)

2013-09-16 10:19:08

htmlcssJavaScript

2016-11-30 15:30:42

架構(gòu)工具和方案
點贊
收藏

51CTO技術(shù)棧公眾號