chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

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

strongerHuang ? 來源:痞子衡嵌入式 ? 作者:痞子衡 ? 2021-10-19 11:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

來源 | 痞子衡嵌入式

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

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

1. 中斷向量表第 0 - 1 個向量比較特殊,是程序初始 SP 和 PC 值
2. 中斷向量表第 2 - 15 個向量是系統(tǒng)中斷,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 字節(jié)(0x80)對齊的,這個毫無疑問!但是僅僅 128 字節(jié)對齊就行了嗎?這個是要看情況的,如下 Cortex-M Generic User Guide 手冊里關于 VTOR 寄存器描述里有這樣一段話(紅框內),這段話的意思是向量表首地址需要按 0x80 向上對齊(還得是 2 的整數(shù)冪)以覆蓋項目中實際用到的數(shù)值最大中斷號(xxx_IRQn)。

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

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

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

因為 i.MXRT1011 里一共 96 個中斷,按規(guī)定,中斷向量表首地址至少要按 0x200 對齊。我們現(xiàn)在故意不按規(guī)定來設對齊,先選擇一個測試工程 SDK_2.10.0_EVK-MIMXRT1010oardsevkmimxrt1010demo_appshello_worldiar(flexspi_nor_build),修改 hello_world.c 文件,加一個 relocate_vector_table() 函數(shù),將中斷向量表重定向到 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();

//其余代碼
}

萬事俱備,我們現(xiàn)在需要使能一些中斷來驗證,痞子衡分別選取了 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 實際響應的中斷函數(shù)卻是 MemManage、SysTick、DMA13 位置,這里出現(xiàn)了異常。

#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 實際響應的中斷函數(shù)卻是 SysTick、DMA10 位置,還是出現(xiàn)了異常。

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

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

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

#defineNEW_VECTOR_ADDRESS(0x00000180)

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

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

#defineNEW_VECTOR_ADDRESS(0x00000200)

2.5 測試結果總結

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

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

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

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

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

    關注

    31

    文章

    5495

    瀏覽量

    127800
  • 函數(shù)
    +關注

    關注

    3

    文章

    4400

    瀏覽量

    66369
  • Cortex-M
    +關注

    關注

    2

    文章

    232

    瀏覽量

    30826

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    中斷向量表中,數(shù)字較小的中斷向量能否以 larg 中斷中斷向量

    中斷向量表中,數(shù)字較小的中斷向量能否以 larg 中斷中斷向量
    發(fā)表于 08-21 08:17

    請問NuMicro? Cortex-M? 系列芯片是否支持 I2C 監(jiān)視器功能?

    NuMicro? Cortex-M? 系列芯片是否支持 I2C 監(jiān)視器功能?
    發(fā)表于 08-21 06:04

    AT32 IAP using the USART

    的復位中斷向量起始地址為 0x08000004+N+M),跳轉至新寫入程序的復位向量表,取出新程序的復位中斷向量的地址,并跳轉執(zhí)行新程序的復位中斷
    發(fā)表于 07-11 10:51

    第八章 啟動文件詳解

    本章講解了W55MH32的啟動文件,其由匯編編寫,系統(tǒng)上電后首執(zhí)行,完成初始化堆棧、中斷向量表、配置系統(tǒng)時鐘等工作,還介紹了常用ARM匯編指令及代碼結構。
    的頭像 發(fā)表于 05-22 16:52 ?1824次閱讀
    第八章 啟動文件詳解

    【RA-Eco-RA4M2開發(fā)板評測】RA-Eco-RA4M2 按鍵操作

    表。 Table 2?1 中斷向量表(部分) NVIC 中斷控制器 RA4M2的中斷如此之多,配置起來并不容易,因此我們需要個強大而方便
    發(fā)表于 04-27 23:09

    一天一個嵌入式面試知識(1:中斷處理機制詳解)

    事件(如定時器溢出)發(fā)送中斷請求(IRQ)。 中斷使能:在NVIC(嵌套向量中斷控制器)中開啟對應中斷通道。
    發(fā)表于 03-21 10:18

    瑞薩RA8快速上手指南:Cortex-M85內核瑞薩RA8開發(fā)環(huán)境搭建 并點亮個LED

    因為Cortex-M內核,瑞薩RA8系列單片機支持多種市面上常見的開發(fā)環(huán)境,像Keil MDK、IAR EWARM等,而本文講述的是瑞薩自家官方的IDE(e2 studio)。
    的頭像 發(fā)表于 03-17 14:35 ?1319次閱讀
    瑞薩RA8快速上手指南:<b class='flag-5'>Cortex-M</b>85內核瑞薩RA8開發(fā)環(huán)境搭建 并點亮<b class='flag-5'>一</b>個LED

    Arm Cortex-A320 CPU助力嵌入式設備實現(xiàn)高能效AI計算

    ,要確定適合特定 AI 應用的處理器,系統(tǒng)開發(fā)者需要通過比較基于 Arm Cortex-A、Arm Cortex-M 和 Arm Ethos-U NPU 的設備及其可能的搭配進行決策。除了成本的考量,開發(fā)者還需了解各款處理器具備
    的頭像 發(fā)表于 02-27 17:17 ?1011次閱讀
    Arm <b class='flag-5'>Cortex</b>-A320 CPU助力嵌入式設備實現(xiàn)高能效AI計算

    程序中斷的100種寫法

    。 信號處理:在Unix/Linux系統(tǒng)中,通過信號(signal)處理機制實現(xiàn)中斷。 異常處理:由程序中的異常(如除零錯誤、段錯誤)觸發(fā)。 3. 中斷控制器配置 中斷向量表:在嵌入式系統(tǒng)中,通過配置
    發(fā)表于 01-28 08:25

    pga900用GPIO輸出測試,打開中斷程序就飛了,為什么?

    IAR下,PGA900軟件寫好,REMAP定位后,用j_link下載程序到DEVRAM (0X21000000)正常,中斷向量也正常。DEBUG調試主程序執(zhí)行正常,可用GPIO輸出測試證明。問題是
    發(fā)表于 12-11 06:37

    KiCad的對齊工具不好用?

    “ ?不存在的。唯的原因是您還沒有學會怎么用。 ? ” 對齊命令在哪里? KiCad的對齊命令(Align)藏得比較隱蔽,既不在菜單欄,也不在工具欄。右鍵的菜單中默認也不存在。只有當您 選中兩個或
    的頭像 發(fā)表于 12-04 18:15 ?1678次閱讀
    KiCad的<b class='flag-5'>對齊</b>工具不好用?

    如何使用Ozone分析Cortex-M異常

    Ozone可以幫助用戶快速分析和查找導致CPU故障的軟件bug。本文解釋如何使用Ozone的調試功能,深入了解Cortex-M架構上的這些錯誤。
    的頭像 發(fā)表于 11-29 11:14 ?2220次閱讀
    如何使用Ozone分析<b class='flag-5'>Cortex-M</b>異常

    關于中斷知識學習總結筆記

    中斷向量表項錯誤地指向了個無效地址或其他無關中斷服務程序的地址,那么當外部中斷 0 觸發(fā)時,系統(tǒng)就會陷入混亂狀態(tài),無法正常響應中斷事件
    發(fā)表于 11-23 11:23

    如何做個hpm6750evk2的bootloader?

    在哪里????。?!新手小白被折磨好幾天了,在哪里修改中斷向量表呢?和鏈接腳本該怎么改? 我修改過鏈接腳本的__app_load_addr__變量加上了0x00100000,但是效果和上文說的樣。
    發(fā)表于 10-23 19:01

    HPM6750 Bootloader設計

    在哪里?。浚。?!新手小白被折磨好幾天了,在哪里修改中斷向量表呢?和鏈接腳本該怎么改? 我修改過鏈接腳本的__app_load_addr__變量加上了0x00100000,但是效果和上文說的
    發(fā)表于 10-23 18:59