cortex-m3在核心水平上搭載了乙個異常響應系統,支援為數眾多的系統異常和外部中斷。
其中,編號1-15的對應系統異常,大於等於16的則都是外部中斷
除了個別異常的優先順序被定死之外,其餘異常的優先順序都是可程式設計的
我們通常把能夠打斷正常執行流的事件稱之為異常
異常的概念中包含了中斷的概念,即中斷是異常的子集
異常與中斷的觸發都是硬體支援的
編號型別
優先順序簡介
0n/a
n/a沒有異常在執行1復位
-3(最高優先順序)復位2
nmi-2
不可遮蔽中斷(來自外部nmi輸入腳)
3硬(hard)fault
-1所有被除能的fault,都將上訪(escalation)成為硬fault,只要faultmask沒有置位,硬fault服務例程就會被強制執行,fault被除能的原因包括被禁用,或者faultmask被置位
4memmanage fault
可程式設計儲存器管理fault,mpu訪問犯規以及訪問了非法的位置均可以引發,企圖在非執行區取值也會引發該錯誤。
5匯流排fault
可程式設計從匯流排系統收到了錯誤響應,原因可以是預取流產(abort)或資料流產,或者企圖訪問協處理器
6用法fault
可程式設計由於程式錯誤導致的異常,通常是使用了一條無效的指令,或是非法的狀態轉換,例如嘗試切換到arm狀態
7-10
保留n/a
n/a11
svcall
可程式設計執行系統服務呼叫指令(svc)引發的異常
12除錯監視器
可程式設計除錯監視器(斷點,資料觀察點,或是外部除錯請求)
13保留
n/an/a
14pendsv
可程式設計為系統裝置而設的「可懸掛請求」(pendable request)
15systick
可程式設計系統滴答定時器(週期性溢位的時基定時器)
##### 外部中斷表
編號型別
優先順序簡介
16irq #0
可程式設計外中斷#0
17irq #1
可程式設計外中斷#1……
……255irq #239
可程式設計外中斷#2
#### 優先順序
原則上,cm3支援3個固定的高優先順序和多達256級的可程式設計優先順序,並且支援128級搶占優先順序和128級亞優先順序
1.搶占優先順序及高搶占優先順序 任務可以打斷正在執行的低搶占優先順序任務,而讓cpu轉而執行高搶占優先順序的任務
2.亞優先順序則為多個相同的搶占優先順序,不同的亞優先順序的任務同時請求異常時,cpu會執行高亞優先順序的任務。
3.搶占優先順序有時也被稱為「先佔優先順序」
4.「亞優先順序」會被稱為「響應優先順序」或「子優先順序」
#### 中斷與掛起
當中斷輸入腳被assert(確認有效後),該中斷就被掛起,即使後來中斷源取消了中斷請求,已經被標記為掛起的中斷也會被記錄下來。到了系統中它的優先順序達到最高是,就會得到響應。但如果在某個中斷得到相應之前,他的懸起狀態被清除了(例如在primask或faultmask置位的時候軟體清除了懸起狀態標識),則中斷被取消。當某個中斷的服務例程開始執行的時候,則稱該中斷進入了活躍的狀態,他的掛起標誌位會被硬體自動清除。
#### svc和pendsv
svc(system service call):系統服務呼叫
svc異常是必須立即得到響應的,若因為優先順序不比當前正在處理的高,或是其他的原因使之無法立即響應,將會上訪為硬fault。
pendsv(pend system service):可掛起系統呼叫
pendsv則不同,它可以像普通中斷一樣被掛起。
pendsv的典型使用場合是在上下文切換的時候(即不同任務間的切換)
eg:
//任務 a 呼叫 svc 來請求任務切換(例如,等待某些工作完成)
//os 接收到請求,做好上下文切換的準備,並且 pend 乙個 pendsv 異常。(使用pendsv來進行上下文切換)
//當 cpu 退出 svc 後,它立即進入 pendsv,從而執行上下文切換。
//當 pendsv 執行完畢後,將返回到任務 b,同時進入執行緒模式。
//發生了乙個中斷,並且中斷服務程式開始執行(因為pendsv的優先順序最低,所以會中斷執行isr中的中斷請求)
//在 isr 執行過程中,發生 systick 異常,並且搶占了該 isr。(第15號異常,系統的滴答計時器)
//os 執行必要的操作,然後 pend 起 pendsv 異常以作好上下文切換的準備。
//當 systick 退出後,回到先前被搶占的 isr 中,isr 繼續執行
//isr 執行完畢並退出後,pendsv 服務例程開始執行,並且在裡面執行上下文切換
//當 pendsv 執行完畢後,回到任務 a,同時系統再次進入執行緒模式。(相當於在任務a中執行了乙個任務b)
cm3的中斷處理特點
兩個相同優先順序的中斷在交接的過程中,不需要執行斷點恢復和斷點資料恢復,直接跳轉到下乙個中斷執行
一般事件若想變成中斷事件,需要有相關中斷使能位的允許,中斷事件再向cpu執行對應的中斷請求,在nvic配置相應的中斷向量後,cpu便參與進行後續的中斷響應服務【儲存現場,執行中斷服務程式,恢復現場並返回】,非中斷時間就不會有後續的流程,只是有一些硬體觸發訊號或標誌的產生。
與之相互對應,既然乙個可以觸發中斷的事件可以被配置為中斷事件或非中斷事件,則相關事件的觸發方式,即允許產生中斷或禁止產生中斷
例如stm32的gpio口的電平跳變基本都是可以觸發外部中斷的,但在具體的使用配置過程中,可以根據需要來決定是啟用還是禁用相關引腳的功能,從而選擇不同的事件觸發方式。
STM32中異常 中斷 事件辨析
參考 cortex m3權威指南 中文 stm32參考手冊中文版 第10版 原話 cortex m3 在核心水平上搭載了乙個異常響應系統,支援為數眾多的系統異常和外部中斷。其中,編號為 1 15 的對應系統異常,大於等於 16 的則全是外部中斷。除了個別異常的優先順序被定死外,其它異常的優先順序都是...
中斷事件大致分為三類 「中斷」 嵌入式的靈魂
最近個人情緒不是很好,斷了好幾天,今天試著恢復每日一更。今天給大家講一下 中斷 乙個讓我剛開始接觸微控制器頭疼的概念,我相信也是很多初學者頭疼的地方,之所以頭疼只是因為他太過於抽象,本章我用形象的舉例來給大家講出來。注意 本章節我用arduino來講,選用它的原因是因為它的過程沒有那麼繁瑣,你不需要...
stm32異常 中斷和事件的區別
中斷和異常的區別 中斷是指系統停止當前正在執行的程式轉到其他的服務,可能是程式接收了比自身高優先順序的請求,或者是人為設定中斷,中斷是屬於正常現象。異常是指由於cpu本身故障 程式故障或者請求服務等引起的錯誤,異常屬於不正常現象。cortex m3核心總共支援256個中斷,其中包含16個核心異常和2...