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

基于ARM Cortex-M MCU中的MPU所提供的一些特性
mcookie與單片機(jī)的關(guān)系_使用ARM Cortex-M MCU拓展單片機(jī)教學(xué)

一點(diǎn)理解之 CmBacktrace: ARM Cortex-M 系列 MCU 錯(cuò)誤追蹤庫(kù)

no cortex-m sw device found 問(wèn)題解決【轉(zhuǎn)】

基于32位Arm Cortex-M內(nèi)核N32系列MCU應(yīng)用
從8位AVR到32位SAM D21 MCU的應(yīng)用程序移植

評(píng)論