精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

strongerHuang ? 來源:痞子衡嵌入式 ? 作者:痞子衡 ? 2021-10-19 11:06 ? 次閱讀

來源 | 痞子衡嵌入式

一、Cortex-M中斷向量表對齊原則

中斷向量表就是一個集中保存系統全部中斷處理函數(xxxIRQHandler)地址的常量數組(函數地址要占 4 個字節,因此數組中每個元素大小為 4 字節),表中元素編號如下:

1. 中斷向量表第 0 - 1 個向量比較特殊,是程序初始 SP 和 PC 值
2. 中斷向量表第 2 - 15 個向量是系統中斷,IRQ 編號為 -14 到 -1
3. 中斷向量表第 16 個向量開始是廠商自定義外設中斷,IRQ 編號為 0 到 n
   - 對于 Cortex-M0/0+/1,    ARM 建議的 n 值最大為 15(實際一般廠商都會擴展)
   - 對于 Cortex-M3/4/7/23,  ARM 建議的 n 值最大為 239
   - 對于 Cortex-M33/35P/55, ARM 建議的 n 值最大為 479

Cortex-M 內核(除了CM0)模塊 SCB 里有個專門的 VTOR 寄存器用來控制中斷向量表首地址,程序運行起來后用戶可以配置 SCB->VTOR 寄存器來重設中斷向量表地址。

SCB->VTOR 寄存器低 7bit 是保留的(永遠0),所以中斷向量表首地址一定要是 128 字節(0x80)對齊的,這個毫無疑問!但是僅僅 128 字節對齊就行了嗎?這個是要看情況的,如下 Cortex-M Generic User Guide 手冊里關于 VTOR 寄存器描述里有這樣一段話(紅框內),這段話的意思是向量表首地址需要按 0x80 向上對齊(還得是 2 的整數冪)以覆蓋項目中實際用到的數值最大中斷號(xxx_IRQn)。

  • Note: 比如項目中實際用到最大外設中斷為 IRQ20,則最小向量表大小為(16 + 21)* 4 字節,那么向量表首地址需要至少以 0x100 對齊。

二、Cortex-M中斷向量表不對齊的后果

如果中斷向量表首地址沒有按規定對齊,會發生什么后果呢?我們找一塊板卡來實測下,選擇的芯片是恩智浦 i.MXRT1011,這是顆 Cortex-M7 內核的 MCU,除了 16 個系統中斷外,還包含 80 個外設中斷,中斷向量表里一共 96 個有效中斷。

因為 i.MXRT1011 里一共 96 個中斷,按規定,中斷向量表首地址至少要按 0x200 對齊。我們現在故意不按規定來設對齊,先選擇一個測試工程 SDK_2.10.0_EVK-MIMXRT1010oardsevkmimxrt1010demo_appshello_worldiar(flexspi_nor_build),修改 hello_world.c 文件,加一個 relocate_vector_table() 函數,將中斷向量表重定向到 NEW_VECTOR_ADDRESS:

#defineNEW_VECTOR_ADDRESS(0x00000080)

externuint32_t__VECTOR_TABLE[];
voidrelocate_vector_table(void)
{
__disable_irq();
//將0x60002000處的初始中斷向量表拷貝到新地址NEW_VECTOR_ADDRESS
memcpy((void*)NEW_VECTOR_ADDRESS,(void*)__VECTOR_TABLE,0x180);
//將VTOR指向NEW_VECTOR_ADDRESS
SCB->VTOR=NEW_VECTOR_ADDRESS;
__enable_irq();
}

intmain(void)
{
relocate_vector_table();

//其余代碼
}

萬事俱備,我們現在需要使能一些中斷來驗證,痞子衡分別選取了 SysTick、LPUART1、GPT2、WDOG2、TEMP_LOW_HIGH、WDOG1 六個中斷,它們的使能代碼都可以從 SDKoardsevkmimxrt1010driver_examples 里找到,這里不予贅述。

2.1 測試以 0x80 對齊的中斷向量表

將 NEW_VECTOR_ADDRESS 設為 ITCM 偏移 0x80 處,則中斷向量表被重定向到了按 0x80 對齊的地方,分別測試選定的 6 個中斷,最終結果如下:SysTick、TEMP_LOW_HIGH、WDOG1 中斷響應是正常的,而 LPUART1、GPT2、WDOG2 實際響應的中斷函數卻是 MemManage、SysTick、DMA13 位置,這里出現了異常。

#defineNEW_VECTOR_ADDRESS(0x00000080)
47d1c196-3007-11ec-82a8-dac502259ad0.png

2.2 測試以 0x100 對齊的中斷向量表

將 NEW_VECTOR_ADDRESS 設為 ITCM 偏移 0x100 處,則中斷向量表被重定向到了按 0x100 對齊的地方,分別測試選定的 6 個中斷,最終結果如下:SysTick、LPUART1、GPT2、WDOG2 中斷響應是正常的,而 TEMP_LOW_HIGH、WDOG1 實際響應的中斷函數卻是 SysTick、DMA10 位置,還是出現了異常。

#defineNEW_VECTOR_ADDRESS(0x00000100)
489426fa-3007-11ec-82a8-dac502259ad0.png

2.3 測試以 0x180 對齊的中斷向量表

將 NEW_VECTOR_ADDRESS 設為 ITCM 偏移 0x180 處,則中斷向量表被重定向到了按 0x180 對齊的地方,實測效果跟 2.1 節一致。

#defineNEW_VECTOR_ADDRESS(0x00000180)

2.4 測試以 0x200 對齊的中斷向量表

將 NEW_VECTOR_ADDRESS 設為 ITCM 偏移 0x200 處,則中斷向量表被重定向到了按 0x200 對齊的地方,6 個中斷都能正常響應,畢竟是符合 ARM 手冊里對齊規定。

#defineNEW_VECTOR_ADDRESS(0x00000200)

2.5 測試結果總結

因為 i.MXRT1011 最多僅 96 個有效中斷,有些對齊測試不能完全覆蓋,痞子衡后來又在 i.MXRT1176 上(最多 234 個有效中斷)以同樣方式測了一遍,最終總結到現象如下(該現象可用來精簡向量表,下文再聊):

1. 當中斷向量表以 0x80 對齊時:
  - 表中 (2n*0x80)/4 處開始的連續 32 個中斷均能夠正常響應,n 可取值 0 - 7
  - 表中 ((2n+1)*0x80)/4 處開始的連續 32 個中斷發生時,實際響應的卻是表中((2n*0x80)/4 處對應的連續 32 個中斷函數
2. 當中斷向量表以 0x100 對齊時:
  - 表中 (2n*0x100)/4 處開始的連續 64 個中斷均能夠正常響應,n 可取值 0 - 4
  - 表中 ((2n+1)*0x100)/4 處開始的連續 64 個中斷發生時,實際響應的卻是表中((2n*0x100)/4 處對應的連續 64 個中斷函數
3. 當中斷向量表以 0x200 對齊時:
  - 表中 (2n*0x200)/4 處開始的連續 128 個中斷均能夠正常響應,n 可取值 0 - 1
  - 表中 ((2n+1)*0x200)/4 處開始的連續 128 個中斷發生時,實際響應的卻是表中((2n*0x200)/4 處對應的連續 128 個中斷函數
4. 當中斷向量表以 0x400 對齊時:
  - 表中前 256 個中斷均能夠正常響應
  - 推測表中第 256 - 511 個中斷發生時,實際響應的是表中 0 - 255 個中斷函數
5. 當中斷向量表以 0x800 對齊時:
  - 表中前 512 個中斷均能夠正常響應

6. 當中斷向量表以 0x180 對齊時:未詳盡測試,效果似乎與以 0x80 對齊一致
7. 當中斷向量表以 0x280 對齊時:未詳盡測試,第 100 個中斷誤觸發第 68 個中斷函數,第 136 個中斷觸發 HardFault
8. 當中斷向量表以 0x300 對齊時:未詳盡測試,第 100/136 個中斷均觸發 HardFault
...

至此,Cortex-M中斷向量表對齊原則介紹完了~~~

編輯:jq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5317

    瀏覽量

    120008
  • 函數
    +關注

    關注

    3

    文章

    4306

    瀏覽量

    62430
  • Cortex-M
    +關注

    關注

    2

    文章

    227

    瀏覽量

    29727

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

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(3)NVIC 介紹

    NVIC(Nested vectored interrupt controller,嵌套向量中斷控制器)是Cortex-M處理器的部分,它是可編程的,且寄存器位于存儲器映射的系統控制
    的頭像 發表于 08-12 10:02 ?417次閱讀
    【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(3)NVIC 介紹

    TMS320C6701如何自己更改中斷向量的入口地址?

    TMS320C6701如何自己更改中斷向量的入口地址?有沒有C6701外設中斷的參考程序?或者對C6701有像Controlsuit樣的參考軟件
    發表于 08-09 06:49

    請問如何添加中斷服務函數?

    NVIC_GetVector__NVIC_GetVector可以在中斷向量表中添加中斷通道號。但是沒有找到綁定中斷源和中斷通道號的地方。用戶是否能自己添加
    發表于 05-30 07:41

    調試stm8s105的時候,如何在中斷向量表中設置自己的中斷

    各位大大,我在調試stm8s105的時候,如何在中斷向量表中設置自己的中斷?我做的是個旋轉編碼按鍵,PC4位中斷輸入,external_Interrupt應該放到什么位置? 我看別人
    發表于 05-15 06:32

    請問STM8L052R8的USART2中斷向量在哪?

    我現在在使用STM8L052R8,在使用手冊中介紹有3個USART串口,但中斷向量表中只有USART1有中斷向量,那么另外兩個串口不能使用中斷接收嗎?沒有中斷發送可以,但沒有
    發表于 05-09 06:33

    求助,關于STM8S103中斷向量重定義問題

    section .intvec }; 不報錯 但網上說 2.在BOOT程序里最重要的是中斷向量表重定向,icf文件就不用設置了(BOOT里不能開中斷) 感覺不用修改icf文件 求助有誰能解釋下?到底應該怎么做?
    發表于 05-08 06:33

    STM32F103CB將中斷向量表放到RAM后就不正常了,為什么?

    Code284funtion_inram.o(i.USART2_IRQHandler) 然后在main()的開始中設置中斷向量表到RAM中: NVIC_SetVectorTable
    發表于 04-25 08:08

    請問中斷向量重復定義怎么處理?

    。可以編譯通過,但因為中斷向量表有錯,程序在SystemClock_Config();后 就跑飛了。 如果去除其中個定義,則程序不會跑飛。請問遇到這種情況怎么處理?
    發表于 03-28 06:45

    STM32F429的工程標準庫移植到HAL庫后中斷向量表異常的原因?

    STM32F429的工程標準庫移植到HAL庫后中斷向量表異常
    發表于 03-20 06:02

    stm32cubeide更改ld文件中的Flash偏移和中斷向量表的宏VECT_TAB_OFFSET后,編譯出來的bin文件與之前不同為什么?

    我用的是stm32cubeide,芯片為STM32G491,修改了ld文件的Flash偏移和中斷向量表的宏VECT_TAB_OFFSET,對比修改前后的bin文件,發現有部分地方不同,請問這個是正常的嗎?
    發表于 03-19 06:16

    請問PSOC4的中斷向量表在哪查看?

    如題,PSOC4的中斷向量表在哪查看?謝謝
    發表于 02-06 06:22

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

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

    TC375 ISR優先級會影響中斷向量地址嗎?

    你好,現在我正在學習 TC375 IR,但我有些疑問。 1. 優先級會影響中斷向量地址嗎? 2、兩個不同的中斷不能具有相同的優先級嗎?
    發表于 01-22 07:01

    M453VG6AE中斷向量表起始地址是多少呢?共有多個中斷向量呢?

    芯片:M453VG6AE 這款芯片中斷向量表起始地址是多少呢?共有多個中斷向量呢?
    發表于 01-17 08:13

    深入解析中斷處理在MCU開發中的關鍵步驟

    中斷向量表都是鏈接到代碼的最前面,比如般 ARM 處理器都是從地址 0X00000000 開始執行指令的,那么中斷向量表就是從 0X00000000 開始存放的。代碼第 1 行
    發表于 12-15 16:34 ?1500次閱讀
    深入解析<b class='flag-5'>中斷</b>處理在MCU開發中的關鍵步驟