六 中斷機制

2022-05-06 16:45:12 字數 1979 閱讀 4799

中斷通常分為同步中斷和非同步中斷:

同步中斷:是當指令執行時由cpu控制單元產生,之所以稱之為同步,是因為只有在一條指令終止執行後cpu才會發出中斷

非同步中斷:是由其它硬體裝置依照cpu時鐘訊號隨機產生。

通常把同步中斷稱之為異常,把非同步中斷稱之為中斷 

非同步中斷可能為以下兩種:  

可遮蔽中斷:i/o裝置發出的所有中斷請求(irq)都產生可遮蔽中斷。

非遮蔽中斷:只有幾個危急的事件(如硬體故障)才引起非遮蔽中斷。非遮蔽中斷總是由cpu辯認的。 

異常(fault):根據cpu控制單元產生異常時儲存在核心態堆疊eip暫存器的值分為以下三種:

陷阱(trap):在陷阱指令執行後立即報告;核心把控制權返回給程式後就可以繼續它的執行而不失連貫性何存在eip中的值是乙個隨後要執行位址。只有當沒有必要重新執行已終止的指令時,才觸發陷阱。

異常終止:發生乙個嚴重的錯誤,控制單元出了問題,不能在eip暫存器中儲存引起異常指令所在的確切位置。異常中止用於報告嚴重的錯誤,如硬體故障或系統中無效的值或不一致的值。 

與linux裝置驅動中中斷處理相關的首先是申請與釋放irq的api request_irq()和freeirq()。

int request_irq(unsigned int irq, void (handler)(int irq, void dev_id, struct pt_regs regs), unsigned long irqflags, const

char * devname, void

dev_id);

void free_irq(unsigned int irq,void dev_id);

irq是要申請的硬體中斷號;

handler是向系統登記的中斷處理函式,是乙個**函式,中斷發生時,系統呼叫這個函式,devid引數將被傳遞;

irqflags是中斷處理的屬性,若設定sainterrupt,標明中斷處理程式是快速處理程式,快速處理程式被呼叫時遮蔽所有中斷,慢速處理程 序不遮蔽;若設定sashirq,則多個裝置共享中斷,devid在中斷共享時會用到,一般設定為這個裝置的device結構本身或者null。

devname設定中斷名稱,通常是裝置驅動程式的名稱  在cat /proc/interrupts中可以看到此名稱。

dev_id在中斷共享時會用到,一般設定為這個裝置的裝置結構體或者null。

下面詳細介紹linux 核心中斷機制處理過程。

1.linux定義了名字為irq_desc的中斷例程描述符表:(include/linux/irq.h)

struct irqdesc irq_desc[nr_irqs];

nr_irqs表示中斷源的數目。

2. irq_desc[]是乙個指向irq_desc結構的陣列, irq_desc結構是各個裝置中斷服務例程的描述符。

struct irq_desc ____cacheline_aligned;

irq_desc結構體中的成員action指向該中斷號對應的irqaction結構體鍊錶。irqaction結構體定義如下:

// include/linux/interrupt.h

struct irqaction

;

其中關鍵的handler成員指向了該裝置的中斷服務程式,由執行request_irq時建立。

3. 在驅動程式初始化時,若使用到中斷,通常呼叫函式request_irq()建立該驅動程式對應的irqaction結構體,並把它登記到irq_desc [irq_num]->action鍊錶中。iqr_num為驅動程式申請的中斷號。

4. 共享中斷的不同裝置的iqraction結構體都會新增進該中斷號對應的irq_desc結構體的action成員所指向的irqaction鍊錶內。當核心發生中斷時,它會依次呼叫該鍊錶內所有的handler函式。因此,若驅動程式需要使用共享中斷機制,其中斷處理函式必須有能力識別是否是自己的硬體產生了中斷。通常是通過讀取該硬體裝置提供的中斷flag標誌位進行判斷。

Linux驅動開發 8 中斷分層機制 軟中斷

1 概念 軟中斷是模擬硬體中斷的概念,實現巨集觀上的非同步執行效果。其實tasklet 也是基於軟中斷實現的。2 軟中斷和硬中斷的區別 a 硬中斷是外部裝置對cpu 的中斷,軟中斷時程式對核心的中斷 b 訊號是由核心 或者其他程序 對某個程序的軟中斷 3 結構表示 struct softirq ac...

x86中斷(一) 中斷分類

一 中斷分類 x86系統支援256個中斷源,每個中斷源使用0 255數字標識,該標識稱作中斷向量號 即cpu中斷源的中斷號,要與外部中斷的中斷號irq n相區別 cpu通過獲取中斷向量號識別中斷源。256個中斷源可以分為 其中 1 內部中斷 由cpu內部事件及執行軟中斷指令產生,由除法中斷 溢位中斷...

6 中斷系統

外部中斷0實驗 include reg52.h 此檔案中定義了微控制器的一些特殊功能暫存器 typedef unsigned int u16 對資料型別進行宣告定義 typedef unsigned char u8 sbit k3 p3 2 定義按鍵k3 sbit led p2 0 定義p20口是l...