異常與中斷的基本概念
異常是導致處理器脫離正常執行轉向執行特殊**的任何事件,如果不及時進行處理,輕則系統出錯,重則會導致系統毀滅性癱瘓。所以正確地處理異常,避免錯誤的發生是提高軟體魯棒性(穩定性)非常重要的一環,對於實時系統更是如此。
異常是指任何打斷處理器正常執行,並且迫使處理器進入乙個由有特權的特殊指令執行的事件。 異常通常可以分成兩類:同步異常和非同步異常。由內部事件(像處理器指令執行產生的事件)引起的異常稱為同步異常,例如造成被零除的算術運算引發乙個異常,又如在某些處理器體系結構中,對於確定的資料尺寸必須從記憶體的偶數字址進行讀和寫操作。從乙個奇數記憶體位址的讀或寫操作將引起儲存器訪問乙個錯誤事件並引起乙個異常(稱為校準異常) 。
非同步異常主要是指由於外部異常源產生的異常,是乙個由外部硬體裝置產生的事件引起的非同步異常。 同步異常不同於非同步異常的地方是事件的**,同步異常事件是由於執行某些指令而從處理器內部產生的, 而非同步異常事件的**是外部硬體裝置。 例如按下裝置某個按鈕產生的事件。同步異常與非同步異常的區別還在於,同步異常觸發後,系統必須立刻進行處理而不能夠依然執行原有的程式指令步驟;而非同步異常則可以延緩處理甚至是忽略,例如按鍵中斷異常,雖然中斷異常觸發了,但是系統可以忽略它繼續執行(同樣也忽略了相應的按鍵事件)。
中斷,中斷屬於非同步異常。 所謂中斷是指**處理器 cpu 正在處理某件事的時候,外部發生了某一事件,請求 cpu 迅速處理, cpu 暫時中斷當前的工作,轉入處理所發生的事件,處理完後,再回到原來被中斷的地方,繼續原來的工作,這樣的過程稱為中斷。
中斷能打斷任務的執行,無論該任務具有什麼樣的優先順序,因此中斷一般用於處理比較緊急的事件,而且只做簡單處理,例如標記該事件, 在使用 freertos 系統時,一般建議使用訊號量、訊息或事件標誌組等標誌中斷的發生,將這些核心物件發布給處理任務,處理任務再做具體處理。
通過中斷機制,在外設不需要 cpu 介入時, cpu 可以執行其他任務,而當外設需要cpu 時通過產生中斷訊號使 cpu 立即停止當前任務轉而來響應中斷請求。這樣可以使cpu 避免把大量時間耗費在等待、查詢外設狀態的操作上,因此將大大提高系統實時性以及執行效率。
freertos 原始碼中有許多處臨界段的地方,臨界段雖然保護了關鍵**的執行不被打斷,但也會影響系統的實時,任何使用了作業系統的中斷響應都不會比裸機快。比如,某個時候有乙個任務在執行中,並且該任務部分程式將中斷遮蔽掉,也就是進入臨界段中,這個時候如果有乙個緊急的中斷事件被觸發,這個中斷就會被掛起,不能得到及時響應,必須等到中斷開啟才可以得到響應,如果遮蔽中斷時間超過了緊急中斷能夠容忍的限度,危害是可想而知的。所以,作業系統的中斷在某些時候會有適當的中斷延遲,因此呼叫中斷遮蔽函式進入臨界段的時候,也需快進快出。 當然 freertos 也能允許一些高優先順序的中斷不被遮蔽掉,能夠及時做出響應,不過這些中斷就不受系統管理,也不允許呼叫 freertos 中與中斷相關的任何 api 函式介面。
freertos 的中斷管理支援:
開/關中斷。
恢復中斷。
中斷使能
中斷遮蔽。
可選擇系統管理的中斷優先順序。
與中斷相關的硬體可以劃分為三類:外設、中斷控制器、 cpu 本身。
外設:當外設需要請求 cpu 時,產生乙個中斷訊號,該訊號連線至中斷控制器。
中斷控制器:中斷控制器是 cpu 眾多外設中的乙個,它一方面接收其他外設中斷訊號的輸入,另一方面,它會發出中斷訊號給 cpu。可以通過對中斷控制器程式設計實現對中斷源的優先順序、觸發方式、開啟和關閉源等設定操作。在 cortex-m 系列控制器中常用的中斷控制器是 nvic(內嵌向量中斷控制器 nested vectored interrupt controller) 。
cpu: cpu 會響應中斷源的請求,中斷當前正在執行的任務,轉而執行中斷處理程式。nvic 最多支援 240 個中斷,每個中斷最多 256 個優先順序。
中斷號:每個中斷請求訊號都會有特定的標誌,使得計算機能夠判斷是哪個裝置提出的中斷請求,這個標誌就是中斷號。
中斷請求:「緊急事件」需向 cpu 提出申請,要求 cpu 暫停當前執行的任務,轉而處理該「緊急事件」,這一申請過程稱為中斷請求。
中斷優先順序:為使系統能夠及時響應並處理所有中斷,系統根據中斷時間的重要性和緊迫程度,將中斷源分為若干個級別,稱作中斷優先順序
中斷處理程式:當外設產生中斷請求後, cpu 暫停當前的任務,轉而響應中斷申請,即執行中斷處理程式。
中斷觸發:中斷源發出並送給 cpu 控制訊號,將中斷觸發器置「1」,表明該中斷源產生了中斷,要求 cpu 去響應該中斷, cpu 暫停當前任務,執行相應的中斷處理程式。
中斷觸發型別:外部中斷申請通過乙個物理訊號傳送到 nvic,可以是電平觸發或邊
沿觸發。
中斷向量:中斷服務程式的入口位址。
中斷向量表:儲存中斷向量的儲存區,中斷向量與中斷號對應,中斷向量在中斷向量表中按照中斷號順序儲存。
臨界段:**的臨界段也稱為臨界區,一旦這部分**開始執行,則不允許任何中斷打斷。為確保臨界段**的執行不被中斷,在進入臨界段之前須關中斷,而臨界段**執行完畢後,要立即開中斷。
當中斷產生時,處理機將按如下的順序執行
儲存當前處理機狀態資訊
載入異常或中斷處理函式到 pc 暫存器
把控制權轉交給處理函式並開始執行
當處理函式執行完成時,恢復處理器狀態資訊
從異常或中斷中返回到前乙個程式執行點
中斷使得 cpu 可以在事件發生時才給予處理,而不必讓 cpu 連續不斷地查詢是否有相應的事件發生。通過兩條特殊指令:關中斷和開中斷可以讓處理器不響應或響應中斷,在關閉中斷期間,通常處理器會把新產生的中斷掛起,當中斷開啟時立刻進行響應,所以會有適當的延時響應中斷,故使用者在進入臨界區的時候應快進快出。
中斷發生的環境有兩種情況:在任務的上下文中,在中斷服務函式處理上下文中
任務在工作的時候,如果此時發生了乙個中斷,無論中斷的優先順序是多大,都會打斷當前任務的執行,從而轉到對應的中斷服務函式中執行,
中斷延遲是指從硬體中斷發生到開始執行中斷處理程式第一條指令之間的這段時間。也就是:系統接收到中斷訊號到作業系統作出響應,並完成換到轉入中斷服務程式的時間。也可以簡單地理解為:(外部)硬體(裝置)發生中斷,到系統執行中斷服務子程式(isr)的第一條指令的時間。
中斷的處理過程是:外界硬體發生了中斷後, cpu 到中斷處理器讀取中斷向量,並且查詢中斷向量表,找到對應的中斷服務子程式( isr)的首位址,然後跳轉到對應的 isr去做相應處理。這部分時間,我稱之為:識別中斷時間。
在允許中斷巢狀的實時作業系統中,中斷也是基於優先順序的,允許高優先順序中斷搶斷正在處理的低優先順序中斷,所以,如果當前正在處理更高優先順序的中斷,即使此時有低優先順序的中斷,也系統不會立刻響應,而是等到高優先順序的中斷處理完之後,才會響應。而即使在不支援中斷巢狀,即中斷是沒有優先順序的,中斷是不允許被中斷的,所以,如果當前系統正在處理乙個中斷,而此時另乙個中斷到來了,系統也是不會立即響應的,而只是等處理完當前的中斷之後,才會處理後來的中斷。此部分時間,我稱其為:等待中斷開啟時間。
在作業系統中,很多時候我們會主動進入臨界段,系統不允許當前狀態被中斷打斷,故而在臨界區發生的中斷會被掛起,直到退出臨界段時候開啟中斷。此部分時間,我稱其為: 關閉中斷時間。
斷延遲可以定義為,從中斷開始的時刻到中斷服務例程開始執行的時刻之間的時間段。中斷延遲 =識別中斷時間 + [等待中斷開啟時間] + [關閉中斷時間]。
arm cortex-m 系列核心的中斷是由硬體管理的,而 freertos 是軟體,它並不接管由硬體管理的相關中斷(接管簡單來說就是,所有的中斷都由 rtos 的軟體管理,硬體來了中斷時,由軟體決定是否響應,可以掛起中斷,延遲響應或者不響應) ,只支援簡單的開關中斷等,所以 freertos 中的中斷使用其實跟裸機差不多的,需要我們自己配置中斷,並且使能中斷,編寫中斷服務函式,在中斷服務函式中使用核心 ipc 通訊機制,一般建議使用訊號量、訊息或事件標誌組等標誌事件的發生,將事件發布給處理任務,等退出中斷後再由相關處理任務具體處理中斷。
用 戶 可 以 自 定 義 配 置 系 統 可 管 理 的 最 高 中 斷 優 先 級 的 巨集 定 義
configlibrary_max_syscall_interrupt_priority , 它 是 用 於 配 置 內 核 中 的basepri 暫存器的,當 basepri 設定為某個值的時候, nvic 不會響應比該優先順序低的中斷,而優先順序比之更高的中斷則不受影響。就是說當這個巨集定義配置為 5 的時候,中斷優先順序數值在 0、 1、 2、 3、 4 的這些中斷是不受 freertos 遮蔽的, 也就是說即使在系統進入臨界段的時候,這些中斷也能被觸發而不是等到退出臨界段的時候才被觸發,當然,這些中斷服務函式中也不能呼叫 freertos 提供的 api 函式介面,而中斷優先順序在 5 到 15 的這些中斷是可以被遮蔽的,也能安全呼叫 freertos 提供的 api 函式介面。
在 arm cortex-m 系列處理器上,所有中斷都採用中斷向量表的方式進行處理,即當乙個中斷觸發時,處理器將直接判定是哪個中斷源,然後直接跳轉到相應的固定位置進行處理。而在 arm7、 arm9 中,一般是先跳轉進入 irq 入口,然後再由軟體進行判斷是哪個中斷源觸發,獲得了相對應的中斷服務例程入口位址後,再進行後續的中斷處理。arm7、 arm9 的好處在於,所有中斷它們都有統一的入口位址,便於 os 的統一管理。而arm cortex-m 系列處理器則恰恰相反,每個中斷服務例程必須排列在一起放在統一的位址上(這個位址必須要設定到 nvic 的中斷向量偏移暫存器中)。中斷向量表一般由乙個陣列定義(或在起始**中給出),在 stm32 上,預設採用起始**給出:
FreeRTOS 中斷管理
1.只有以 fromisr 或 from isr 結束的api函式或巨集才可以在中斷服務函式中使用。2.除互斥訊號量外,所有型別的訊號量都可以呼叫 xsemaphoretake 來獲取訊號量,但 xsemaphoretake 不能用在中斷服務函式中。3.計數訊號量的典型用法 事件計數 資源管理 4....
FreeRTOS之Cortex M中斷管理
一,cortex m核心的mcu都有nvic 1,中斷是由硬體產生的。2,與中斷有關的暫存器都在nvic和scb中。只能在特權級下訪問。3,cortex m3和m4的nvic最多支援240個irq 1個nmi 乙個systick定時器中斷和多個系統異常。4,在stm32f407的軟體工程的啟動檔案中...
FREERTOS學習筆記,中斷管理三
xqueuesendtofrontfromisr 該函式相當於任務中的xqueuesendtofront 的中斷呼叫安全版。xqueuesendtobackfromisr 該函式相當於任務中的xqueuesendtoback 的中斷呼叫安全版。xqueuereceivefromisr 該函式相當於任...