日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

ARM 之六 Cortex-M 内核中断/异常系统、中断优先级/嵌套 详解

發(fā)布時(shí)間:2024/10/14 windows 91 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARM 之六 Cortex-M 内核中断/异常系统、中断优先级/嵌套 详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問題

最近在使用STM32F3芯片的時(shí)候,遇到這樣一個(gè)問題:如果外部中斷來的頻率足夠快,上一個(gè)中斷沒有處理完成,新來的中斷如何處理? 在調(diào)試時(shí),發(fā)現(xiàn)有中斷有 掛起、激活、失能等狀態(tài),考慮這些狀態(tài)都是干啥用的呢!他們是Cortex-M核所共有的,因此這里不針對(duì)與具體用的STM32 MCU,直接上升到 Cortex-M內(nèi)核來了解一下!

簡(jiǎn)介

??中斷(也稱為“異常”)是微控制器一個(gè)很常見的特性。中斷一般是由硬件(例如外設(shè)、外部引腳)產(chǎn)生,當(dāng)中斷產(chǎn)生以后 CPU 就會(huì)中斷當(dāng)前的程序執(zhí)行流程轉(zhuǎn)而去處理中斷服務(wù)中指定的操作。
??所有的Cortex-M 內(nèi)核都會(huì)系統(tǒng)一個(gè)用于中斷處理的組件:NVIC(Nested Vectored Interrupt Controller,嵌套向量中斷控制器)。它處理處理中斷,還處理其他需要服務(wù)的事件(例如 SVC 指令),通常稱為“異?!?。 ? 按照 ARM 的說法,中斷也是一種異常。

Cortex-M3和 Cotex-M4 的 NVIC 最多支持 240 個(gè) IRQ(中斷請(qǐng)求)、1 個(gè)不可屏蔽中斷(NMI)、1 個(gè) Systick(滴答定時(shí)器)定時(shí)器中斷和多個(gè)系統(tǒng)異常。而 Cortex-M0 最多支持32個(gè)IRQ、1 個(gè)不可屏蔽中斷(NMI)、1 個(gè) Systick(滴答定時(shí)器)定時(shí)器中斷和多個(gè)系統(tǒng)異常。

  • IRQ: 多數(shù)由定時(shí)器、IO端口、通信接口等外設(shè)產(chǎn)生
  • NMI: 通常由看門狗定時(shí)器或者掉電檢測(cè)器等外設(shè)產(chǎn)生
  • 其他: 主要來自系統(tǒng)內(nèi)核

注意,本文所說的 Cortex-M 主要指定是 Cotex-M3和 Cotex-M4。

Cortex-M0、Cortex-M0+、Cortex-M1 基于 ARMv6-M。與Cotex-M3和 Cotex-M4相比,他們的指令集較小。而且,Cortex-M1 是專門為FPGA應(yīng)用設(shè)計(jì)的,沒有獨(dú)立MCU。

異常類型

??Cortex-M 處理器的異常中,編號(hào) 1~15 的為系統(tǒng)異常,16及以上的則為中斷輸入。所有終端機(jī)部分系統(tǒng)異常都具有可編程的優(yōu)先級(jí)。部分系統(tǒng)異常具有固定優(yōu)先級(jí)。ARM給出了以下一張表:

類型位置優(yōu)先級(jí)描述
0在復(fù)位時(shí)棧頂從向量表的第一個(gè)入口加載
Reset 復(fù)位1-3(最高)在上電和熱復(fù)位(warm reset)時(shí)調(diào)用,在第一條指令上優(yōu)先級(jí)降到最低(線程模式),異步的
Non-maskable Interrupt 不可屏蔽中斷(NMI)2-2不能被除復(fù)位之外的任何異常停止或占先。異步的。
Hard Fault 硬故障3-1由于優(yōu)先級(jí)的原因或可配置的故障處理被禁止而導(dǎo)致不能將故障激活時(shí)的所有類型故障,同步的
Memory Management 存儲(chǔ)器管理4可配置MPU 不匹配,包括違反訪問規(guī)范以及不匹配,是同步的,即使MPU 被禁止或不存在,也可以用它來支持默認(rèn)的存儲(chǔ)器映射的XN 區(qū)域
Bus Fault 總線故障5可配置預(yù)取指故障,存儲(chǔ)器故障,以及其它相關(guān)的地址/存儲(chǔ)故障,精確時(shí)是同步,不精確時(shí)時(shí)異步
Usage Fault 使用故障6可配置使用故障,例如,執(zhí)行未定義的指令或嘗試不合法的狀態(tài)轉(zhuǎn)換,是同步的
7~10保留
SVCall 系統(tǒng)服務(wù)調(diào)用11可配置利用SVC 指令調(diào)用系統(tǒng)服務(wù),是同步的
Debug Monitor 調(diào)試監(jiān)控12可配置調(diào)試監(jiān)控,在處理器沒有停止時(shí)出現(xiàn),是同步的,但只有在使能時(shí)是有效的,如果它的優(yōu)先級(jí)比當(dāng)前有效的異常的優(yōu)先級(jí)低,則不能被激活
13保留
PendSV 可掛起的系統(tǒng)服務(wù)請(qǐng)求14可配置可掛起的系統(tǒng)服務(wù)請(qǐng)求,是異步的,只能由軟件來實(shí)現(xiàn)掛起
SysTick 系統(tǒng)節(jié)拍定時(shí)器15可配置系統(tǒng)節(jié)拍定時(shí)器(System tick timer)已啟動(dòng),是異步的
External Interrupt 外部中斷16 及以上可配置在內(nèi)核的外部產(chǎn)生(外部設(shè)備),INTISR[239:0],通過NVIC(設(shè)置優(yōu)先級(jí))輸入,都是異步的

??針對(duì) Cortex-M 系列的內(nèi)核,ARM 提供了一套叫做 CMSIS 的東西。目前,所有的MCU均使用CMSIS 作為編程基礎(chǔ)。在 CMSIS-Core 中,中斷標(biāo)識(shí)有中斷枚舉實(shí)現(xiàn),從數(shù)值 0 開始(代表中斷#0)。其中,系統(tǒng)異常的編號(hào)為負(fù)數(shù)。具體如下:

CMSIS-Core之所以使用另外一種編號(hào)系統(tǒng),是因?yàn)檫@樣可以稍微提高部分API的效率。中斷的編號(hào)和枚舉定義是同設(shè)備相關(guān)的,他們位于微控制器供應(yīng)商提供的頭文件中,在一個(gè)名為IRQn的typedef段中。

中斷處理(異常處理)

??當(dāng)某種內(nèi)部或外部事件發(fā)生時(shí),MCU 的中斷系統(tǒng)將迫使 CPU 暫停正在執(zhí)行的程序,轉(zhuǎn)而去進(jìn)行中斷事件的處理,中斷處理完畢后,又返回被中斷的程序處,繼續(xù)執(zhí)行下去。
??主程序正在執(zhí)行,當(dāng)遇到中斷請(qǐng)求(Interrupt Request)時(shí),暫停主程序的執(zhí)行轉(zhuǎn)而去執(zhí)行中斷服務(wù)例程(Interrupt Service Routine,ISR),稱為響應(yīng),中斷服務(wù)例程執(zhí)行完畢后返回到主程序斷點(diǎn)處并繼續(xù)執(zhí)行主程序。多個(gè)中斷是可以進(jìn)行嵌套的。正在執(zhí)行的較低優(yōu)先級(jí)中斷可以被較高優(yōu)先級(jí)的中斷所打斷,在執(zhí)行完高級(jí)中斷后返回到低級(jí)中斷里繼續(xù)執(zhí)行。

中斷管理

??管理中斷所使用的大部分寄存器都位于NVIC(Nested Vectored Interrupt Controller,嵌套向量中斷控制器)和SCB(System Control Block,系統(tǒng)控制塊)中。實(shí)際上,SCB是作為NVIC的一部分來實(shí)現(xiàn)的,不過在CMSIS-Core中,將其定義在了獨(dú)立的結(jié)構(gòu)體中。除此之外,處理器內(nèi)核中還有用于中斷屏蔽寄存器:PRIMASK、FAULTMASK、BASEPRI。
NVIC和SCB位于系統(tǒng)控制空間,地址從0xE000E00開始,大小4KB。SCB中還有SysTick定時(shí)器,存儲(chǔ)器保護(hù)單元等。

優(yōu)先級(jí)

這部分暫且不說!

中斷輸入和掛起

在Cortex-M內(nèi)核中,每個(gè)中斷都具有多個(gè)屬性:

  • 每個(gè)中斷都可以被禁止(默認(rèn))或者使能
  • 每個(gè)中斷都可以別掛起或者解除掛起
  • 每個(gè)中斷都可以處于活躍或者非活躍

這些狀態(tài)屬性具有多種可能的組合。例如,在處理中斷時(shí),可以將其禁止,若在中斷提出掐產(chǎn)生了同一個(gè)中斷的新請(qǐng)求,由于該活躍中斷被禁止了,那就會(huì)處于掛起狀態(tài)。
??NVIC在設(shè)計(jì)上既支持產(chǎn)生 脈沖中斷請(qǐng)求 的外設(shè),也支持產(chǎn)生 高電平中斷請(qǐng)求 的外設(shè)。無需配置任何一個(gè) NVIC 寄存器以選擇其中一種中斷類型。對(duì)于脈沖中斷請(qǐng)求,脈沖寬度至少要為一個(gè)時(shí)鐘周期;而對(duì)于電平觸發(fā)的請(qǐng)求,在ISR中的操作清湖請(qǐng)求之前,請(qǐng)求服務(wù)的外設(shè)要一直保持電平信號(hào)(如寫入寄存器以清除中斷請(qǐng)求) 。盡管外部中斷請(qǐng)求在 I/O 引腳上的電平可能是低電平有效,但是 NVIC 收到的額請(qǐng)求信號(hào)為高有效!
??中斷的掛起狀態(tài)被存儲(chǔ)在 NVIC 的可編程寄存器中,當(dāng) NVIC 的中斷輸入被確認(rèn)后,它就會(huì)引發(fā)該中斷的掛狀態(tài)。即便中斷請(qǐng)求被取消,掛起狀態(tài)仍會(huì)為高。這樣,NVIC 就可以處理脈沖中斷請(qǐng)求了。
??掛起狀態(tài)的意思是,中斷被置于一種等待處理器處理的狀態(tài)。有些情況下,處理器在中斷掛起時(shí)就會(huì)進(jìn)行處理。不過,若處理器已經(jīng)在處理另外一個(gè)更高或同優(yōu)先級(jí)的中斷,或者中斷被某個(gè)中斷屏蔽寄存器給屏蔽掉了,那么在其他的中觀處理結(jié)束前或者中斷屏蔽被清除前,掛起請(qǐng)求會(huì)一直保持。
??當(dāng)中斷開始處理中斷請(qǐng)求時(shí),中斷的請(qǐng)求信號(hào)會(huì)被自動(dòng)清除。當(dāng)中斷正在被處理時(shí),它就會(huì)處于活躍狀態(tài)。

當(dāng)中斷處于活躍狀態(tài)時(shí),處理器無法再中斷完成和異常返回前再次處理同一個(gè)中斷請(qǐng)求。
??中斷的掛起狀態(tài)位于中斷掛起狀態(tài)寄存器中,軟件可以方位這些寄存器。因此,可以手動(dòng)清除或者設(shè)置中斷的掛起狀態(tài)。若中斷請(qǐng)求產(chǎn)生時(shí)處理器正在處理另一個(gè)具有更高優(yōu)先級(jí)的中斷,而在處理器對(duì)該中斷請(qǐng)求做出響應(yīng)之前,掛起狀態(tài)被清除掉了,則該中斷會(huì)被取消且不會(huì)再得到處理。

若持續(xù)保持某個(gè)中斷請(qǐng)求,那么及時(shí)軟件嘗試清除該掛起狀態(tài),掛起狀態(tài)還是會(huì)再次被置位的。

若中斷已經(jīng)得到了處理,中斷源仍然在繼續(xù)保持中斷請(qǐng)求,那么這個(gè)中斷就會(huì)再一次進(jìn)入掛起狀態(tài)且再次得到處理

對(duì)于脈沖中斷請(qǐng)求,若在處理器開始處理前,中斷請(qǐng)求信號(hào)產(chǎn)生了多次,他們會(huì)被當(dāng)做一次中斷請(qǐng)求處理

中斷掛起狀態(tài)可以在其正在被處理時(shí)再次置位。之前的中斷請(qǐng)求正在被處理時(shí)產(chǎn)生了新的請(qǐng)求,這樣機(jī)會(huì)引發(fā)新的掛起狀態(tài)。處理器在前一個(gè)ISR結(jié)束后需要再次處理這個(gè)中斷。

即使中斷被禁止了,他的掛起狀態(tài)仍然可置位。 這種情況下,若中斷稍后被使能了,它仍然可以被觸發(fā)并被得到處理。這種情況可能不是我們需要的,因此需要在使能NVIC中斷前手動(dòng)清除掛起狀態(tài)。

參考

  • The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors, 3rd Edition
  • The De?nitive Guide to the Cortex-M0
  • 總結(jié)

    以上是生活随笔為你收集整理的ARM 之六 Cortex-M 内核中断/异常系统、中断优先级/嵌套 详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。