當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式客棧
[導(dǎo)讀]大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是Cortex-M中斷向量表原理及其重定向方法。接著前文《嵌入式Cortex-M裸機(jī)環(huán)境下臨界區(qū)保護(hù)的三種實現(xiàn)》繼續(xù)聊,嵌入式代碼設(shè)計里有時候一些特殊操作(比如XIP下Flash擦寫、低功耗模式切換)不能被隨意打斷,或...

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是Cortex-M中斷向量表原理及其重定向方法。

接著前文 《嵌入式Cortex-M裸機(jī)環(huán)境下臨界區(qū)保護(hù)的三種實現(xiàn)》 繼續(xù)聊,嵌入式代碼設(shè)計里有時候一些特殊操作(比如 XIP 下 Flash 擦寫、低功耗模式切換)不能被隨意打斷,或者一些共享數(shù)據(jù)區(qū)不能被無序訪問(A 任務(wù)正在讀,B 任務(wù)卻要寫),這時候我們可以利用系統(tǒng)全局中斷開關(guān)控制來實現(xiàn)所謂的臨界區(qū)保護(hù)。

但有些場景下開關(guān)系統(tǒng)全局中斷這種方法并不總是很湊效,比如 XIP 下 Flash 擦寫這種情況,如果項目里還有一個后臺定時器(比如SysTick)在實時運(yùn)行,擦除 Flash 期間(這個時間可能會很長)我們直接關(guān)閉系統(tǒng)全局中斷,會導(dǎo)致定時器中斷無法響應(yīng),系統(tǒng)計時會出偏差,對于這種情況,我們顯然不能關(guān)閉系統(tǒng)全局中斷。

為了在 Flash 擦寫期間系統(tǒng)還能夠及時響應(yīng)定時器中斷(執(zhí)行中斷響應(yīng)函數(shù)),我們需要將定時器中斷響應(yīng)函數(shù)及其相關(guān)代碼像 Flash IAP 操作代碼一樣都鏈接到 RAM 里執(zhí)行,此外還需要將中斷向量表也重定向到 RAM 里才行。今天痞子衡就來聊一聊重定向中斷向量表的方法:

一、Cortex-M中斷向量表簡介

熟悉 ARM Cortex-M 處理器的朋友應(yīng)該都對下面這張表有所了解,這就是中斷向量表,表中每個向量大小都是 4 字節(jié),除了第 0 個向量外,其余向量都是函數(shù)地址,這個表集中保存了系統(tǒng)全部的中斷處理函數(shù)(xxxIRQHandler)地址。

對于內(nèi)嵌 Flash 的 MCU 來說,初始中斷向量表一般會被要求固定鏈接到 Flash 起始地址處,因為系統(tǒng)啟動總是從 Flash 起始地址獲取第 0(初始棧)、1個向量(初始PC,復(fù)位函數(shù)ResetHandler)來開始應(yīng)用程序代碼的執(zhí)行。對于一些包含 BootROM 或者沒有內(nèi)部 Flash 的 MCU,初始中斷向量表也許可以放到 Flash 中的其他地址處,這要取決于具體芯片設(shè)計。

當(dāng)應(yīng)用程序執(zhí)行起來后,如果發(fā)生了中斷,系統(tǒng)會根據(jù)發(fā)出請求的外設(shè)中斷號來中斷向量表里找到對應(yīng)的外設(shè)中斷響應(yīng)函數(shù)并去執(zhí)行。Cortex-M 內(nèi)核(除了CM0)模塊 SCB 里有個專門的 VTOR 寄存器用來控制中斷向量表首地址(注意,地址需要 128 字節(jié)對齊),程序運(yùn)行起來后用戶可以配置 SCB->VTOR 寄存器來重設(shè)中斷向量表地址。

二、重定向中斷向量表的方法

現(xiàn)在我們以恩智浦 i.MXRT1170 型號為例介紹重定向中斷向量表的方法,在 \SDK_2.9.1_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\led_blinky\cm7\iar 工程上示例。

2.1 與中斷向量表相關(guān)的文件

這個 led_blinky 工程里跟中斷向量表有關(guān)的一共兩個文件,一是 startup_MIMXRT1176_cm7.s 啟動文件,這里面存放了中斷向量表實體定義,以及復(fù)位函數(shù) ResetHandler(),從復(fù)位函數(shù)里你可以看到上來就先重置了一遍 SCB->VTOR 寄存器。

THUMB

PUBWEAK Reset_Handler
SECTION .text:CODE:REORDER:NOROOT(2)
Reset_Handler
CPSID I ; Mask interrupts
LDR R0, =0xE000ED08 ; 即 SCB->VTOR
LDR R1, =__vector_table ; section .intvec 段首地址
STR R1, [R0]
LDR R2, [R1]
MSR MSP, R2
LDR R0, =SystemInit
BLX R0
CPSIE I ; Unmask interrupts
LDR R0, =__iar_program_start
BX R0
復(fù)位函數(shù)里用到的 __vector_table 值取決于 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 鏈接文件里如下語句設(shè)置。由于 i.MXRT1170 沒有內(nèi)部 Flash,分配給外部 NOR Flash (掛在 FlexSPI1 外設(shè)上)的系統(tǒng)映射起始地址是 0x30000000,而 0x30002000 是 BootROM 能支持的應(yīng)用程序初始中斷向量表地址之一(在 IVT 啟動頭里指示)。

define symbol m_interrupts_start = 0x30002000;
define symbol m_interrupts_end = 0x300023FF;

define exported symbol __VECTOR_TABLE = m_interrupts_start;

place at address mem: m_interrupts_start { readonly section .intvec };
編譯工程后在對應(yīng)生成的 iled_blinky_cm7.map 映射文件里可以找到初始中斷向量表最終鏈接地址。為了便于后續(xù)分析問題,我們將定時器中斷響應(yīng)函數(shù)地址也一并列出來:

*******************************************************************************
*** PLACEMENT SUMMARY
***

"A0": place at address 0x3000'2000 { ro section .intvec };

Section Kind Address Size Object
------- ---- ------- ---- ------
"A0": 0x400
.intvec ro code 0x3000'2000 0x400 startup_MIMXRT1176_cm7.o [1]
- 0x3000'2400 0x400

*******************************************************************************
*** ENTRY LIST
***

Entry Address Size Type Object
----- ------- ---- ---- ------
SysTick_Handler 0x3000'5767 0x10 Code Gb led_blinky.o [1]
__VECTOR_TABLE {Abs} 0x3000'2000 Data Gb
__Vectors 0x3000'2000 -- Gb startup_MIMXRT1176_cm7.o [1]
__Vectors_End 0x3000'2400 Data Gb startup_MIMXRT1176_cm7.o [1]
__Vectors_Size {Abs} 0x400 -- Gb startup_MIMXRT1176_cm7.o [1]
__vector_table 0x3000'2000 Data Gb startup_MIMXRT1176_cm7.o [1]

2.2 中斷重定向函數(shù)示例

定時器中斷響應(yīng)函數(shù) SysTick_Handler() 鏈接在 Flash 里顯然是不行的,我們利用 IDE 特性(對于IAR,是 __ramfunc 修飾符)將其鏈接到 RAM 里(MIMXRT1176xxxxx_cm7_flexspi_nor.icf 里定義了 TEXT2_region: 0x0 - 0x3FFFF 空間存放 section .textrw 段), 重新編譯工程,查看映射文件可以看到新分配的地址是 0x1。

__ramfunc?void?SysTick_Handler(void)
{
????if?(g_systickCounter?!=?0U)
????{
????????g_systickCounter--;
????}
}
*******************************************************************************
*** ENTRY LIST
***

Entry Address Size Type Object
----- ------- ---- ---- ------
SysTick_Handler 0x1 0x14 Code Gb led_blinky.o [1]
現(xiàn)在我們嘗試在代碼里純手工搬移中斷向量表,找一塊空閑的 RAM 區(qū)域(比如 0x20000000 - 0x200003FF),將中斷向量表內(nèi)容直接手工拷貝過去即可,示例代碼如下。主函數(shù)里一開始就調(diào)用一下這個 relocate_vector_table() 函數(shù)即可,修改后的工程下載進(jìn)板卡運(yùn)行一切正常,表明中斷向量表重定向操作成功了。

extern?uint32_t?__VECTOR_TABLE[];

void?relocate_vector_table(void)
{
????__disable_irq();
????//?將?0x30002000?處的初始中斷向量表拷貝到新地址?0x20000000
????memcpy((void?*)0x20000000,?(void?*)__VECTOR_TABLE,?0x400);
????//?將?VTOR?指向?0x20000000
????SCB->VTOR?=?0x20000000;
????__enable_irq();
}

int?main(void)
{
??? relocate_vector_table();

????//?其余代碼
}
至此,Cortex-M中斷向量表原理及其重定向方法痞子衡便介紹完畢了,掌聲在哪里~~~


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉