中断和中断处理程序
2010-05-25 17:03
190 查看
驱动程序可以通过下面的函数注册并激活一个中断处理程序,以便处理中断:
int request_irq(unsigned int irq,
irqreturn_t (*handler)(int ,void *,struct pt_regs *),
unsigned long irqflags,
const char * devname,
void *dev_id)
第一个参数表示分配的中断号。
第二个参数handler是一个指针,指向处理这个中断的实际中断处理程序。
第三个参数irqflags可以是0,也可以是下列一个或多个标志的位掩码:
SA_INTERRUPT:此标志表明给定的中断处理程序是一个快速中断处理程序(fast interrupt handler).在本地处理器上,快速中断处理程序在禁止所有中断的情况下运行。这使得快速中断处理程序能够不受其他中断的干扰,得以迅速执行。而默认情况下(没有这个标志),除了正运行的中断处理程序应的那条中断线被屏蔽外,其他所有中断都是激活的。除了时钟中断外,绝大多数中断都不使用该标志。
SA_SAMPLE_RANDOM:此标志表明这个设备产生的中断对内核熵池有贡献。内核熵池负责提供从各种随机事件导出的真正的随机数。如果制订了该标志,那么来自该设备的中断间隔时间就会作为熵填充到熵池。如果你的设备以预知的速率产生中断(比如系统定时器),或者可能受外部攻击者的影响,那么就不要设置这个标志。相反,有其他很多硬件产生中断的速率是不可预知的,所以都能成为一种较好的熵源。、
SA_SHIRQ:此标志表明可以在多个中断处理程序之间共享中断线。在同一个给定线上注册的每个处理程序必须指定这个标志;否则,在每条线上只能有一个处理程序。
第四个参数dev_id主要用于共享中断线。
卸载驱动程序时,需要注销相应的中断处理程序,并释放中断线。使用:
free_irq(unsigned int irq,void *dev_id)
编写中断处理程序
static irqreturn_t intr_handler(int irq,void *dev_id,struct pt_regs *regs)
第二个参数dev_id是一个通用指针,它与在中断处理程序注册时传递给request_irq()的参数dev_id必须一致。如果该值有唯一确定性,那么它就相当于一个cookie,可以用来区分共享同一中断处理程序的多个设备。
最后一个参数regs是一个指向结构的指针,该结构包含处理中断之前处理器的寄存器和状态。除了调试的时候,它们很少使用到。事实上,目前开发者的兴趣显示这个参数可能不再使用。
中断处理程序可能返回两个特殊的值
当中断处理程序检测到一个中断,但该中断对应的设备并不是在注册处理函数期间指定的产生源时,返回IRQ_NONE;
当中断处理程序被正确调用,且确实是它所对应的设备产生了中断时,返回IRQ_HANDLED.另外,也可以使用宏IRQ_RETVAL(x).如果x为非0值
int request_irq(unsigned int irq,
irqreturn_t (*handler)(int ,void *,struct pt_regs *),
unsigned long irqflags,
const char * devname,
void *dev_id)
第一个参数表示分配的中断号。
第二个参数handler是一个指针,指向处理这个中断的实际中断处理程序。
第三个参数irqflags可以是0,也可以是下列一个或多个标志的位掩码:
SA_INTERRUPT:此标志表明给定的中断处理程序是一个快速中断处理程序(fast interrupt handler).在本地处理器上,快速中断处理程序在禁止所有中断的情况下运行。这使得快速中断处理程序能够不受其他中断的干扰,得以迅速执行。而默认情况下(没有这个标志),除了正运行的中断处理程序应的那条中断线被屏蔽外,其他所有中断都是激活的。除了时钟中断外,绝大多数中断都不使用该标志。
SA_SAMPLE_RANDOM:此标志表明这个设备产生的中断对内核熵池有贡献。内核熵池负责提供从各种随机事件导出的真正的随机数。如果制订了该标志,那么来自该设备的中断间隔时间就会作为熵填充到熵池。如果你的设备以预知的速率产生中断(比如系统定时器),或者可能受外部攻击者的影响,那么就不要设置这个标志。相反,有其他很多硬件产生中断的速率是不可预知的,所以都能成为一种较好的熵源。、
SA_SHIRQ:此标志表明可以在多个中断处理程序之间共享中断线。在同一个给定线上注册的每个处理程序必须指定这个标志;否则,在每条线上只能有一个处理程序。
第四个参数dev_id主要用于共享中断线。
卸载驱动程序时,需要注销相应的中断处理程序,并释放中断线。使用:
free_irq(unsigned int irq,void *dev_id)
编写中断处理程序
static irqreturn_t intr_handler(int irq,void *dev_id,struct pt_regs *regs)
第二个参数dev_id是一个通用指针,它与在中断处理程序注册时传递给request_irq()的参数dev_id必须一致。如果该值有唯一确定性,那么它就相当于一个cookie,可以用来区分共享同一中断处理程序的多个设备。
最后一个参数regs是一个指向结构的指针,该结构包含处理中断之前处理器的寄存器和状态。除了调试的时候,它们很少使用到。事实上,目前开发者的兴趣显示这个参数可能不再使用。
中断处理程序可能返回两个特殊的值
当中断处理程序检测到一个中断,但该中断对应的设备并不是在注册处理函数期间指定的产生源时,返回IRQ_NONE;
当中断处理程序被正确调用,且确实是它所对应的设备产生了中断时,返回IRQ_HANDLED.另外,也可以使用宏IRQ_RETVAL(x).如果x为非0值
相关文章推荐
- TI CC2530基础实验(GPIO通用I/O中断操作——一个中断处理程序处理一个端口的多个中断)
- 编制中断处理程序(1202)
- 13.linux中断处理程序
- 木其工作室(专业程序代写服务)[转]Linux设备驱动程序学习-中断处理
- Linux内核设计与实现读书笔记(5)-中断和中断处理程序
- 关于中断处理程序中的关中断函数disable_irq和disable_irq_nosync
- 实验十二_编写0号中断处理程序
- 王爽《汇编语言》实验12:编写0号中断的处理程序 解答
- 中断处理程序上半部和下半部
- 安装DOS中断处理程序
- 安装4号中断处理程序。中断处理程序在屏幕右下角,打印“attention: of = 1”。
- linux内核-中断处理程序
- Linux0.11内核--系统中断处理程序int 0x80实现原理
- 中断处理程序不能使用printf的本质 分类: vxWorks arm-linux-Ubuntu 2014-06-20 10:32 529人阅读 评论(0) 收藏
- 简单的跑马灯程序+中断处理
- 中断和中断处理程序
- LINUX内核设计思想之中断和中断处理程序
- linux内核设计与实现(lkd)学习——如何理解中断处理程序可以使用自旋锁
- 中断0 处理程序(除法溢出)
- 中断处理程序