日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

一文了解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 個向量開始是廠商自定義外設(shè)中斷,IRQ 編號為 0 到 n
   - 對于 Cortex-M0/0+/1,    ARM 建議的 n 值最大為 15(實(shí)際一般廠商都會擴(kuò)展)
   - 對于 Cortex-M3/4/7/23,  ARM 建議的 n 值最大為 239
   - 對于 Cortex-M33/35P/55, ARM 建議的 n 值最大為 479

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

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

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

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

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

因?yàn)?i.MXRT1011 里一共 96 個中斷,按規(guī)定,中斷向量表首地址至少要按 0x200 對齊。我們現(xiàn)在故意不按規(guī)定來設(shè)對齊,先選擇一個測試工程 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)在需要使能一些中斷來驗(yàn)證,痞子衡分別選取了 SysTick、LPUART1、GPT2、WDOG2、TEMP_LOW_HIGH、WDOG1 六個中斷,它們的使能代碼都可以從 SDKoardsevkmimxrt1010driver_examples 里找到,這里不予贅述。

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

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

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

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

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

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

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

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

#defineNEW_VECTOR_ADDRESS(0x00000180)

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

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

#defineNEW_VECTOR_ADDRESS(0x00000200)

2.5 測試結(jié)果總結(jié)

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

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

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

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

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

    關(guān)注

    31

    文章

    5620

    瀏覽量

    130455
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4422

    瀏覽量

    67873
  • Cortex-M
    +關(guān)注

    關(guān)注

    2

    文章

    234

    瀏覽量

    31197

原文標(biāo)題:一文了解Cortex-M中斷向量表對齊原則

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    S32K144在IAR下,當(dāng)中斷向量表不在位置0時(shí),仍然可以進(jìn)行調(diào)試,具體的原則和流程是什么?

    在IAR下,當(dāng)中斷向量表不在位置0時(shí),仍然可以進(jìn)行調(diào)試。具體的原則和流程是什么?
    發(fā)表于 03-20 07:01

    Cortex-M0和Cortex-M0+的區(qū)別

    ),但是只使用了Thumb ISA的個子集(56條指令),多數(shù)指令是16位,只有少數(shù)些事32位。 般來說,盡管指令具有不同大小,Cortex-M處理器可被歸為精簡指令集架構(gòu)。 支
    發(fā)表于 01-22 06:23

    最小化ARM Cortex-M CPU功耗的方法與技巧分享

    存儲器,進(jìn)步降低整體系統(tǒng)功耗)。   2 中斷控制器節(jié)能技術(shù)   Cortex-M架構(gòu)中的中斷控制器(Nested Vectored Interrupt Controller o
    發(fā)表于 01-21 06:19

    Cortex-M3工作模式及異常

    ,除了 SysTick的之外,全都連接到 NVIC 的中斷輸入信號線。典型情況下,處理器般支持 16 到 32 個中斷。 類型編號為 1-15 的系統(tǒng)異常,從 16 開始是外部中斷
    發(fā)表于 01-20 08:24

    Cortex-M0 處理器介紹

    。作為新代的處理器,Cortex-M0的設(shè)計(jì)進(jìn)行了許多的改革與創(chuàng)新,如系統(tǒng)存儲器地址映像(system address map)、改善效率并增強(qiáng)確定性的嵌套向量中斷系統(tǒng)(NVIC)與
    發(fā)表于 01-16 08:04

    CW32F030中斷解析

    可編程的優(yōu)先級 ?低延時(shí)的異常和中斷處理 ?支持中斷嵌套 ?中斷向量表重映射 3 中斷優(yōu)先級 外部中斷可設(shè)置 4 級優(yōu)先級,最高優(yōu)先級為“0
    發(fā)表于 01-12 08:41

    在使用CW32L083系列微控制器時(shí)如何配置中斷向量表?

    在使用CW32L083系列微控制器時(shí),如何配置中斷向量表?
    發(fā)表于 12-15 06:17

    如何在CW32F030上實(shí)現(xiàn)IAP功能實(shí)現(xiàn)遠(yuǎn)程升級?

    FLASH 中存放的地址,本例設(shè)置為 0x00002000。這樣用戶程序的中斷向量表就被重定位到 0x00002000 處,與 ARM?Cortex?-M0+ 內(nèi)核默認(rèn)的中斷向量表
    發(fā)表于 12-11 06:15

    Cortex-M產(chǎn)品的特色

    的處理能力。 中斷控制器:Cortex-M處理器內(nèi)置了靈活的中斷控制器,能夠支持多種中斷優(yōu)先級和高效的中斷處理機(jī)制。 訪問控制單
    發(fā)表于 11-26 07:22

    Cortex-M內(nèi)核中的精確延時(shí)的方法

    使用 CYCCNT寄存器來測量執(zhí)行某個任務(wù)所花的周期數(shù),這也可以用作時(shí)間基準(zhǔn)相關(guān)的目的(操作系統(tǒng)中統(tǒng)計(jì) CPU使用率可以用到它)。” Cortex-M中的DWT它有個32位的寄存器叫CYCCNT
    發(fā)表于 11-21 07:51

    Cortex-M級別的轉(zhuǎn)換

    、 簡述 Cortex-M 里面有特權(quán)級別的概念,不同級別可以設(shè)定不同的權(quán)限,如何轉(zhuǎn)換特權(quán)級別基本是本章的內(nèi)容。 二、操作模式 ARM M 核操作模式有兩個: 線程(Thread)模式:在復(fù)位時(shí)或
    發(fā)表于 11-19 07:32

    RVMCU課堂「10」: 手把手教你玩轉(zhuǎn)RVSTAR—處理器內(nèi)部中斷

    /quickstart-doc-u-nuclei_interrupt_quickstart.html)進(jìn)行學(xué)習(xí)。 6 mtimer_irq_handler 第六個參數(shù)配置的是中斷處理函數(shù)。在講解此參數(shù)前,需要中斷向量表
    發(fā)表于 10-31 06:12

    中斷向量表中,數(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

    的復(fù)位中斷向量起始地址為 0x08000004+N+M),跳轉(zhuǎn)至新寫入程序的復(fù)位向量表,取出新程序的復(fù)位中斷向量的地址,并跳轉(zhuǎn)執(zhí)行新程序的復(fù)位中斷
    發(fā)表于 07-11 10:51
    西华县| 岱山县| 阿荣旗| 怀安县| 那曲县| 大厂| 康马县| 永福县| 博爱县| 历史| 吴川市| 四川省| 牡丹江市| 正宁县| 巨野县| 浦江县| 东辽县| 云阳县| 金寨县| 崇信县| 大余县| 定州市| 特克斯县| 四会市| 安多县| 龙里县| 谷城县| 彰武县| 芒康县| 丰城市| 遵化市| 赤水市| 惠安县| 延川县| 德兴市| 石渠县| 平远县| 洞口县| 定边县| 渭源县| 丹棱县|