日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

【转载】Linux中断处理学习笔记

發布時間:2023/12/10 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】Linux中断处理学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

轉載于:https://www.cnblogs.com/GT_Andy/archive/2011/06/21/2086100.html

總結

以上是生活随笔為你收集整理的【转载】Linux中断处理学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。