首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

linux 中断机制的处理过程(2)

linux 中断机制的处理过程(2)

I、Linux中断的申请与释放:在<linux/interrupt.h>, , 实现中断申请接口:
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev);
函数参数说明
unsigned int irq:所要申请的硬件中断号
irq_handler_t handler:中断服务程序的入口地址,中断发生时,系统调用handler这个函数。irq_handler_t为自定义类型,其原型为:
typedef irqreturn_t (*irq_handler_t)(int, void *);
而irqreturn_t的原型为:typedef enum irqreturn irqreturn_t;
enum irqreturn {
    IRQ_NONE,/*此设备没有产生中断*/
    IRQ_HANDLED,/*中断被处理*/
    IRQ_WAKE_THREAD,/*唤醒中断*/
};
在枚举类型irqreturn定义在include/linux/irqreturn.h文件中。

unsigned long flags:中断处理的属性,与中断管理有关的位掩码选项,有一下几组值:
#define IRQF_DISABLED       0x00000020    /*中断禁止*/
#define IRQF_SAMPLE_RANDOM  0x00000040    /*供系统产生随机数使用*/
#define IRQF_SHARED      0x00000080 /*在设备之间可共享*/
#define IRQF_PROBE_SHARED   0x00000100/*探测共享中断*/
#define IRQF_TIMER       0x00000200/*专用于时钟中断*/
#define IRQF_PERCPU      0x00000400/*每CPU周期执行中断*/
#define IRQF_NOBALANCING 0x00000800/*复位中断*/
#define IRQF_IRQPOLL     0x00001000/*共享中断中根据注册时间判断*/
#define IRQF_ONESHOT     0x00002000/*硬件中断处理完后触发*/
#define IRQF_TRIGGER_NONE   0x00000000/*无触发中断*/
#define IRQF_TRIGGER_RISING 0x00000001/*指定中断触发类型:上升沿有效*/
#define IRQF_TRIGGER_FALLING 0x00000002/*中断触发类型:下降沿有效*/
#define IRQF_TRIGGER_HIGH   0x00000004/*指定中断触发类型:高电平有效*/
#define IRQF_TRIGGER_LOW 0x00000008/*指定中断触发类型:低电平有效*/
#define IRQF_TRIGGER_MASK   (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
               IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)
#define IRQF_TRIGGER_PROBE  0x00000010/*触发式检测中断*/

const char *dev_name:设备描述,表示那一个设备在使用这个中断。

void *dev_id:用作共享中断线的指针.。一般设置为这个设备的设备结构体或者NULL。它是一个独特的标识, 用在当释放中断线时以及可能还被驱动用来指向它自己的私有数据区,来标识哪个设备在中断 。这个参数在真正的驱动程序中一般是指向设备数据结构的指针.在调用中断处理程序的时候它就会传递给中断处理程序的void *dev_id。如果中断没有被共享, dev_id 可以设置为 NULL。
II、释放IRQ
void free_irq(unsigned int irq, void *dev_id);
III、中断线共享的数据结构
   struct irqaction {
    irq_handler_t handler; /* 具体的中断处理程序 */
    unsigned long flags;/*中断处理属性*/
    const char *name; /* 名称,会显示在/proc/interreupts 中 */
    void *dev_id; /* 设备ID,用于区分共享一条中断线的多个处理程序 */
    struct irqaction *next; /* 指向下一个irq_action 结构 */
    int irq;  /* 中断通道号 */
    struct proc_dir_entry *dir; /* 指向proc/irq/NN/name 的入口*/
    irq_handler_t thread_fn;/*线程中断处理函数*/
    struct task_struct *thread;/*线程中断指针*/
    unsigned long thread_flags;/*与线程有关的中断标记属性*/
};
thread_flags参见枚举型
enum {
    IRQTF_RUNTHREAD,/*线程中断处理*/
    IRQTF_DIED,/*线程中断死亡*/
    IRQTF_WARNED,/*警告信息*/
    IRQTF_AFFINITY,/*调整线程中断的关系*/
};
多个中断处理程序可以共享同一条中断线,irqaction 结构中的 next 成员用来把共享同一条中断线的所有中断处理程序组成一个单向链表,dev_id 成员用于区分各个中断处理程序。
继承事业,薪火相传
返回列表