以下文章來源于嵌入式系統專家之聲,作者林金龍
1 引言
開源架構處理器RISC-V,在嵌入式系統中得到了越來越多的應用,近年多家處理器廠商發布了RV32架構MCU。2019年4月,SiFive發布了Freedom E310;2020年2月,兆易創新發布RV32 MCU GD32VF103;沁恒微電子發布CH32V、CH32X、CH32L系列RV32MCU;先輯半導體發布HPM5XXX和HPM6XXX系列RV32單核和多核MCU;瑞薩電子發布RV32汽車MCU RH850/U2B和通用MCU R9A02G021等。
隨著RISC-V MCU的快速發展,其軟件生態正逐步完善和豐富。Embedded Studio 、IAR 等主流商業IDE以及開源IDE eclipse等嵌入式軟件開發環境支持RISC-V MCU。一些主流操作系統已經支持RISC-V架構。QEMU RISC-V虛擬化平臺支持多種RISC-V處理器仿真;FreeRTOS發布支持RISC-V MCU版本;鄒陽等基于QEMU RISC-V實現OpenHarmony移植和優化;Nicholas Gordon等將Kitten Lightweight Kernel操作系統移植到RISC-V;Luming Zhang移植并優化RISC-V UFEI Boot;Robert Balas等分析RV32IMC結構特點并提出程序方法。
第二屆滴水湖中國RISC-V產業論壇現場調查結果表明,RISC-V架構處理器已經成功應用于無線連接芯片、工業控制芯片,網絡通信芯片和邊緣計算芯片等場景。目前,在移動通信、物聯網和工業控制等嵌入式應用領域,ARM架構處理器占市場主導地位。在一些領域和應用場景,RISC-V將對ARM的市場地位構成挑戰。RV32 MCU正爭奪ARM Cortex-M MCU的市場份額。將Cortex-M MCU應用程序移植到RV32 MCU,充分利用Cortex-M MCU的成熟生態,將有利于RISC-V的發展和推廣。由于RV32和Cortex-M的結構和編程模式存在差異,盡管使用程序開發工具能夠將源程序的編譯、匯編和鏈接生成RV32執行程序,但在程序移植過程中仍然會遇到一些問題。
本文根據RV32與Cortex-M在結構、編程模型和過程調用規范等方面的不同點,分析應用程序從RV32移植到Cortex-M過程中遇到的問題,提出解決方法和建議,并進行相關性能分析和比較。
本文第一節簡介RISC-V發展狀況,討論RV32的應用前景;第二節比較RV32與Cortex-M異常處理器機制,說明移植中斷處理程序面臨的問題;第三節對比RV32與Cortex-M指令架構,分析RV32指令模塊組合對程序性能的影響;第四節討論RISC-V與ARM處理器程序過程調用規范的差別,分析其對程序移植影響;第五節對論文工作進行總結。
2 中斷處理
在ARM架構處理器手冊和RISC-V架構處理器使用手冊中,用編程模式(Programmer's model)表示處理器架構中涉及程序開發的內容。編程模式通常包括處理器支持的數據類型,通用和特殊功能寄存器、異常和中斷響應機制和指令集等,異常和中斷處理處理器基本功能。
通常將由外部信號引起的異常稱為中斷。中斷處理是MCU應用系統的關鍵功能之一。中斷處理功能包括兩個部分,中斷響應機制和中斷服務程序(Interrupt Service Routine)。中斷響應機制由處理器硬件結構決定,中斷服務程序則與中斷響應機制相關。
2.1中斷響應機制
表1列出了Cortex-M和RV32中斷響應機制的差異。將應用程序從Cortex-M移植到RV32時,需要修改中斷處理功能相關程序。
表1 RV32和Cortex-M異常管理
Cortex-M僅支持向量中斷響應,中斷向量指向對應的中斷服務程序入口,處理器啟動后通過寄存器VTOR沖重定位中斷向量表。RV32支持向量和非向量兩種中斷響應方式,處理器器復位時缺省為非向量響應形式,中斷響應時指向程序空間的起始地址,通常為0x00。處理器啟動后,通過設置機器模式異常向量基址寄存器mtvec設置中斷響應模式和異常向量入口地址。
為了保證移植前后功能的一致性,將應用程序移植到RV32后仍保證向量中斷響應方式。RV32 MCU復位后首先執行初始化序,將中斷向量表地址值的高30位寫入RV32寄存器(CSR)mtvec的mtvec [31:2],將01寫入mtvec[1:0],選擇向量中斷響應模式。
目前市場上RV32 MCU外設類型、接口和控制方法與Cortex-MMCU相似,中斷向量表結構的結構相近。表2對比了Cortex-M MCU STM32F429與RV32 MCU GD32VF103中斷向量表結構。
表2 STM32F429與GD32VF103中斷向量表結構
如表2所示,RV32 MCU中斷向量中,除向量0外,每個32位向量值是對應中斷服務程序的入口地址。由于復位后RV32缺省為非向量中斷響應模式,需要首先設置中斷響應模式和向量表基地址,向量0是跳轉指令,跳轉到復位啟動程序入口。
2.2上下文處理
Cortex-MMCU響應中斷請求時,硬件自動依次將xPSR,PC,LR,R12以及R3-R0壓入棧中,保存上下文;中斷服務程序返回時,硬件自動從棧中將數據彈回對應寄存器,恢復上下文。
RV32 MCU響應中斷請求時硬件自動保存PC到控制和狀態寄存器mepc,并保存特權模式至mstatus.MPP,但不保存上下文相關的通用寄存器和其他特殊功能寄存器。從中斷服務程序返回時,硬件僅自動恢復寄存器mstatus和PC。將Cortex-M MCU中斷服務程序移植到RV32 MCU時,需要在中斷服務程序中添加保存和恢復上下文語句或函數。
Cortex-M MCU應用程序和中斷服務程序遵守ARM過程調用規范AAPCS,硬件在中斷響應過程中自動保存4個特殊功能寄存器和4個參數寄存器r0-r3或稱為a0-a3。RISC-V應用程序過程調用規范約定8個參數寄存器x10-x17或稱為a0-a7。與Cortex-M MCU自動保存的上下文內容對照,RV32 MCU中斷服務程序中需要保存和恢復上下文內容最小包括參數寄存器a0-a7和特殊功能寄存器。表3列出了RV32 MCU中斷服務程序中保存和恢復上下文最小集的程序語句。
表3 RV32 MCU中斷服務程序保存和恢復上下文程序語句
在中斷服務程序的入口添加表3中保存現場語句或函數,在返回語句前添加恢復現場語句或函數。 對于定制中斷響應機制Gd32VF103 等MCU,則需要依據其使用手冊編寫中斷處理相關的程序。
3 指令集模塊
Cortex-M MCU采用Thumb指令集。RV32 MCU采用模塊化指令,生成應用程序時可以選擇指令集模塊及其組合。將Cortex-M MCU應用程序移植到RV32 MCU時,選擇與Thumb指令集相應功能指令集模塊組合,以保持移植前后程序功能和性能的一致性。
為了便于分析和評估性能,本文選擇STM32F429和FE310分別作為Cortex-M MCU和RV32 MCU樣本,使用CoresMark 做性能分析;程序生成工具選擇Segger公司Embeddedstudio;匯編和編譯器選擇gcc,版本為gnu4.2.1。
STM32F429內核為Cortex-M4 ,指令集為Thumb2。FE310支持RV32imac指令集模塊,處理器指令集功能是所有子模塊功能的并集。表4對STM32F429與FE310指令集部分功能進行了比較。
表4 STM32F429與FE310指令集部分功能
生成RV32 MCU應用程序時,選擇不同的指令集或指令集組合,將會影響程序的性能。
3.1RV32i vs RV32im
Embedded studio創建FE310應用程序工程時缺省使用RV32i指令集模塊,該模塊沒有乘法和除法指令。程序中的乘除法運算能夠正常編譯,編譯器通過調用由RV32i指令實現的運算函數庫實現。如果在編譯時選擇RV32im指令集模塊組合,則編譯器將直接使用乘法和除法指令實現運算,提高程序執行速度。表5列出了c程序采用RV32i和RV32im指令集編譯后生成匯編指令對照。
表5 RV32i與RV32im匯編指令
表6列出了選擇RV32i與RV32im指令集在FE310模擬器上運行CoreMark得分。結果表明,如果應用程序中含有乘法和除法運算,將RV32i改為RV32im指令集將提高程序運行速度。
表6 RV32i與RV32im CoreMark得分
3.2RV32im vs RV32imc
由于MCU處理器中存儲資源受限,對ROM和RAM的需求是開發MCU應用程序關注的重點之一。Cortex-M采用支持16位指令Thumb指令模式,以減少應用程序的體積。RV32i和RV32im指令長度是32位。對于同一源程序,使用RV32im指令集生成的二進制目標程序的長度將會大于Cortex-M目標程序的長度,從而增加對存儲資源的需求。選擇RV32imc指令集組合,將指令長度從32位變為16位,減少所生成二進制目標程序的長度。表7列出了Coremark 4個主要文件不同指令集生成的二進制代碼長度。
表7 CoreMark主要文件生成的二進制代碼長度(字節)
從表7可見,RV32i程序的平均長度是Cortex-M4的2.05倍,RV32imc程序的平均長度是Cortex-M4的1.2倍。可見,在將程序從Cortex-M移植到RV32時,選擇RV32imc指令集組合,將基本滿足原系統對存儲資源限制要求。
添加指令集模塊"A",選擇RV32imac指令集組合,編譯后主要文件二進制代碼長度與RV32imac完全相同,CoreMark得分2.34/MHz,與選擇RV32imc指令集組合時相近。
4過程調用規范
過程調用規范(Procedure Call Standard)定義了應用程序二進制接口(Application Binary Interface),通常包括函數或過程調用中參數傳遞和結果返回方式,處理器寄存器使用,以及數據類型處理等內容。將Cortex-M MCU應用程序移植到RV32 MCU時,需要考慮ARM處理器和RISC-V處理器過程調用規范之間的差異。本節將討論函數調用過程參數傳遞方式的差別對移植程序帶來的影響。
ARM架構過程調用規范(AAPCS)約定:在函數和過程調用過程中,調用者(主程序)通過4個寄存器r0-r3或稱為a0-a3,向函數(被調用者)傳遞參數。如果參數超過4個寄存器數值范圍,超出部分利用棧傳遞;函數通過a0-al返回結果。RISV-V過程調用規范(RISC-V Procedure Calling Convetion)約定:調用者通過8個寄存器x10-x17或稱為a0-a7,向被調用者傳遞參數。如果參數超過8個寄存器數值范圍,超出部分利用棧傳遞;被調用者利用a0-al返回結果。表8列出了6個整數型參數C語言函數編譯后所生成的Cortex-M和RV32imac匯編函數。
表8由C函數生成匯編函數
如表8匯編函數所示,Cortex-M4函數,參數1到參數4通過a0-a3傳遞,參數5和6通過棧傳遞。在RV32imac函數中,參數1-6通過a0-a5傳遞。Cortex-M4和RV32imac利用a0返回結果。
由于訪問棧的延時高于訪問寄存器,在設計Cortex-MMCU應用函數時通常使參數不超過4*32位。將Cortex-M MCU應用程序移植到RV32 MCU時,利用多達8*32位寄存器參數傳遞特性,將減少函數和過程調用帶來的延時。
5 總結與展望
本文從MCU中斷處理機制,指令集模塊組合,以及程序過程調用規范三方面比較Cortex-M和RV32MCU的差別,分析了這些差別對將應用程序從Cortex-M MCU移植到RV32 MCU的影響。為了兼容中斷處理程序,將RV32 MCU設置為向量中斷響應方式,并在中斷服務程序中添加保存和恢復上文語句。在生成應用程序時選擇RV32imc指令集組合,實現高性能和小體積的應用程序。利用MCU寄存器在函數和過程調用過程傳遞更多參數,降低調用過程中的延時。
RV32 MCU與Cortex-M MCU指令差別很大,指令之間的差異對程序移植性能優化帶來挑戰。未來將進一步探討RV32程序移植中的性能優化問題。
(作者單位:北京大學軟件與微電子學院,北京)
本文由《嵌入式技術與智能系統》授權發表,原文刊登在2024年第1期。《嵌入式技術與智能系統》雜志由漢斯中文開源期刊學術交流平臺出版,是一本關注傳統嵌入式技術與新興智能系統前沿技術最新進展的國際中文期刊,編委團隊匯聚了國內知名嵌入式系統專家與學者。閱讀原文了解期刊詳情并可下載論文PDF版本。
-
處理器
+關注
關注
68文章
19851瀏覽量
234116 -
mcu
+關注
關注
146文章
17915瀏覽量
362526 -
移植
+關注
關注
1文章
396瀏覽量
28631 -
Cortex-M
+關注
關注
2文章
231瀏覽量
30294 -
RISC-V
+關注
關注
46文章
2525瀏覽量
48492
原文標題:移植Cortex-M程序到RV32中的問題 I 峰會和演講預告
文章出處:【微信號:麥克泰技術,微信公眾號:麥克泰技術】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
OM13077,用于Cortex-M MCU的LPCXpresso54102開發板
怎樣去測量并顯示基于Cortex-M的MCU代碼
Cortex-M系列MCU錯誤追蹤庫有何作用
如何將TensorFlow Lite應用程序移植到Arm Cortex-M55系統上
干貨:對比看看Arm推出的10款Cortex-M系列MCU內核IP
傳統的單片機和ARM較量 助推MCU踏上高端Cortex-M市場
加速Cortex-M MCU調試的五個技巧資料下載

基于ARM Cortex-M MCU中的MPU所提供的一些特性
mcookie與單片機的關系_使用ARM Cortex-M MCU拓展單片機教學

一點理解之 CmBacktrace: ARM Cortex-M 系列 MCU 錯誤追蹤庫

基于32位Arm Cortex-M內核N32系列MCU應用
從8位AVR到32位SAM D21 MCU的應用程序移植

評論