每一个中断信号linux都会分配一个中断号驱动开发人员需要在arch/arm/mach-exynos/include/mach/irqs.h ,找到中断编号每一中断信号在linux内核中都有一个struct irq_desc结构体来描述这个中断,当中断发生时内核会根据中断编号查找irq_desc结构体
linux在中断处理的时候,整个中断处于关闭状态,中断处理引入底半部基址(中断的延时处理)
linux如何完成中断
static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev) ;
注册中断处理函数
返回值:成功: 失败:负数
参数:unsigned int irq 中断编号
irq_handler_t handler 中断处理函数指针(函数在中断发生执行,执行过程中irq关闭)
unsigned long flags 中断标志IRQF_SHARED 外部中断需要设置触发方式
const char *name cat /proc/interrupts时查看到的中断名
void *dev 传递给中断处理函数的参数
disable_irq(unsigned int irq);//关闭中断
void free_irq(unsigned int irq, void *dev_id);//释放中断资源
typedef irqreturn_t (*irq_handler_t)(int irq, void * dev);
中断处理函数:
IRQ_HANDLED 正常退出统一的返回
参数:int irq 中断号,系统自动回写
void * dev request_irq的最后一个参数
中断底半部:中断的延时处理
底半部的实现方式:
tasklet(利用软件中断实现)(延时短, 不允许睡眠,部允许调度)
属于中断上下文(时效性高),任意一个中断函数结束都会自动执行一个tasklet函数
tasklet的实现,内核维护struct tasklet_struct;
void fun(unsigned long data)
{
}
1.DECLARE_TASKLET(my, fun, data);//初始化tasklet结构,定义中断的延时处理函数是fun
2.tasklet_schedule(&my);//注册taskle结构my到队列