0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Cortex-M0中斷向量重定位的高效方法

麥克泰技術(shù) ? 來源:嵌入式系統(tǒng)專家之聲 ? 2023-12-05 11:05 ? 次閱讀

IAP ( In Application Programming )功能為產(chǎn)品軟件升級提供了一個方便快捷的接口。用戶可以通過串口、USBCAN總線[1]而無需使用編程器即可實現(xiàn)產(chǎn)品的軟件更新,甚至可以通過以太網(wǎng)[2]或者無線網(wǎng)絡(luò)[3]實現(xiàn)產(chǎn)品軟件的遠程升級,大大方便了產(chǎn)品的功能迭代,提升了產(chǎn)品的易用性。

Bootloader(以下簡稱Boot)俗稱引導(dǎo)程序,是實現(xiàn)IAP功能的核心。Application(簡稱App)即用戶應(yīng)用程序,負責(zé)實現(xiàn)產(chǎn)品功能。Boot和App這兩個獨立的程序在同一芯片中運行,有各自的中斷向量表,但中斷號相同。在由Boot進入到App后,如何使App下的中斷能正確響應(yīng)?這是所有IAP都需要面對的問題,而解決問題的關(guān)鍵在于實現(xiàn)中斷向量的重定位。不同MCU根據(jù)自身硬件特性不同,實現(xiàn)中斷向量重定位的方法存在著重大區(qū)別。

1Cortex-M3 架構(gòu)MCU中斷向量重定位

Nested Vectored Interrupt Controller(NVIC)即嵌套向量中斷控制器,是Cortex-M內(nèi)核的一部分,它管理和處理所有的異常和中斷。Cortex-M3中的NVIC,在地址0xE000 ED08處是一個Vector Table Offset Register(VTOR)即中斷向量表偏移量寄存器,通過修改它的值就能重新定位向量表[4]。

進入App運行后,只要在使能中斷功能前設(shè)置VTOR寄存器值為App起始地址即可實現(xiàn)中斷向量表的重定位。參考文獻[5]分析了Cortex-M3 單片機中斷向量重定位的執(zhí)行過程。Cortex-M4內(nèi)核中也有VTOR寄存器,因而在這些內(nèi)核MCU上實現(xiàn)中斷向量的重定位十分便捷、高效。

2Cortex-M0 架構(gòu)MCU中斷向量重定位

適中的性能、極低的能耗、低廉的價格使得Cortex-M0架構(gòu)MCU應(yīng)用非常廣泛,尤其是在物聯(lián)網(wǎng)傳感器、電動工具、電子測量、家電行業(yè)[6]。因為Cortex-M0中的NVIC沒有VTOR寄存器,所以此類型的MCU中斷向量重定位變得不容易。

2.1STM32F030中斷向量重定位

STM32F030基于Cortex-M0架構(gòu),廠商為該系列的MCU賦予了一個特性:啟動地址支持重映射。通過設(shè)置芯片Boot引腳電平,使得程序可從內(nèi)部Flash或內(nèi)部RAM啟動。芯片的SYSCFG_CFGR1寄存器也保存了設(shè)置狀態(tài),通過修改這個寄存器的值,即可重新引導(dǎo)程序[7]。

基于地址可以重新映射的特性,在App使能中斷功能前,將中斷向量表復(fù)制到內(nèi)部RAM的起始地址,再設(shè)置SYSCFG_CFGR1寄存器,使其從RAM中啟動,即可以實現(xiàn)中斷向量的重定位。

2.2普通Cortex-M0架構(gòu)MCU實現(xiàn)IAP的困境

并非所有Cortex-M0內(nèi)核的單片機都支持地址重映射,因為這并不是內(nèi)核功能的一部分[8]。市場上存在大量使用Cortex-M0內(nèi)核的專用MCU,如某些電機控制的專用MCU。它們不像STM32F030那樣具備地址重新映射的特性,因此不能使用2.1中的方法實現(xiàn)中斷向量的重定位。

因此,實現(xiàn)中斷向量的重定位成為此類基于Cortex-M0架構(gòu)MCU實現(xiàn)IAP功能的最大障礙。相關(guān)研究資料較少,參考文獻[9]給出了一種基于RAM的中斷跳轉(zhuǎn)方法,不過效率有待提升。

3中斷向量重定位的通用方法

本文給出了實現(xiàn)中斷向量重定位的一種通用方法。該方法不依賴于MCU自身硬件特性,而是基于純軟件實現(xiàn)。同時結(jié)合STM32F030和Keil開發(fā)環(huán)境,詳細介紹了該方法的原理,給出了相關(guān)代碼。

3.1梯子函數(shù)

給每一個中斷向量增加這樣一段程序:該程序負責(zé)獲取App中對應(yīng)中斷服務(wù)函數(shù)的入口地址,然后跳轉(zhuǎn)到該地址運行,從而運行App的中斷服務(wù)程序。這種功能的程序像是從Boot中斷向量通向App中斷服務(wù)函數(shù)的梯子,因此稱它為“梯子函數(shù)”。Boot中斷向量表中的每一個中斷向量保存的是對應(yīng)梯子函數(shù)的入口地址。

3.2中斷向量重定位過程

圖1給出了基于該方法進行中斷向量重定位的跳轉(zhuǎn)流程圖。App運行期間產(chǎn)生中斷,仍會從Boot中斷向量表取得相應(yīng)的中斷向量。不過此時實際獲取的是梯子函數(shù)的入口地址,然后借助梯子函數(shù)實現(xiàn)向App中斷服務(wù)程序跳轉(zhuǎn)的目標(biāo)。

cb891e8a-931a-11ee-939d-92fbcf53809c.jpg

圖1中斷向量表重定位通用方法

以RTC中斷為例,當(dāng)App運行時產(chǎn)生了該中斷,則會從Boot的中斷向量表找到RTC中斷的梯子函數(shù)入口地址并跳轉(zhuǎn)到該地址運行,如箭頭①和②所示。RTC中斷的梯子函數(shù)則會從App中的RTC中斷向量加載對應(yīng)的RTC中斷服務(wù)程序的入口地址,如箭頭③所示。最后跳轉(zhuǎn)到該地址,運行App的RTC中斷服務(wù)程序,如箭頭④所示。

3.3梯子函數(shù)的實現(xiàn)

梯子函數(shù)是實現(xiàn)從Boot中斷向量到App中斷服務(wù)程序跳轉(zhuǎn)的關(guān)鍵。程序采用匯編代碼實現(xiàn),一個中斷向量對應(yīng)著一個梯子函數(shù)。部分梯子函數(shù)編寫的示例如下:

cb9bc666-931a-11ee-939d-92fbcf53809c.jpg

同樣以RTC_IRQHandler為例,0x0800 2000為App的起始地址,對應(yīng)圖1中APP_BASE的值。0x48為RTC中斷向量的偏移地址。Line7將RTC中斷向量偏移地址加載到r0寄存器。Line8將App的RTC中斷處理函數(shù)地址加載到r1寄存器。Line9通過bx指令實現(xiàn)跳轉(zhuǎn)到App的RTC_IRQHandler中斷服務(wù)程序入口處的目標(biāo)。

通過在Boot中為各個中斷向量設(shè)置梯子函數(shù),借助梯子函數(shù)的橋梁作用實現(xiàn)中斷向量表的重定位。基于該方法在STM32F030上進行了IAP功能驗證,App的中斷功能運行正常,驗證了這一方法的可行性。

4 中斷向量重定位改進方法1

4.1存在的問題

一個梯子函數(shù)需要兩條ldr指令和一條bx指令,分別需要2個和3個指令周期[10],因此一個梯子函數(shù)共需要7個指令周期。此外Flash的時鐘頻率一般比CPU時鐘低很多。如STM32F030的CPU時鐘頻率高于24 MHz時,訪問Flash需要插入一個等待周期[11]。

綜上,進入App中斷服務(wù)函數(shù)運行前,將會引入較大的時間開銷。當(dāng)要求中斷能快速響應(yīng)或者存在諸如ADC采樣之類的高頻中斷,這種中斷向量重定位方法會引發(fā)系統(tǒng)性能的明顯下降,為此需要對中斷向量重定位的方法進行改進。

4.2改進原理

改進分為兩方面:一是減少梯子函數(shù)所需的指令,二是將梯子函數(shù)移到內(nèi)部RAM中運行。

Boot與App中各有一份梯子函數(shù)用于中斷向量的重定位。Boot中的梯子函數(shù)用于對無速度要求的中斷向量重定位,其工作原理和執(zhí)行效果與前文相同。App中的梯子函數(shù)為需要降低中斷響應(yīng)延遲,提高中斷處理性能的中斷重定位。改進方法1中斷向量表重定位執(zhí)行過程如圖2所示。

cbaa50d2-931a-11ee-939d-92fbcf53809c.jpg

圖2改進方法1中斷向量表重定位執(zhí)行過程

仍以RTC_IRQHandler中斷為例,此時該中斷向量的梯子函數(shù)RTC_IRQHandler_App位于RAM中,且地址固定為0x2000 0001。同時Boot中對應(yīng)RTC_IRQHandler中斷向量的單元保存了該地址。當(dāng)App運行過程中發(fā)生了RTC中斷時,MCU會從Boot中的RTC_IRQHandler中斷向量取得0x2000 0001地址,并跳轉(zhuǎn)到App下RTC中斷的梯子函數(shù)入口運行,對應(yīng)箭頭①和②。梯子函數(shù)會從App的中斷向量表中取得RTC_IRQHandler中斷服務(wù)函數(shù)地址,如箭頭③所示,最終跳轉(zhuǎn)到App的RTC中斷服務(wù)程序入口處運行,如箭頭④所示。

4.3App中的梯子函數(shù)

App所使用的梯子函數(shù)示例如下:

cbbde0b6-931a-11ee-939d-92fbcf53809c.jpg

其中,Line1定義了名為“l(fā)adder_app”的代碼段。Lin6定義了RTC_IRQHandler_App函數(shù),共兩條匯編指令。首先將App下的RTC_IRQHandler中斷服務(wù)函數(shù)地址加載到R0寄存器中,接著跳轉(zhuǎn)到該地址運行。相比于改進之前,此時只需要LDR和BX兩條指令,總計只需要5個指令周期。同時該段代碼在RAM中運行,不受Flash等待周期限制。

4.4App的分散加載設(shè)置

通過分散加載可使得APP中的梯子函數(shù)始終位于RAM固定地址,而與具體的應(yīng)用程序無關(guān)。STM32F030在Keil下的分散加載文件如下:

cc006206-931a-11ee-939d-92fbcf53809c.jpg

其中Line10將“l(fā)adder_app”代碼段加載到0x2000 0000地址,長度為128字節(jié)。若App中梯子函數(shù)較多,則預(yù)留空間需要相應(yīng)增大,反之亦然。

梯子函數(shù)的入口地址可以從工程編譯成功后的map文件獲取。如圖3所示,RTC_IRQHandler_App函數(shù)的入口地址為0x2000 0001,這就是前文Boot中RTC_IRQHandler向量保存的地址來源。

cc1571e6-931a-11ee-939d-92fbcf53809c.jpg

圖3 梯子函數(shù)與中斷服務(wù)函數(shù)入口地址

5中斷向量重定位改進方法2

前文討論了將梯子函數(shù)搬移到RAM中運行,從而大幅降低進入用戶中斷服務(wù)程序的時間開銷的改進方法。本節(jié)討論再改進的方法,進一步壓縮梯子函數(shù)的時間開銷,提高進入中斷程序的效率。

5.1梯子函數(shù)的改進

經(jīng)過改進的梯子函數(shù)代碼如下:

cc206150-931a-11ee-939d-92fbcf53809c.jpg

可以看出,只需要通過一條B指令,就可以跳轉(zhuǎn)到中斷服務(wù)函數(shù)入口。該指令執(zhí)行只需要3個時鐘周期,進一步降低了梯子函數(shù)運行所需要的時間開銷。

B指令是相對跳轉(zhuǎn)指令,用于無條件跳轉(zhuǎn),其支持跳轉(zhuǎn)地址范圍為PC-2046~PC+2046[4]。因此中斷服務(wù)函數(shù)必須也位于內(nèi)部RAM中,且距對應(yīng)的梯子函數(shù)的跳轉(zhuǎn)指令地址必須在2046字節(jié)之內(nèi)。這一條件是容易滿足的,畢竟不是所有的中斷服務(wù)程序都需要這么做,而只是個別時間敏感、高頻的中斷需要按照這種方法處理。

5.2中斷服務(wù)函數(shù)約束條件

為實現(xiàn)中斷處理函數(shù)的地址約束,在編寫相關(guān)中斷處理函數(shù)時,需要添加約束屬性。通過為函數(shù)設(shè)置section屬性將中斷服務(wù)程序放入自定義名稱為“ramfunc_isr”的輸入段。除此之外,與普通的中斷處理函數(shù)無其他差別。如在Keil環(huán)境下,對于RTC中斷處理函數(shù)寫法如下:

5.3分散加載文件

改進方法2的分散加載文件設(shè)置如下:

cc3124f4-931a-11ee-939d-92fbcf53809c.jpg

與改進方法1的分散加載文件相比,多了Line12的內(nèi)容,即將“ramfunc_isr”段的內(nèi)容從地址0x2000 0080開始放置。

圖4給出了map文件的部分內(nèi)容,可以看出,梯子函數(shù)RTC_IRQHandler_App入口地址為0x2000 0001,Timer3_IRQHandler_App入口地址為0x2000 0003。此時App的一個中斷梯子函數(shù)占用存儲空間大小僅為2字節(jié)。實際的中斷處理函數(shù)的入口地址分別為0x200 00081和0x2000 008d,均位于RAM中,緊接在梯子函數(shù)之后,相對地址也遠小于2046 B,滿足該改進方法的使用要求。

cc4aafb4-931a-11ee-939d-92fbcf53809c.png

圖4 梯子函數(shù)與中斷服務(wù)函數(shù)入口地址

6結(jié) 語

表1對文中提出的中斷向量重定位的通用方法及其兩種改進方法進行了對比,總結(jié)了3種方法的各自特點,實際上3三種方法可以混合使用。比如將高頻的ADC采樣中斷使用改進方法2進行ADC中斷向量的重定位,此時ADC中斷額外的時間開銷最小,同時由于該中斷服務(wù)程序在RAM中運行,性能也將大幅提高。將中頻的定時器中斷使用改進方法1進行中斷向量重定位,其他普通的中斷向量采樣通用方法進行重定位。

表1 中斷向量重定位3種方法對比

cc5db942-931a-11ee-939d-92fbcf53809c.jpg

基于本文提出的中斷向量表重定位方法,在STM32F030和Keil開發(fā)環(huán)境下進行了驗證,結(jié)果正確。此外,在其他品牌的基于Cortex-M0內(nèi)核的MCU上進行了驗證,也取得了成功。目前基于該方法實現(xiàn)的IAP功能已經(jīng)在產(chǎn)品上批量使用,效果較好。

文中提出的中斷向量重定位的方法雖然是以Cortex-M0內(nèi)核的MCU為對象進行討論和測試的,但是其不依賴于硬件的特殊性,因此也可以在其他內(nèi)核的MCU上進行推廣應(yīng)用。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16804

    瀏覽量

    349397
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16037

    瀏覽量

    176698
  • 嵌入式
    +關(guān)注

    關(guān)注

    5053

    文章

    18915

    瀏覽量

    300873
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    894

    瀏覽量

    41322
  • Cortex-M0
    +關(guān)注

    關(guān)注

    4

    文章

    124

    瀏覽量

    38591

原文標(biāo)題:Cortex-M0中斷向量重定位的高效方法

文章出處:【微信號:麥克泰技術(shù),微信公眾號:麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    MM32 IAP中斷向量定義

    = FLASH_BASE | VECT_TAB_OFFSET;該寄存器的值來實現(xiàn)中斷向量表的定義。但用戶反饋在MM32L0xx系列以Cortex-M0為內(nèi)核的單片機
    發(fā)表于 02-01 17:22

    Linux ARM中斷向量定位硬件平臺分析

    Linux ARM 中斷向量定位分析
    發(fā)表于 07-19 12:34

    為什么中斷向量定位?

    中斷向量為什么要定位?
    發(fā)表于 08-21 23:16

    STM32中斷向量偏移總結(jié)

    STM32中斷向量偏移總結(jié)一下在IAP升級APP程序的中斷向量表的偏移講解中斷偏移之前先看一下程序的啟動流程STM32F4 的內(nèi)部閃存(FLASH)地址起始于
    發(fā)表于 08-13 08:59

    有什么方法可以對STM32中斷向量表偏移地址進行配置呢

    如何去定位向量表的庫函數(shù)呢?有什么方法可以對STM32中斷向量表偏移地址進行配置呢?
    發(fā)表于 11-16 08:08

    基于Cortex-M0中斷系統(tǒng)的IP集成與中斷服務(wù)函數(shù)設(shè)計

    為極術(shù)線上技術(shù)分享干貨匯總(含PPT下載及視頻回放及線下活動資料下載,持續(xù)更新,歡迎收藏~整理:極術(shù)社區(qū)集創(chuàng)賽Arm杯彭吉安-(集創(chuàng)賽)基于Cortex-M0中斷系統(tǒng)的IP集成與中斷服務(wù)函數(shù)設(shè)計彭吉安-(集創(chuàng)賽)AHB-Lite
    發(fā)表于 12-14 07:15

    跳轉(zhuǎn)APP后的中斷向量表在定位前開啟了中斷怎么辦

    在RT的官網(wǎng)文檔里面有個STM32通用BOOT,說定位中斷向量方法如下:static int ota_app_vtor_reconfig(void){#define
    發(fā)表于 08-03 10:08

    ch573在IAP和APP使用UASRT1,是不是要中斷向量定位才能APP里面使用 ?

    ch573 我在IAP和APP使用UASRT1,定時0中斷,是不是要中斷向量定位才能APP里面使用 ,能不能提供例子
    發(fā)表于 09-20 06:47

    一文了解Cortex-M中斷向量表對齊原則

    到 -13. 中斷向量表第 16 個向量開始是廠商自定義外設(shè)中斷,IRQ 編號為 0 到 n - 對于 Cortex-M0/
    的頭像 發(fā)表于 10-19 11:06 ?4782次閱讀
    一文了解<b class='flag-5'>Cortex-M</b><b class='flag-5'>中斷向量</b>表對齊原則

    微機原理——8086中斷類型以及中斷向量表、中斷響應(yīng)、中斷返回

    這里寫目錄標(biāo)題先驗知識回顧控制寄存器回顧1、8086中斷類型1、外部可屏蔽中斷2、外部不可屏蔽中斷3、除法錯中斷4、單步中斷5、斷點
    發(fā)表于 11-24 16:51 ?16次下載
    微機原理——8086<b class='flag-5'>中斷</b>類型以及<b class='flag-5'>中斷向量</b>表、<b class='flag-5'>中斷</b>響應(yīng)、<b class='flag-5'>中斷</b>返回

    一文了解Cortex-M中斷向量表對齊原則

    關(guān)注+星標(biāo)公眾號,不錯過精彩內(nèi)容來源| 痞子衡嵌入式一、Cortex-M中斷向量表對齊原則中斷向量表就是一個集中保存系統(tǒng)全部中斷處理函數(shù)(xxxIRQHandler)地址的常量數(shù)組(函
    發(fā)表于 12-01 12:21 ?9次下載
    一文了解<b class='flag-5'>Cortex-M</b><b class='flag-5'>中斷向量</b>表對齊原則

    Cortex-M中斷向量表原理及其重定向方法~

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是Cortex-M中斷向量表原理及其重定向方法。接著前文《嵌入式Cortex-M裸機環(huán)境下臨界區(qū)保護的三種實現(xiàn)》繼續(xù)聊,嵌
    發(fā)表于 12-01 12:21 ?9次下載
    <b class='flag-5'>Cortex-M</b><b class='flag-5'>中斷向量</b>表原理及其重定向<b class='flag-5'>方法</b>~

    Cortex-M0中斷控制和系統(tǒng)控制(二)

    每一個外部中斷都有一個對應(yīng)的優(yōu)先級寄存器,Cortex-M0NVIC-IPR共有8個寄存器,而每個寄存器管理4個IRQ中斷,所以M0的IR
    發(fā)表于 02-08 15:48 ?3次下載
    <b class='flag-5'>Cortex-M0</b><b class='flag-5'>中斷</b>控制和系統(tǒng)控制(二)

    Cortex-M0中斷控制和系統(tǒng)控制知識點

    每一個外部中斷都有一個對應(yīng)的優(yōu)先級寄存器,Cortex-M0NVIC-IPR共有8個寄存器,而每個寄存器管理4個IRQ中斷,所以M0的IR
    的頭像 發(fā)表于 03-20 09:28 ?2931次閱讀

    什么是中斷向量偏移,為什么要做中斷向量偏移?

    當(dāng)MCU中有兩段或以上程序的時候(第一個程序為用戶BootLoader程序,其他的為APP程序,這個在前期視頻《什么是ISP?什么是IAP》中有講過),APP程序中都需要做中斷向量偏移,那么什么是中斷向量偏移,為什么要做中斷向量
    的頭像 發(fā)表于 01-30 09:47 ?1461次閱讀
    什么是<b class='flag-5'>中斷向量</b>偏移,為什么要做<b class='flag-5'>中斷向量</b>偏移?