Linux中断嵌套处理:
概念:当一种类型的中断发生时又产生另外一种中断
1.不同中断设备:处理中断开始。。。。。。发生另外中断,执行发生的中断,执行完成,返回之前的中断处理函数继续执行。。。。
2.相同类型设备:处理中断开始。。。。。。发生另外中断,忽略发生的中断,继续执行之前的中断函数,造成中断丢失。。。。
1.不同中断设备:处理中断开始。。。。。。发生另外中断,忽略发生的中断,继续执行之前的中断函数,造成中断丢失。。。。
2.相同类型设备:处理中断开始。。。。。。发生另外中断,忽略发生的中断,继续执行之前的中断函数,造成中断丢失。。。。
linux中断分层:
作用:减少中断处理函数执行时间,减少中断丢失的概率
中断处理函数中相关代码:
使用中断分层技术:中断处理函数中第一部分在中断函数中执行,第二部使用中断分层技术隔离出来。
中断分层方式:软中断、tasklet、工作队列(主流)
工作队列是一种将任务推后执行的形式,他把推后的任务交由一个内核线程去执行。这样如果在中断函数中使用中断分层(工作队列方式),中断函数的第二部分会在进程上下文执行,它允许重新调度甚至睡眠。每个被推后的任务叫做“工作”,由这些工作组成的队列称为工作队列。
当工作队列中的工作被执行后就会把被执行的工作在工作队列链表中删除此工作
内核使用struct workqueue_struct来描述一个工作队列;
内核使用struct work_struct来描述一个工作项;
使用工作队列:
1.创建工作队列:create_workqueue;
2.创建工作:INIT_WORK;
3.提交工作:queue_work,提交工作后并不是马上运行,由内核空闲时内核线程会运行创建的工作队列
创建工作队列首先要遵守“GPL”协议,不然会报错
在大多数情况下,驱动并不需要自己创建工作队列,只需要定义工作,然后将工作提交到内核已经定义好的工作队列Keventd_wq中。
提交工作到默认队列:schedule_work