CPU(MCU)的重要機制 中斷

2022-09-23 21:48:18 字數 1480 閱讀 3605

既然說到中斷,那就提一下,為什麼會有這東西產生,前面我們講cpu的結構時候都會這麼來說,任何事物的產生都有其由來。

最初應該是只有輪詢這麼一種機制,這在cpu處理問題時候可以想到比如我按了乙個按鍵,我就要cpu給我乙個響應,很容易想到的是cpu不斷的去查詢,當查詢到按鍵發生時候就會給出乙個響應,只要查詢時間足夠快,總可以使這件事情及時響應。但隨著cpu的發展,需要處理的不單單是按鍵乙個事,還有定時阿,各種通訊接收阿,都需要cpu給出響應,若是再採用輪詢的方法,很容易就會顧此失彼,一段時間只能服務一件事,而大多時間cpu則處於空閒,浪費了很多資源。於是人們就提出了中斷的概念來解決這一問題,就是cpu你忙你的,我只有當按鍵按下時通知你,這時你才放下手頭事情來處理這個按鍵對應的操作,處理完這個按鍵後,又返回到原來手頭的事情接著做。這一過程分解開來,就分解了以下幾個過程:

由硬體來判斷是否發生外部事件並通知cpu(這點需要強調的是中斷是有硬體來判斷的,比如我們來設定中斷時,往往針對相應的暫存器設定中斷開關,是哪個中斷源)

由中斷服務程式來處理事件(這裡需要強調的一點,比如遇到按鍵按下了,接下來該幹什麼,cpu會查中斷向量表,該幹什麼在中斷是叫中斷服務程式,它與寫在main函式裡的大部分程式不同,它是由cpu來處理的,比如當某個中斷發生時,cpu就會轉去處理這個相應的函式,那麼這又是如何進行的呢,這就用到了中斷向量表這麼乙個東西,幾乎每個mcu都有這個,中斷向量表為cpu裡一段連續的儲存空間,每個中斷在向量表中都有相應的表項,該表項可寫中斷服務程式的入口位址,也就是我們cpu轉去處理那個程式的第一條指令的位址,換句話說,c程式中函式就代表了指向該段程式的第一條指令的位址的指標,前面講到該函式只能由硬體處理,而且不能被主函式呼叫,所以其無返回值也無引數。

前面講了中斷執行完要返回到原來狀態執行的,這時就需要將現場儲存下來,也就是壓棧,當處理完後又出棧,這麼一種機制,但由於中斷與程式不同,程式在編譯時候,它又是順序執行的,相當於每個時間點處理哪個都規定了下來,所用到的暫存器也提早確定了下來,所以其壓棧出棧就容易許多,而中斷由於是硬體來處理,其用到的暫存器根據不同中斷又有所區別,而且通常比我們普通程式需要壓棧的東西多(特別在涉及到中斷巢狀時候,不過還好中斷源畢竟有限,就限制了中斷的數量,涉及到中斷優先順序容易發生巢狀,高的優先順序打斷低的)。還是回來說中斷的壓棧把,中斷比較有意思,它的還原現場叫做儲存位址和暫存器上下文(register context),如下圖所示:

解釋一下上面的說明:

由於中斷可能在任何時候,任何執行的位置打斷主程式的執行,而主程式的執行是一條條機器指令對暫存器的改寫,所以在中斷時候需要對這些暫存器進行儲存現場,那到底該儲存哪些暫存器呢,如果儲存所有不就可以了,這個想法是ok的,但實際考慮到cpu執行時間的效率(壓棧的時間)和資源利用(棧的空間使用)的考慮,cpu只對一部分的暫存器進行了壓棧(如arm cortex核心的mcu就只對r0,r1,r2,r3,r12,lr,pc,xpsr,這在datasheet中也有說明,若是操作中用到了其他暫存器則使用者需自己壓棧和出棧)

Linux中斷機制

中斷 interrupt 被定義為乙個事件,該事件改變處理器執行的指令順序,這樣的事件與cpu晶元內外部硬體電路產生的電訊號相對應。中斷通常分為同步 synchronous 中斷和非同步 asynchronous 中斷。同步中斷指的是當指令執行時由cpu控制單元產生的,之所以稱為同步,是因為只有在一...

8 執行緒的中斷機制

執行緒的thread.interrupt 方法是中斷執行緒,將會設定該執行緒的中斷狀態位,即設定為true,中斷的結果執行緒是死亡 還是等待新的任務或是繼續執行至下一步,就取決於這個程式本身。執行緒會不時地檢測這個中斷標示位,以判斷執行緒是否應該被中斷 中斷標示值是否為true 判斷某個執行緒是否已...

linux核心的中斷機制

上半部中斷不能巢狀,中斷被禁止,要盡量短,處理一些重要的事情,通常是改變一些標誌狀態 下半部的中斷可以巢狀,有三種處理的方式 softirq tasklet workqueue工作佇列 中斷頂半部函式,禁止中斷,不可巢狀 通過request irq 申請 中斷處理函式是被硬體請求執行的核心 所以它屬...