歡迎您光臨本站 註冊首頁

linux中斷的註冊與釋放

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

1.Linux中斷的註冊與釋放:

, , 實現中斷註冊介面:
QUOTE:
int request_irq(unsigned int irq,irqreturn_t (*handler)(int, void *, struct pt_regs *),?unsigned long flags, const char *dev_name,void *dev_id);

void free_irq(unsigned int irq, void *dev_id);

函數參數說明

unsigned int irq:所要註冊的中斷號

irqreturn_t (*handler)(int, void *, struct pt_regs *):中斷服務程序的入口地址。

unsigned long flags:與中斷管理有關的位掩碼選項,有三組值:

1. SA_INTERRUPT :快速中斷處理程序,當使用它的是后處理器上所有的其他中斷都被禁用。

2. SA_SHIRQ :該中斷是在設備之間可共享的

3. SA_SAMPLE_RANDOM :這個位表示產生的中斷能夠有貢獻給 /dev/random

和 /dev/urandom 使用的加密池.(此處不理解)

const char *dev_name:設備描述,表示那一個設備在使用這個中斷。

void *dev_id:用作共享中斷線的指針. 它是一個獨特的標識, 用在當釋放中斷線時以及可能還被驅動用來指向它自己的私有數據區(來標識哪個設備在中斷) 。這個參數在真正的驅動程序中一般是指向設備數據結構的指針.在調用中斷處理程序的時候它就會傳遞給中斷處理程序的void *dev_id。(這是我的理解)如果中斷沒有被共享, dev_id 可以設置為 NULL, 但是使用這個項指向設備結構不管如何是個好主意. 我們將在"實現一個處理"一節中看到 dev_id 的一個實際應用。

中斷號的查看可以使用下面的命令:「cat /proc/interrupts」。

/proc/stat 記錄了幾個關於系統活動的低級統計量, 包括(但是不限於)自系統啟動以來收到的中斷數. stat 的每一行以一個文本字串開始, 是該行的關鍵詞; intr 標誌是我們在找的.

第一個數是所有中斷的總數, 而其他每一個代表一個單個 IRQ 線, 從中斷 0 開始. 所有的計數跨系統中所有處理器而匯總的. 這個快照顯示, 中斷號 4 已使用 1 次, 儘管當前沒有安裝處理. 如果你在測試的驅動請求並釋放中斷在每個打開和關閉循環, 你可能發現 /proc/stat 比 /proc/interrupts 更加有用.

以下是一個統計中斷時間間隔的中斷服務程序。
QUOTE:
irqreturn_t short_interrupt(int irq, void *dev_id, struct pt_regs *regs)

{

static long mytime=0;
static int i=0;
struct net_device *dev=(struct net_device *)dev_id;
if(i==0){

mytime=jiffies;
}else
if(i<20){

mytime =jiffies- mytime;
printk("Request on IRQ %d time %d\n",irq , mytime);
mytime=jiffies;
printk("Interrupt on %s -----%d \n",dev->name,dev->irq);
}
i++;
return IRQ_HANDLED;
}

這個函數實現的只是對兩次發生中斷的時間間隔的統計,時間單位是毫秒

函數參數說明:int irq :在這裡很明顯傳遞過來的是中斷號

void *dev_id :這個傳遞來的是設備的id號,可以根據這個設備id號得到相應設備的數據結構,進而的到相應設備的信息和相關數據。下面以提取網路數據為例來說明一下。

struct net_device *dev=( struct net_device *)dev_id; (這裡的dev_id的值是註冊中斷的時候宏傳遞過來的,是註冊中斷函數的最後一個參數。特別說明)

在這之後就可以用dev->name; dev->irq;等得到網路設備的信息了,當然提取ip數據報還得進行一些其它的工作。

struct pt_regs *regs :它指向一個數據結構,此結構保存的是中斷之前處理器的寄存器和狀態。主要用在程序調試。

關於中斷處理函數的返回值:中斷程序的返回值是一個特殊類型—irqreturn_t。但是中斷程序的返回值卻只有兩個—IRQ_NONE和IRQ_HANDLED。
QUOTE:
/* irqreturn.h */

#ifndef _Linux_IRQRETURN_H

#define _Linux_IRQRETURN_H

typedef int irqreturn_t;

/*

* For 2.4.x compatibility, 2.4.x can use

*

* typedef void irqreturn_t;

* #define IRQ_NONE

* #define IRQ_HANDLED

* #define IRQ_RETVAL(x)

*……此處我刪去了部分關緊要的內容

* To mix old-style and new-style irq handler returns.

*

* IRQ_NONE means we didn't handle it.

* 中斷程序接收到中斷信號后發現這並不是註冊時指定的中斷原發出的中斷信號.

*此時返回次值

* IRQ_HANDLED means that we did have a valid interrupt and handled it.

* 接收到了準確的中斷信號,並且作了相應正確的處理

* IRQ_RETVAL(x) selects on the two depending on x being non-zero (for handled)

*/

#define IRQ_NONE (0)

#define IRQ_HANDLED (1)

#define IRQ_RETVAL(x) ((x) != 0) //這個宏只是返回0或非0

#endif


[火星人 ] linux中斷的註冊與釋放已經有540次圍觀

http://coctec.com/docs/linux/show-post-185808.html