arm linux 中斷分析2

2021-05-28 00:18:04 字數 1843 閱讀 6242

裝置一般都比cpu慢得多。因此一般情況下,當乙個程序通過裝置驅動程式向裝置發出讀寫請求後,cpu並不等待i/o操作的完成,而是讓正在執行的程序去睡眠,cpu自己做別的事情,例如喚醒另乙個程序執行。當裝置完成i/o操作需要通知cpu時,會向cpu發出乙個中斷請求;然後cpu根據中斷請求來決定呼叫相應的裝置驅動程式。

當裝置執行某個命令時,如「將讀取磁頭移動到軟盤的第42扇區上」,裝置驅動程式可以從查詢方式和中斷方式中選擇一種來判斷裝置是否已經完成此命令。

查詢方式意味著需要經常讀取裝置的狀態,一直到裝置狀態表明請求已經完成為止。如果裝置驅動程式被連線進核心,這時使用查詢方式將會帶來災難性後果:核心將在此過程中無所事事,直到裝置完成目前的請求。有一種方法可以有效的改善這一弊端,就是通過使用系統定時器,使核心週期性呼叫裝置驅動程式中的某個例程來檢查裝置狀態。使用定時器是查詢方式中最好的一種,但更有效的方法是使用中斷。

基於中斷的裝置驅動程式,指的是在硬體裝置需要服務時向 cpu 發乙個中斷訊號,引發中斷服務子程式執行 。這樣就大大地提高了系統資源的利用率,使核心不必一直等到裝置執行完任務後才開始有事可幹,而是在裝置工作期間核心就可以轉去處理其它的事務,收到中斷請求訊號時再回頭響應裝置

1. linux 對中斷的管理

linux 核心為了將來自硬體裝置的中斷傳遞到相應的裝置驅動程式,在驅動程式初始化的時候就將其對應的中斷程式進行了登記,即通過呼叫函式 request_irq (  ) 將其中斷資訊新增到結構為irqaction的陣列中,從而使中斷號和中斷服務程式聯絡起來

8static inline int __must_check

129request_irq(unsigned int irq, irq_handler_t

handler, unsigned long flags,

130 const char *name, void *dev)

131134

typedef irqreturn_t (*irq_handler_t)(int, void *);
92

/**93

* struct irqaction - per interrupt action descriptor

94* @handler: interrupt handler function

95* @flags: flags (see irqf_* above)

96* @name: name of the device

97* @dev_id: cookie to identify the device

98* @next: pointer to the next irqaction for shared interrupts

99* @irq: interrupt number

100* @dir: pointer to the proc/irq/nn/name entry

101* @thread_fn: interrupt handler function for threaded interrupts

102* @thread: thread pointer for threaded interrupts

103* @thread_flags: flags related to @thread

104* @thread_mask: bitmask for keeping track of @thread activity

105*/

106struct irqaction ____cacheline_internodealigned_in_smp;

119

ARM Linux 中斷分析

在具體的 arm 晶元中會有很多的中斷型別,每一種型別的中斷用以上結構來表示 struct irqdesc irq desc nr irqs nr irqs 根據不同的 mcu 會有所區別 在通過request irq 函式註冊中斷服務程式的時候,將會把中斷向量和中斷服務程式對應起來。我們來看一下 ...

詳解 ARM Linux啟動過程分析 2

origin 呼叫 linux核心映像 bootloader完成的最後一項工作便是呼叫 linux核心。如果 linux 核心存放在 flash 中,並且可直接在上面執行 這裡的 flash 指 nor flash 那麼可直接跳轉到核心中去執行。但由於在 flash 中執行 會有種種限制,而且速度也...

ARM Linux驅動 ADC驅動(中斷方式)

硬體平台 fl2440 核心版本 2.6.28 主機平台 ubuntu 11.04 核心版本 2.6.39 這個驅動寫了好久,因為原來的linux核心編譯的時候將觸控螢幕驅動編譯進核心了,而觸控螢幕驅動裡的adc中斷在註冊的時候型別選擇的是 irqf sample random,不是共享型別,所以,...