【转】Linux中断处理学习笔记
原文網(wǎng)址:http://www.cnblogs.com/GT_Andy/archive/2011/06/21/2086100.html
1.Linux中斷的注冊與釋放:
在<linux/interrupt.h>, , 實現(xiàn)中斷注冊接口:
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);
函數(shù)參數(shù)說明
unsigned int irq:所要注冊的中斷號
irqreturn_t (*handler)(int, void *, struct pt_regs *):中斷服務程序的入口地址。
unsigned long flags:與中斷管理有關的位掩碼選項,有三組值:
1. SA_INTERRUPT :快速中斷處理程序,當使用它的是后處理器上所有的其他中斷都被禁用。
2. SA_SHIRQ :該中斷是在設備之間可共享的
3. SA_SAMPLE_RANDOM :這個位表示產(chǎn)生的中斷能夠有貢獻給 /dev/random
和 /dev/urandom 使用的加密池.(此處不理解)
const char *dev_name:設備描述,表示那一個設備在使用這個中斷。
void *dev_id:用作共享中斷線的指針. 它是一個獨特的標識, 用在當釋放中斷線時以及可能還被驅動用來指向它自己的私有數(shù)據(jù)區(qū)(來標識哪個設備在中斷) 。這個參數(shù)在真正的驅動程序中一般是指向設備數(shù)據(jù)結構的指針.在調用中斷處理程序的時候它就會傳遞給中斷處理程序的void *dev_id。(這是我的理解)如果中斷沒有被共享, dev_id 可以設置為 NULL, 但是使用這個項指向設備結構不管如何是個好主意. 我們將在"實現(xiàn)一個處理"一節(jié)中看到 dev_id 的一個實際應用。
中斷號的查看可以使用下面的命令:“cat /proc/interrupts”。
/proc/stat 記錄了幾個關于系統(tǒng)活動的低級統(tǒng)計量, 包括(但是不限于)自系統(tǒng)啟動以來收到的中斷數(shù). stat 的每一行以一個文本字串開始, 是該行的關鍵詞; intr 標志是我們在找的.
第一個數(shù)是所有中斷的總數(shù), 而其他每一個代表一個單個 IRQ 線, 從中斷 0 開始. 所有的計數(shù)跨系統(tǒng)中所有處理器而匯總的. 這個快照顯示, 中斷號 4 已使用 1 次, 盡管當前沒有安裝處理. 如果你在測試的驅動請求并釋放中斷在每個打開和關閉循環(huán), 你可能發(fā)現(xiàn) /proc/stat 比 /proc/interrupts 更加有用.
以下是一個統(tǒng)計中斷時間間隔的中斷服務程序。
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;
}
這個函數(shù)實現(xiàn)的只是對兩次發(fā)生中斷的時間間隔的統(tǒng)計,時間單位是毫秒
函數(shù)參數(shù)說明:int irq :在這里很明顯傳遞過來的是中斷號
void *dev_id :這個傳遞來的是設備的id號,可以根據(jù)這個設備id號得到相應設備的數(shù)據(jù)結構,進而的到相應設備的信息和相關數(shù)據(jù)。下面以提取網(wǎng)路數(shù)據(jù)為例來說明一下。
struct net_device *dev=( struct net_device *)dev_id; (這里的dev_id的值是注冊中斷的時候宏傳遞過來的,是注冊中斷函數(shù)的最后一個參數(shù)。特別說明)
在這之后就可以用dev->name; dev->irq;等得到網(wǎng)絡設備的信息了,當然提取ip數(shù)據(jù)報還得進行一些其它的工作。
struct pt_regs *regs :它指向一個數(shù)據(jù)結構,此結構保存的是中斷之前處理器的寄存器和狀態(tài)。主要用在程序調試。
關于中斷處理函數(shù)的返回值:中斷程序的返回值是一個特殊類型—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.
* 中斷程序接收到中斷信號后發(fā)現(xiàn)這并不是注冊時指定的中斷原發(fā)出的中斷信號.
*此時返回次值
* 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中的內容,我加了一定的注釋.我想是可以說明問題的
轉載于:https://www.cnblogs.com/wi100sh/p/4875080.html
總結
以上是生活随笔為你收集整理的【转】Linux中断处理学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle笔记 三、function
- 下一篇: UILabel的高度自适应