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 等。
ARM 芯片移植輕量系統基礎知識
在做芯片移植工作之前,我們需要掌握一點點基礎知識。
①適配 LiteOS-M 輕量系統
GD32F303 系列器件是基于 Arm Cortex-M4 處理器的 32 位通用微控制器。
所以我們使用的是內核是 LiteOS-M,對應的是 OpenHarmony 輕量系統。
事實上,OpenHarmony 已經做好了 Cortex-M4 核相關的通用移植工作,具體代碼可以查看文件夾:“kernelliteos_mkernelarcharm”。
可以看到目前已經支持了 cortex-m4 核。所以內核移植工作基本不需要,減少了我們很多工作量,但是我們仍然需要移植 GD32F303 芯片相關的。
②哈佛架構
GD32F303 采用的是哈佛架構,哈佛架構的特點是代碼指令和數據分開存儲。對于 GD32F303 而言,代碼是存放在片內 flash 上,地址是 0x8000000。
數據(也就是代碼中用到的各種變量、內存等)是存放在芯片內部內存 RAM 上,地址是 0x20000000,總共 64K,即 0x10000。
③編譯結果分析
對于 GD32F303 而言,編譯出來的固件一般是 bin 格式、或者 hex 格式。
通常編譯最后的結果會產生 4 種不同的內容,有時我們也稱為 4 段:
code:即程序代碼部分,該內容由所有程序指令組成,也是代碼運行的主體,通常是要燒錄到 GD32F303 片內 flash 上。
RO-data:只讀數據段,例如我們在程序中所定義的全局常量數據和字符串都位于此處。由于這些數據都是只讀,不會改變的,那這些只讀的全局就沒必要放到內存種,可以直接放到 flash 中,可以節省內存。
RW-data:已初始化的讀寫數據,程序中定義并且初始化的全局變量和靜態變量位于此處。由于內存剛上電后,內存上的數據是未知,所以我們需要事先把這些全局變量、靜態變量的初始值先存放到 flash 中,然后上電后,由 CPU 將 flash 中的初始值賦予到內存中的變量中。
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 函數。
移植GD32F303到OpenHarmony 3.0
這里提供移植好的相關代碼,下載鏈接:
https://gitee.com/qidiyun/gd32-f303-for-open-harmony-3.0
①先按官網教程搭建好 Ubuntu 下的開發環境
下載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 文件夾復制到 OpenHarmony 3.0 代碼的 device 文件夾下。
將 vendor 文件夾下的 gd 文件夾復制到 OpenHarmony 3.0 代碼的 vendor 文件夾下。
復制后,OpenHarmony 3.0 的 device 文件夾內容
OpenHarmony 3.0 的 vendor 文件夾內容
③編譯
進入 OpenHarmony 3.0 源碼根目錄,輸入 hb set 可以看到由 gd32f303_qidian 的編譯選項。選擇。
輸入 hb build -f 開始全編譯:
有看到 [OHOS INFO] gd32f303_qidian build success 表示編譯成功。
編譯完成后,可以在“outgd32f303_qidiangd32f303_qidian”文件夾下看到編譯結果,其中“gd32f303_qidian_ninjia.hex”就是可以直接燒錄到開發板的固件。
vendor 文件夾
該文件下最重要的文件是“config.json”:
內如如下,主要是配置相關組件:
device 代碼解析:
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,只讀數據段。后面還有其它定義,我們下一篇再細節。至此我們的啟動文件、鏈接腳本中比較關鍵的部分已經說明完。
liteos-m 內核配置
進入“devicegdgd32f303_qidianliteos_m”文件夾,可以看到有這個文件“config.gni”,該文件用于配置 liteos-m 內核。
其中比較重要部分是指定我們的處理器架構和交叉編譯工具鏈,如下:
我們使用的交叉編譯工具鏈是 “arm-none-eabi-”。
下面還配置了相關宏定義和 gd 標準庫頭文件路徑,需要大家修改。
好了,初步移植要點講完了,下一篇文章講 OpenHarmony 內核配置文件、main 函數啟動后如何進入鴻蒙輕量內核~
責任編輯:haq
-
單片機
+關注
關注
6035文章
44554瀏覽量
634692 -
操作系統
+關注
關注
37文章
6807瀏覽量
123285 -
HarmonyOS
+關注
關注
79文章
1974瀏覽量
30147 -
OpenHarmony
+關注
關注
25文章
3715瀏覽量
16257
原文標題:OpenHarmony 3.0移植到ARM單片機
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論