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等。
在做晶片移植工作之前,我們需要掌握一點點基礎知識。
GD32F303系列器件是基于Arm® Cortex®-M4處理器的32位通用微控制器。是以我們使用的是核心是LiteOS-M,對應的是OpenHarmony輕量系統。
事實上,OpenHarmony已經做好了Cortex®-M4 核相關的通用移植工作,具體代碼可以檢視檔案夾:“kernel\liteos_m\kernel\arch\arm”
可以看到目前已經支援了cortex-m4核。是以核心移植工作基本不需要,減少了我們很多工作量,但是我們仍然需要移植GD32F303晶片相關的。
GD32F303采用的是哈佛架構,哈佛架構的特點是代碼指令和資料分開存儲。對于GD32F303而言,代碼是存放在片内flash上,位址是0x8000000。
資料(也就是代碼中用到的各種變量、記憶體等)是存放在晶片内部記憶體RAM上,位址是0x20000000,總共64K,即0x10000。
對于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
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函數。
這裡提供移植好的相關代碼,下載下傳連結:
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路徑。
将device檔案夾下的gd檔案夾複制到OpenHarmony3.0代碼的device檔案夾下
将vendor檔案夾下的gd檔案夾複制到OpenHarmony3.0代碼的vendor檔案夾下
複制後,OpenHarmony3.0的device檔案夾内容如下:
OpenHarmony3.0的vendor檔案夾内容如下:
進入OpenHarmony3.0源碼根目錄,輸入 hb set 可以看到由gd32f303_qidian的編譯選項。選擇。
輸入 hb build -f開始全編譯:
有看到 [OHOS INFO] gd32f303_qidian build success 表示編譯成功。
編譯完成後,可以在“out\gd32f303_qidian\gd32f303_qidian”檔案夾下看到編譯結果,其中“gd32f303_qidian_ninjia.hex”就是可以直接燒錄到開發闆的固件。
該檔案下最重要的檔案是“config.json”
内如如下,主要是配置相關元件:
device代碼
(1)device檔案夾:
該檔案夾下是星空派開發闆的重要代碼部分,其中就有啟動檔案、main函數、中斷處理等。
由于移植内容較長,本文重點介紹啟動檔案、連結腳本。
啟動檔案startup_gd32f30x.s 。最重要的是将RW-data的内容複制到記憶體對應位置,進而保證初始化的全局變量和靜态變量的值正确;還要對記憶體中的ZI-data段進行清零操作,最後才能執行main函數。
代碼都是彙編,參考自st和gd相關啟動檔案,重要代碼如下:
連結腳本是“gd32f30x_qidian.ld”,用于指定code、RO-data、RW-data、ZI-data如何分布。
首先指定記憶體位址為0x20000000,大小為64K、
片上flash位址為:0x8000000,大小為512K
這裡跟晶片相關,需要正确修改,否則可能起不來。
同時連結腳本也指定了固件的生成規則:
這裡隻截取了部分,可以看到生成的固件最開始存放的isr_vector,這個是中斷向量表,在啟動檔案中定義:
接下來就是text,也就是代碼段
還有rodata,隻讀資料段。
後面還有其它定義,我們下一篇再細節。
至此我們的啟動檔案、連結腳本中比較關鍵的部分已經說明完。
進入“device\gd\gd32f303_qidian\liteos_m”檔案夾,可以看到有這個檔案“config.gni”
該檔案用于配置 liteos-m核心。
其中比較重要部分是指定我們的處理器架構和交叉編譯工具鍊,如下:
我們使用的交叉編譯工具鍊是 “arm-none-eabi-”
下面還配置了相關宏定義和gd标準庫頭檔案路徑,需要大家修改。
好了~,初步移植要點講完了,下一篇文章講openharmony核心配置檔案、main函數啟動後如何進入鴻蒙輕量核心。
想了解更多關于鴻蒙的内容,請通路:
51CTO和華為官方戰略合作共建的鴻蒙技術社群
https://harmonyos.51cto.com/#bkwz
::: hljs-center
:::