1、 LINUX中,中断的安装和使用:
当中断系统硬件产生一个中断信号,LINUX的中断处理系统将根据从硬件获得的中断号调用用户编写的中断处理程序,这个处理程序根据需要可以分为中断上半部和中断下半部(bottom half),一般将需要马上处理的动作安置在上半部中处理,这时是关中断运行。可以在稍后处理的动作安置在下半部处理,这时是开中断运行,可以允许其他中断进入。下半部根据情况可以要也可以不要。
A、因此首先要定义一个中断上半部处理程序,原型为:
#include <linux/intrrupt.h>
#include <linux/sched.h>
void Mydev_interrupt_handle(int irq,void *dev_id,struct pt_reg *regs)
 
*dev_id是设备标识符控制工程网版权所有,据说是为了允许一个中断处理程序服务于几个同类型的设备,大概和第一个参数的作用差不多。下一个*regs参数指向中断发生后保存的各个寄存器内容的内核态堆栈区,我想一般程序员不会动它的。当然,最简单的情况下(也是大多数情况下)这几个参数都可以不用,虽然不用控制工程网版权所有,你的中断处理程序也得按这个形式声明,否则在编译阶段就会遇到麻烦。
B、下面该定义一个下半部处理程序了:
void mydev_bh_interrupt(void)
必须这么简单,没有参数,没有返回值。
C、注册下半部。linux系统在一个数组中存储所有的下半部处理程序指针,你必须将你的下半部处理程序的指针插入这个数组中的一个位置,并记住这个位置编号以备在合适的时候告诉系统,这个位置指向的程序就是我需要的。将你的下半部处理程序插入这个数组中的操作叫做“注册下半部”,使用的函数在kernel/softirq.c中的
void init_bh(int nr, void (*routine)(void))
{
 bh_base[nr] = routine;
 mb();
}
参数nr为数组中的位置,有资料说其值最大为31,即linux允许最多有32个下半部同时存在。routine为你的下半部处理程序。仔细看void (*routine)(void)和void mydev_bh_interrupt(void)有什么不同?有经验的程序员很快可以看出这是两个形式完全相同的函数定义。对!*routine是形参,而mydev_bh_interrupt可以作为实参,实参和形参的数据类型必须相同。
你还可以看出www.cechina.cn,bh_base[]就是存储下半部处理程序指针的那个数组。
如果参考别人的一些代码,你会发现比如init_bh(TIMER_BH, timer_bh)一类的语句,这里的timer_bh肯定是一个中断下半部(望文生义可以知道是时钟中断),让人费解的是TIMER_BH是那个所谓数组中的那个位置?你可以在include/linux/intrrupt.h中找到一个枚举类型的定义:
enum {
 TIMER_BH = 0,
 TQUEUE_BH,
 DIGI_BH,
 SERIAL_B