- 論壇徽章:
- 0
|
本帖最后由 JIANGXIN04211 于 2015-12-08 11:32 編輯
這一個范例出自《深入理解linux網(wǎng)絡(luò)技術(shù)內(nèi)幕》,是為了說明中斷組合的,即好的組合就是在低負荷下使用中斷技術(shù),在高負載在切換定時器驅(qū)動的中斷事件。
實例代碼
static irqreturn_t vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
int work_done = max_interrupt_work;//輪詢的最大次數(shù),默認為32
ioaddr = dev->base_addr;
... ... ...
status = inw(ioaddr + EL3_STATUS);//讀取寄存器從而得到當(dāng)前的中斷狀態(tài)
do {
... ... ...
//代表著新的幀已經(jīng)接收,驅(qū)動可以去取了。因此調(diào)用vortex_rx得到數(shù)據(jù),在這個函數(shù)里面會屏蔽掉中斷,雖然屏蔽掉中斷,我們的函數(shù)依然可以輪詢硬件的中斷寄存器,從而繼續(xù)得到相應(yīng)的中斷狀態(tài)。
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));
//這里是判斷條件,當(dāng)有未決中斷,并且新的網(wǎng)絡(luò)幀已經(jīng)可以接受,我們就會一直循環(huán)
... ... ...
}
上面代碼時中斷處理函數(shù),中斷處理函數(shù)要求盡量快的進行完成。定義一個默認值max_interrupt_work=32,為了在高負載的情況下通過--work_done能夠退出循環(huán)。
while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete));對于這個判斷條件的,我的個人理解是檢測寄存器中有未決中斷,并且新的網(wǎng)絡(luò)幀已經(jīng)可以接受,就會一直循環(huán),--work_done小于0就說明當(dāng)前在高負荷下工作,就要切換成定時器模式,釋放cpu,可以使cpu響應(yīng)其他中斷。好像和《深入理解linux網(wǎng)絡(luò)技術(shù)內(nèi)幕》的描述是不太相同,但這個實例就是為了說明中斷組合的,低負荷使用中斷,高負荷使用定時器。這些都是我個人理解,不知道是否正確,希望別誤人子弟。 |
|