【轉載】Linux中斷處理學習筆記

來源:互聯網
上載者:User

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

在<linux/interrupt.h>, , 實現中斷註冊介面:

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 更加有用.

以下是一個統計停機時間間隔的中斷服務程式。

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。

/* 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/irqreturn.h中的內容,我加了一定的注釋.我想是可以說明問題的

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.