天天看點

移植OpenHarmony 3.0到ARM單片機

9月30日,OpenHarmony 3.0 LTS版本釋出。

本文将介紹如何移植OpenHarmony 3.0到星空派開發闆上。

星空派(GD)開發闆是由旗點科技推出的一款GD32開發闆,闆載GD32F303ZET6晶片,可直接替代STM32F103和GD32F103系列。

支援WiFi、4G、loRa等物聯通信接口。闆載Flash、eeprom等,支援3.2寸的TFT - LCD螢幕。所有IO口均引出,可完整地進行外設開發,包括:JTAG、RTC、I2C、UART、SPI、SDIO、EXMC、DAC、ADC、USB、TFT-LCD等。

移植OpenHarmony 3.0到ARM單片機

在做晶片移植工作之前,我們需要掌握一點點基礎知識。

GD32F303系列器件是基于Arm® Cortex®-M4處理器的32位通用微控制器。是以我們使用的是核心是LiteOS-M,對應的是OpenHarmony輕量系統。

事實上,OpenHarmony已經做好了Cortex®-M4 核相關的通用移植工作,具體代碼可以檢視檔案夾:“kernel\liteos_m\kernel\arch\arm”

移植OpenHarmony 3.0到ARM單片機

可以看到目前已經支援了cortex-m4核。是以核心移植工作基本不需要,減少了我們很多工作量,但是我們仍然需要移植GD32F303晶片相關的。

GD32F303采用的是哈佛架構,哈佛架構的特點是代碼指令和資料分開存儲。對于GD32F303而言,代碼是存放在片内flash上,位址是0x8000000。

資料(也就是代碼中用到的各種變量、記憶體等)是存放在晶片内部記憶體RAM上,位址是0x20000000,總共64K,即0x10000。

移植OpenHarmony 3.0到ARM單片機

對于GD32F303而言,編譯出來的固件一般是bin格式、或者hex格式。通常編譯最後的結果會産生4種不同的内容,有時我們也稱為4段:

1)code:即程式代碼部分,該内容由所有程式指令組成,也是代碼運作的主體,通常是要燒錄到GD32F303片内flash上。

2)RO-data:隻讀資料段,例如我們在程式中所定義的全局常量資料和字元串都位于此處。由于這些資料都是隻讀,不會改變的,那這些隻讀的全局就沒必要放到記憶體種,可以直接放到flash中,可以節省記憶體。

3)RW-data:已初始化的讀寫資料,程式中定義并且初始化的全局變量和靜态變量位于此處。由于記憶體剛上電後,記憶體上的資料是未知,是以我們需要事先把這些全局變量、靜态變量的初始值先存放到flash中,然後上電後,由CPU将flash中的初始值賦予到記憶體中的變量中。

4)ZI-data:未初始化的全局變量或者初始化為0的全局變量,這些變量預設都是0,我們隻需要CPU上電後,将這些記憶體都清零即可。

由上我們可以的出來2個結論:

1)我們編譯出來的固件要燒錄到GD32F303的片内flash,需要由3段資料:code、RO-data、RW-data

移植OpenHarmony 3.0到ARM單片機

2)晶片上電後,GD32F303需要将RW-data的内容複制到記憶體對應位置,進而保證初始化的全局變量和靜态變量的值正确;還要對記憶體中的ZI-data段進行清零操作,最後才能執行main函數。

對于ARM Cortex-M系列的晶片而言,當晶片上電後,ARM核會将位址為0x8000000的資料映射到0位址,然後從0位址開始讀取程式指令。

而0x8000000位址是晶片内部flash的起始位址。也就是編譯生成的固件最終要燒錄到的位址。是以我們的固件前面的代碼非常重要,它是我們晶片啟動後執行的第一條指令。

對于ARM Cortex-M系列的晶片而言,0x8000000位址第一個位元組是棧指針,由于棧是從高往下增長的,是以該棧指向晶片最大記憶體處即可。

接下來從0x8000000的第2個位元組開始是中斷向量表,存放着所有中斷處理函數指針。前面16個是核心中斷,其中第一個中斷指針存放的是Reset_Handler複位中斷處理函數。晶片一上電、或者複位,都會先從該中斷函數開始運作,是以這個函數是我們最重要的,我們需要在該函數中完成RW-data、ZI-data資料的操作,同時初始化好晶片時鐘、最後進入main函數。

移植OpenHarmony 3.0到ARM單片機

這裡提供移植好的相關代碼,下載下傳連結:

https://gitee.com/qidiyun/gd32-f303-for-open-harmony-3.0

下載下傳arm交叉編譯器:

git clone https://gitee.com/harylee/gcc-arm-none-eabi-10-2020-q4-major.git ,将交叉編譯器環境變量bin目錄配置到.bashrc檔案中或者配置device/st/stm32l4r9i_disco/liteos_m/config.gni檔案中board_toolchain_path宏為交叉編譯器bin路徑。

移植OpenHarmony 3.0到ARM單片機

将device檔案夾下的gd檔案夾複制到OpenHarmony3.0代碼的device檔案夾下

将vendor檔案夾下的gd檔案夾複制到OpenHarmony3.0代碼的vendor檔案夾下

複制後,OpenHarmony3.0的device檔案夾内容如下:

移植OpenHarmony 3.0到ARM單片機

OpenHarmony3.0的vendor檔案夾内容如下:

移植OpenHarmony 3.0到ARM單片機

進入OpenHarmony3.0源碼根目錄,輸入 hb set 可以看到由gd32f303_qidian的編譯選項。選擇。

移植OpenHarmony 3.0到ARM單片機

輸入 hb build -f開始全編譯:

移植OpenHarmony 3.0到ARM單片機

有看到 [OHOS INFO] gd32f303_qidian build success 表示編譯成功。

編譯完成後,可以在“out\gd32f303_qidian\gd32f303_qidian”檔案夾下看到編譯結果,其中“gd32f303_qidian_ninjia.hex”就是可以直接燒錄到開發闆的固件。

移植OpenHarmony 3.0到ARM單片機

該檔案下最重要的檔案是“config.json”

移植OpenHarmony 3.0到ARM單片機

内如如下,主要是配置相關元件:

移植OpenHarmony 3.0到ARM單片機

device代碼

(1)device檔案夾:

該檔案夾下是星空派開發闆的重要代碼部分,其中就有啟動檔案、main函數、中斷處理等。

移植OpenHarmony 3.0到ARM單片機

由于移植内容較長,本文重點介紹啟動檔案、連結腳本。

啟動檔案startup_gd32f30x.s 。最重要的是将RW-data的内容複制到記憶體對應位置,進而保證初始化的全局變量和靜态變量的值正确;還要對記憶體中的ZI-data段進行清零操作,最後才能執行main函數。

代碼都是彙編,參考自st和gd相關啟動檔案,重要代碼如下:

移植OpenHarmony 3.0到ARM單片機

連結腳本是“gd32f30x_qidian.ld”,用于指定code、RO-data、RW-data、ZI-data如何分布。

首先指定記憶體位址為0x20000000,大小為64K、

片上flash位址為:0x8000000,大小為512K

這裡跟晶片相關,需要正确修改,否則可能起不來。

移植OpenHarmony 3.0到ARM單片機

同時連結腳本也指定了固件的生成規則:

移植OpenHarmony 3.0到ARM單片機

這裡隻截取了部分,可以看到生成的固件最開始存放的isr_vector,這個是中斷向量表,在啟動檔案中定義:

移植OpenHarmony 3.0到ARM單片機

接下來就是text,也就是代碼段

還有rodata,隻讀資料段。

後面還有其它定義,我們下一篇再細節。

至此我們的啟動檔案、連結腳本中比較關鍵的部分已經說明完。

進入“device\gd\gd32f303_qidian\liteos_m”檔案夾,可以看到有這個檔案“config.gni”

該檔案用于配置 liteos-m核心。

其中比較重要部分是指定我們的處理器架構和交叉編譯工具鍊,如下:

移植OpenHarmony 3.0到ARM單片機

我們使用的交叉編譯工具鍊是 “arm-none-eabi-”

下面還配置了相關宏定義和gd标準庫頭檔案路徑,需要大家修改。

移植OpenHarmony 3.0到ARM單片機

好了~,初步移植要點講完了,下一篇文章講openharmony核心配置檔案、main函數啟動後如何進入鴻蒙輕量核心。

想了解更多關于鴻蒙的内容,請通路:

51CTO和華為官方戰略合作共建的鴻蒙技術社群

https://harmonyos.51cto.com/#bkwz

::: hljs-center

移植OpenHarmony 3.0到ARM單片機

:::