日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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

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

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

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

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

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

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

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

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

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

2.1 與中斷向量表相關的文件

這個 led_blinky 工程里跟中斷向量表有關的一共兩個文件,一是 startup_MIMXRT1176_cm7.s 啟動文件,這里面存放了中斷向量表實體定義,以及復位函數 ResetHandler(),從復位函數里你可以看到上來就先重置了一遍 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
復位函數里用到的 __vector_table 值取決于 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 鏈接文件里如下語句設置。由于 i.MXRT1170 沒有內部 Flash,分配給外部 NOR Flash (掛在 FlexSPI1 外設上)的系統(tǒng)映射起始地址是 0x30000000,而 0x30002000 是 BootROM 能支持的應用程序初始中斷向量表地址之一(在 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 };
編譯工程后在對應生成的 iled_blinky_cm7.map 映射文件里可以找到初始中斷向量表最終鏈接地址。為了便于后續(xù)分析問題,我們將定時器中斷響應函數地址也一并列出來:

*******************************************************************************
*** 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 中斷重定向函數示例

定時器中斷響應函數 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]
現在我們嘗試在代碼里純手工搬移中斷向量表,找一塊空閑的 RAM 區(qū)域(比如 0x20000000 - 0x200003FF),將中斷向量表內容直接手工拷貝過去即可,示例代碼如下。主函數里一開始就調用一下這個 relocate_vector_table() 函數即可,修改后的工程下載進板卡運行一切正常,表明中斷向量表重定向操作成功了。

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中斷向量表原理及其重定向方法痞子衡便介紹完畢了,掌聲在哪里~~~


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

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉