- 论坛徽章:
- 0
|
本帖最后由 JIANGXIN04211 于 2015-12-08 11:32 编辑
这一个范例出自《深入理解linux网络技术内幕》,是为了说明中断组合的,即好的组合就是在低负荷下使用中断技术,在高负载在切换定时器驱动的中断事件。
实例代码
static irqreturn_t vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
int work_done = max_interrupt_work;//轮询的最大次数,默认为32
ioaddr = dev->base_addr;
... ... ...
status = inw(ioaddr + EL3_STATUS);//读取寄存器从而得到当前的中断状态
do {
... ... ...
//代表着新的帧已经接收,驱动可以去取了。因此调用vortex_rx得到数据,在这个函数里面会屏蔽掉中断,虽然屏蔽掉中断,我们的函数依然可以轮询硬件的中断寄存器,从而继续得到相应的中断状态。
if (status & RxComplete)
vortex_rx(dev);
if (--work_done < 0) {
/* Disable all pending interrupts. */
... ... ...
/* The timer will re-enable interrupts. */
mod_timer(&vp->timer, jiffies + 1*HZ);
break;
}
... ... ...
} while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete));
//这里是判断条件,当有未决中断,并且新的网络帧已经可以接受,我们就会一直循环
... ... ...
}
上面代码时中断处理函数,中断处理函数要求尽量快的进行完成。定义一个默认值max_interrupt_work=32,为了在高负载的情况下通过--work_done能够退出循环。
while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete));对于这个判断条件的,我的个人理解是检测寄存器中有未决中断,并且新的网络帧已经可以接受,就会一直循环,--work_done小于0就说明当前在高负荷下工作,就要切换成定时器模式,释放cpu,可以使cpu响应其他中断。好像和《深入理解linux网络技术内幕》的描述是不太相同,但这个实例就是为了说明中断组合的,低负荷使用中断,高负荷使用定时器。这些都是我个人理解,不知道是否正确,希望别误人子弟。 |
|