專(zhuān)利名稱(chēng):一種避免先入先出隊(duì)列溢出的方法及設(shè)備的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)通信技術(shù)領(lǐng)域,尤其涉及設(shè)備驅(qū)動(dòng)軟件的接收機(jī)制,特別涉及一種避免先入先出隊(duì)列溢出的方法及設(shè)備。
背景技術(shù):
目前網(wǎng)絡(luò)設(shè)備中,設(shè)備驅(qū)動(dòng)軟件接收數(shù)據(jù)普遍采用緩沖區(qū)描述符(BD)環(huán)機(jī)制,BD 環(huán)是驅(qū)動(dòng)軟件與硬件收發(fā)器之間的一個(gè)數(shù)據(jù)緩沖。如圖1所示,在設(shè)備內(nèi)存103中分配BD 104,每個(gè)BD 104由狀態(tài)標(biāo)志和緩沖指針組成,狀態(tài)標(biāo)志指示這個(gè)BD是空閑的還是有數(shù)據(jù)待處理的,緩沖指針指向一塊內(nèi)存區(qū)域,用于存放待處理的數(shù)據(jù)。多個(gè)BD 104首尾相接組成BD環(huán)。BD環(huán)是驅(qū)動(dòng)軟件101與硬件收發(fā)器102之間的一個(gè)數(shù)據(jù)緩沖。設(shè)備初始化的時(shí)候,由驅(qū)動(dòng)軟件101將BD環(huán)構(gòu)造好,然后把BD環(huán)的信息通告給硬件收發(fā)器102。硬件收發(fā)器102收到數(shù)據(jù)后,先在先入先出隊(duì)列(FIFO) 105中暫存接收到的數(shù)據(jù),當(dāng)FIFO 105中暫存的數(shù)據(jù)達(dá)到一定水位后,再將暫存的數(shù)據(jù)從FIFO 105轉(zhuǎn)移到接收 BD環(huán)中的空閑BD上,最后以中斷的方式通知驅(qū)動(dòng)軟件101處理收到的數(shù)據(jù)。雖然BD環(huán)與硬件收發(fā)器102的FIFO 105 一樣都是起緩沖作用,但BD環(huán)能存放更多的數(shù)據(jù),能容忍更大的網(wǎng)絡(luò)突發(fā)流量。由于驅(qū)動(dòng)軟件101處理數(shù)據(jù)的時(shí)間較長(zhǎng)且不固定, 所以通常會(huì)在中斷服務(wù)進(jìn)程中喚醒一個(gè)接收任務(wù)來(lái)延后處理。當(dāng)接收任務(wù)處理數(shù)據(jù)的速度持續(xù)低于硬件收發(fā)器102寫(xiě)入數(shù)據(jù)的速度,則BD環(huán)會(huì)被數(shù)據(jù)占滿(mǎn),硬件收發(fā)器102無(wú)法將 FIFO 105中的數(shù)據(jù)轉(zhuǎn)移走,只要此時(shí)還有數(shù)據(jù)進(jìn)入,F(xiàn)IFO 105就會(huì)溢出??梢?jiàn),采用上述機(jī)制接收數(shù)據(jù),F(xiàn)IFO溢出是容易出現(xiàn)的情況。特別是對(duì)于集中式系統(tǒng),控制驅(qū)動(dòng)軟件和轉(zhuǎn)發(fā)驅(qū)動(dòng)軟件都在一個(gè)中央處理單元(CPU)中運(yùn)行,驅(qū)動(dòng)接收任務(wù)被調(diào)度的時(shí)間得不到保證,F(xiàn)IFO溢出情況更為普遍。如圖1所示,在FIFO 105溢出的時(shí)候,硬件收發(fā)器102往往會(huì)停止接收數(shù)據(jù),并產(chǎn)生一個(gè)中斷通知驅(qū)動(dòng)軟件101。驅(qū)動(dòng)軟件101的做法是清空接收BD環(huán)上的數(shù)據(jù),然后統(tǒng)計(jì)一次接收溢出錯(cuò)誤,最后重新啟動(dòng)硬件收發(fā)器102繼續(xù)接收數(shù)據(jù)。通常情況下,F(xiàn)IFO溢出的后果也就是丟失幾個(gè)報(bào)文,不會(huì)有太大問(wèn)題。但是,如果 FIFO反復(fù)溢出,就會(huì)產(chǎn)生大量額外的中斷,進(jìn)一步增加驅(qū)動(dòng)軟件系統(tǒng)的開(kāi)銷(xiāo),降低驅(qū)動(dòng)軟件的處理性能,形成惡性循環(huán)。另外,某些硬件收發(fā)器在FIFO多次溢出后,會(huì)引起內(nèi)部狀態(tài)機(jī)紊亂,輕者再也不收數(shù)據(jù),重者將數(shù)據(jù)寫(xiě)到錯(cuò)誤的內(nèi)存地址上,導(dǎo)致系統(tǒng)崩潰。而如何避免硬件收發(fā)器FIFO溢出,是解決上述問(wèn)題的關(guān)鍵。
發(fā)明內(nèi)容
本發(fā)明提供了一種避免先入先出隊(duì)列溢出的方法及設(shè)備,在不修改硬件收發(fā)器的前提下避免出現(xiàn)接收FIFO溢出,相應(yīng)提高驅(qū)動(dòng)接收的穩(wěn)定性和可靠性。本發(fā)明實(shí)施例提出的一種避免FIFO溢出的方法,包括如下步驟A、在設(shè)備內(nèi)存中創(chuàng)建第一緩沖區(qū)描述符BD環(huán)和第二 BD環(huán);
B、硬件收發(fā)器將FIFO中的數(shù)據(jù)通過(guò)第一寫(xiě)指針寫(xiě)入第一 BD環(huán)的空閑BD中,完成后硬件收發(fā)器產(chǎn)生接收中斷;C、驅(qū)動(dòng)軟件檢測(cè)到接收中斷后,利用第一讀指針從第一 BD環(huán)中讀取數(shù)據(jù);驅(qū)動(dòng)軟件利用第二寫(xiě)指針將所讀取的數(shù)據(jù)寫(xiě)入第二 BD環(huán)中;驅(qū)動(dòng)軟件利用第二讀指針從第二 BD 環(huán)中讀取數(shù)據(jù)并進(jìn)行處理。較佳地,所述第一 BD環(huán)和第二 BD環(huán)中的BD數(shù)目均為m,m彡η,η為硬件收發(fā)器產(chǎn)生一個(gè)接收中斷對(duì)應(yīng)的最大報(bào)文數(shù)。較佳地,對(duì)于第一BD環(huán)和第二BD環(huán),同一個(gè)BD環(huán)中的各個(gè)BD在內(nèi)存中連續(xù)相鄰, BD的狀態(tài)字段中包含一個(gè)環(huán)回標(biāo)志比特。較佳地,對(duì)于第一 BD環(huán)和第二 BD環(huán),同一個(gè)BD環(huán)中的各個(gè)BD在內(nèi)存中不連續(xù)相鄰,BD中有一個(gè)特殊字段用于存放下一個(gè)BD的內(nèi)存起始地址,最后一個(gè)BD的該字段存放第一個(gè)BD的內(nèi)存起始地址。較佳地,步驟B包括Bi、硬件收發(fā)器FIFO達(dá)到高水位后,判斷FIFO中是否有數(shù)據(jù)需要轉(zhuǎn)移,若是執(zhí)行步驟B2 ;否則轉(zhuǎn)至步驟B6 ;B2、判斷第一寫(xiě)指針指向的第一BD環(huán)中的BD是否為空閑,若是,執(zhí)行步驟B3,否則返回步驟B2 ;B3、從Wl指向的BD中取出緩沖區(qū)地址,將數(shù)據(jù)通過(guò)直接內(nèi)存訪問(wèn)DMA的方式寫(xiě)入到緩沖區(qū)中;B4、判斷第一 BD環(huán)是否完成一個(gè)報(bào)文的接收,若是,繼續(xù)執(zhí)行步驟B5,否則返回步驟B3 ;B5、設(shè)置第一寫(xiě)指針指向的BD的空閑標(biāo)志為有數(shù)據(jù),然后將第一寫(xiě)指針指向第一 BD環(huán)的下一個(gè)BD ;B6、硬件收發(fā)器判斷是否滿(mǎn)足產(chǎn)生接收中斷的條件,若是則產(chǎn)生接收中斷,完成步驟B ;否則返回步驟Bi。較佳地,步驟C包括Cl、驅(qū)動(dòng)軟件在中斷處理程序中檢查第一讀指針指向的第一 BD環(huán)中的BD是否有數(shù)據(jù),若是執(zhí)行步驟C2,否則轉(zhuǎn)至步驟C6 ;C2、檢查第二寫(xiě)指針指向的第二BD環(huán)的BD是否空閑,若是,執(zhí)行步驟C3,否則轉(zhuǎn)至步驟C5 ;C3、將第二寫(xiě)指針指向BD的緩沖指針與第一讀指針指向的BD的緩沖指針交換;C4、設(shè)置第二寫(xiě)指針指向的BD的空閑標(biāo)志為有數(shù)據(jù),使第二寫(xiě)指針指向第二 BD環(huán)的下一個(gè)BD ;C5、設(shè)置第一讀指針指向的BD的空閑標(biāo)志為空閑,使第一讀指針指向第一 BD環(huán)的下一個(gè)BD,然后轉(zhuǎn)至步驟Cl ;C6、在接收任務(wù)中檢查第二讀指針指向的第二 BD環(huán)的BD是否有數(shù)據(jù),如果沒(méi)有數(shù)據(jù),完成數(shù)據(jù)接收處理;如果有數(shù)據(jù),轉(zhuǎn)到步驟C7 ;C7、從第二讀指針指向的第二 BD環(huán)的BD的緩沖地址中取出數(shù)據(jù)進(jìn)行處理,完成后執(zhí)行步驟C8 ;
C8、設(shè)置第二讀指針指向的第二 BD環(huán)的BD的空閑標(biāo)志為空閑,使第二讀指針指向第二 BD環(huán)的下一個(gè)BD,然后轉(zhuǎn)至步驟C6。本發(fā)明實(shí)施例還提出一種設(shè)備,包括硬件收發(fā)器模塊,緩沖區(qū)描述符BD環(huán)模塊和驅(qū)動(dòng)軟件模塊,所述BD環(huán)模塊中創(chuàng)建有第一緩沖區(qū)描述符BD環(huán)和第二 BD環(huán),其中所述硬件收發(fā)器模塊,用于將先進(jìn)先出FIFO單元中的數(shù)據(jù)通過(guò)第一寫(xiě)指針寫(xiě)入第一 BD環(huán)的空閑BD中,完成后產(chǎn)生接收中斷;所述驅(qū)動(dòng)軟件模塊,用于在檢測(cè)到所述硬件收發(fā)器模塊產(chǎn)生的接收中斷后,利用第一讀指針從第一 BD環(huán)中讀取數(shù)據(jù);利用第二寫(xiě)指針將所讀取的數(shù)據(jù)寫(xiě)入第二 BD環(huán)中; 并利用第二讀指針從第二 BD環(huán)中讀取數(shù)據(jù)并進(jìn)行處理。較佳地,所述第一 BD環(huán)和第二 BD環(huán)中的BD數(shù)目均為m,m彡η,η為硬件收發(fā)器產(chǎn)生一個(gè)接收中斷對(duì)應(yīng)的最大報(bào)文數(shù)。較佳地,對(duì)于第一BD環(huán)和第二BD環(huán),同一個(gè)BD環(huán)中的各個(gè)BD在內(nèi)存中連續(xù)相鄰, BD的狀態(tài)字段中包含一個(gè)環(huán)回標(biāo)志比特。較佳地,對(duì)于第一 BD環(huán)和第二 BD環(huán),同一個(gè)BD環(huán)中的各個(gè)BD在內(nèi)存中不連續(xù)相鄰,BD中有一個(gè)特殊字段用于存放下一個(gè)BD的內(nèi)存起始地址,最后一個(gè)BD的該字段存放第一個(gè)BD的內(nèi)存起始地址。從以上技術(shù)方案可以看出,在設(shè)備內(nèi)從中設(shè)置兩個(gè)BD環(huán),通過(guò)在兩個(gè)BD環(huán)之間傳遞數(shù)據(jù),達(dá)到第一 BD環(huán)被驅(qū)動(dòng)軟件快速處理的效果,確保硬件收發(fā)器總能從第一 BD環(huán)中找到空閑的BD寫(xiě)入數(shù)據(jù),從而避免了硬件收發(fā)器FIFO的溢出。
圖1為現(xiàn)有技術(shù)中采用BD環(huán)接收數(shù)據(jù)的原理示意圖;圖2為本發(fā)明實(shí)施例中采用BD環(huán)接收數(shù)據(jù)的原理示意圖;圖3為本發(fā)明實(shí)施例方案硬件收發(fā)器部分的處理流程圖;圖4為本發(fā)明實(shí)施例方案驅(qū)動(dòng)軟件部分的處理流程圖。
具體實(shí)施例方式本發(fā)明提出的避免先入先出隊(duì)列溢出的方法的基本思想如下在原有一個(gè)BD環(huán)的基礎(chǔ)上,增加了一個(gè)BD環(huán)。硬件收發(fā)器可以訪問(wèn)的BD環(huán)稱(chēng)之為第一BD環(huán),或快速BD環(huán)。 另一個(gè)BD環(huán)稱(chēng)之為第二 BD環(huán),或慢速BD環(huán)。通過(guò)在兩個(gè)BD環(huán)之間傳遞數(shù)據(jù),達(dá)到第一 BD 環(huán)被驅(qū)動(dòng)軟件快速處理的效果,確保硬件收發(fā)器總能從第一 BD環(huán)中找到空閑的BD寫(xiě)入數(shù)據(jù),從而避免了硬件收發(fā)器FIFO的溢出。本發(fā)明實(shí)現(xiàn)容易,效果明顯,不依賴(lài)于特殊的硬件收發(fā)器特性,是完全通用的驅(qū)動(dòng)軟件設(shè)計(jì)。設(shè)計(jì)上利用了空間換取時(shí)間的方法,成功的將驅(qū)動(dòng)軟件緩沖與硬件收發(fā)器FIFO 之間的矛盾轉(zhuǎn)移到了兩個(gè)驅(qū)動(dòng)軟件緩沖之間,雖然增加一點(diǎn)內(nèi)存開(kāi)銷(xiāo),但徹底解決硬件收發(fā)器FIFO溢出帶來(lái)的問(wèn)題。為使本發(fā)明技術(shù)方案的特點(diǎn)以及技術(shù)效果更加清楚,以下通過(guò)具體實(shí)施例對(duì)本發(fā)明方案進(jìn)行進(jìn)一步詳細(xì)闡述。假設(shè)硬件收發(fā)器最多收到η個(gè)報(bào)文產(chǎn)生一個(gè)接收中斷,那么設(shè)備驅(qū)動(dòng)軟件需要從內(nèi)存中分配2Xm個(gè)BD,m>n,每m個(gè)BD組成一個(gè)BD環(huán)。組成BD環(huán)的方式與硬件收發(fā)器對(duì)BD環(huán)的約定有關(guān),分為如下兩種方式一同一個(gè)BD環(huán)的各個(gè)BD在內(nèi)存中必須是連續(xù)相鄰的,BD的狀態(tài)字段中有一個(gè)環(huán)回標(biāo)志比特,環(huán)回標(biāo)志比特為1表示該BD是最后一個(gè)BD,環(huán)回標(biāo)志比特為0則表示該BD不是最后一個(gè)BD。驅(qū)動(dòng)軟件初始化時(shí)將BD環(huán)中的第一個(gè)BD的內(nèi)存起始地址寫(xiě)到硬件收發(fā)器寄存器中,硬件收發(fā)器通過(guò)偏移BD大小的內(nèi)存找到下一個(gè)BD,當(dāng)發(fā)現(xiàn)BD是BD環(huán)的最后一個(gè)BD時(shí),自動(dòng)跳回到第一個(gè)BD,完成BD環(huán)的遍歷。方式二 同一個(gè)BD環(huán)的各個(gè)BD在內(nèi)存中可以不是連續(xù)相鄰的,BD有一個(gè)特殊字段用于存放下一個(gè)BD的內(nèi)存起始地址,最后一個(gè)BD的該字段存放第一個(gè)BD的內(nèi)存起始地址,形成一個(gè)首尾相接的環(huán)。驅(qū)動(dòng)軟件初始化時(shí)將第一個(gè)BD的內(nèi)存起始地址寫(xiě)到硬件收發(fā)器寄存器中,硬件收發(fā)器通過(guò)該字段找到下一個(gè)BD,完成BD環(huán)的遍歷。兩個(gè)BD環(huán)創(chuàng)建完成后,為每個(gè)BD分配一個(gè)數(shù)據(jù)緩沖區(qū),將數(shù)據(jù)緩沖區(qū)的內(nèi)存起始地址寫(xiě)入BD的緩沖指針字段,設(shè)置BD的狀態(tài)字段中的空閑標(biāo)志為空閑。選擇其中一個(gè)BD 環(huán)作為快速BD環(huán),把它的第一個(gè)BD的內(nèi)存起始地址寫(xiě)到硬件收發(fā)器寄存器中。初始化完成后的雙BD環(huán)如圖2所示,粗箭頭表示數(shù)據(jù)的流向,細(xì)箭頭指向當(dāng)前操作的BD。圖2中,第一寫(xiě)指針(Wl)由硬件收發(fā)器維護(hù),指向硬件收發(fā)器當(dāng)前可以訪問(wèn)的第一 BD環(huán)的BD。第一讀指針(Rl)、第二寫(xiě)指針(W2)和第二讀指針(R2)由驅(qū)動(dòng)軟件維護(hù),分別指向第一 BD環(huán)中可以執(zhí)行讀操作的BD、第二 BD環(huán)中可以執(zhí)行寫(xiě)操作的BD和第二 BD環(huán)中可以執(zhí)行讀操作的BD。初始化完成的時(shí)候,Wl和Rl指向第一 BD環(huán)的第一個(gè)BD,W2和 R2指向第二 BD環(huán)的第一個(gè)BD。當(dāng)然在本發(fā)明中,Wl和Rl不限于指向第一 BD環(huán)的第一個(gè) BD,兩個(gè)指針可以指向第一 BD環(huán)的任意同一個(gè)BD,此時(shí)驅(qū)動(dòng)軟件初始化時(shí)將Wl和Rl同時(shí)指向的BD環(huán)中的那一個(gè)BD的內(nèi)存起始地址寫(xiě)到硬件收發(fā)器寄存器中即可。同理,W2和R2 指向第二 BD環(huán)的同一個(gè)BD即可。本發(fā)明實(shí)施例提出一種設(shè)備,包括硬件收發(fā)器模塊,緩沖區(qū)描述符BD環(huán)模塊和驅(qū)動(dòng)軟件模塊,可以避免出現(xiàn)先入先出隊(duì)列溢出的情況。所述BD環(huán)模塊中創(chuàng)建有第一緩沖區(qū)描述符BD環(huán)和第二 BD環(huán),其中所述硬件收發(fā)器模塊,用于將先進(jìn)先出FIFO單元中的數(shù)據(jù)通過(guò)第一寫(xiě)指針寫(xiě)入第一 BD環(huán)的空閑BD中,完成后產(chǎn)生接收中斷;所述驅(qū)動(dòng)軟件模塊,用于在檢測(cè)到所述硬件收發(fā)器模塊產(chǎn)生的接收中斷后,利用第一讀指針從第一 BD環(huán)中讀取數(shù)據(jù);利用第二寫(xiě)指針將所讀取的數(shù)據(jù)寫(xiě)入第二 BD環(huán)中; 并利用第二讀指針從第二 BD環(huán)中讀取數(shù)據(jù)并進(jìn)行處理。較佳地,所述第一 BD環(huán)和第二 BD環(huán)中的BD數(shù)目均為m,m彡η,η為硬件收發(fā)器產(chǎn)生一個(gè)接收中斷對(duì)應(yīng)的最大報(bào)文數(shù)。較佳地,對(duì)于第一BD環(huán)和第二BD環(huán),同一個(gè)BD環(huán)中的各個(gè)BD在內(nèi)存中連續(xù)相鄰, BD的狀態(tài)字段中包含一個(gè)環(huán)回標(biāo)志比特。較佳地,對(duì)于第一 BD環(huán)和第二 BD環(huán),同一個(gè)BD環(huán)中的各個(gè)BD在內(nèi)存中不連續(xù)相鄰,BD中有一個(gè)特殊字段用于存放下一個(gè)BD的內(nèi)存起始地址,最后一個(gè)BD的該字段存放第一個(gè)BD的內(nèi)存起始地址。本發(fā)明實(shí)施例提出的基于上述設(shè)備的雙BD環(huán)的數(shù)據(jù)接收流程如圖3和圖4所示,其中圖3示出了硬件收發(fā)器部分的處理流程,圖4示出了驅(qū)動(dòng)軟件部分的處理流程。硬件收發(fā)器部分的處理過(guò)程是硬件收發(fā)器將FIFO中的數(shù)據(jù)通過(guò)第一寫(xiě)指針寫(xiě)入第一 BD環(huán)的空閑BD中,完成后硬件收發(fā)器產(chǎn)生接收中斷,具體包括如下步驟步驟301 硬件收發(fā)器FIFO達(dá)到高水位后,判斷FIFO中是否有數(shù)據(jù)需要轉(zhuǎn)移,若是,轉(zhuǎn)至步驟306,否則執(zhí)行步驟302。步驟302 判斷Wl指針指向的BD是否空閑,若是,執(zhí)行步驟303,否則,返回步驟
302。所述判斷具體為檢查Wl指向的BD的狀態(tài)字段中的空閑標(biāo)志比特,如果為1表示該BD空閑,如果為0表示該BD已被占用。步驟303 從Wl指向的BD中取出緩沖區(qū)地址,將數(shù)據(jù)通過(guò)直接內(nèi)存訪問(wèn)(DMA)的方式寫(xiě)入到緩沖區(qū)中。步驟304 判斷是否完成一個(gè)報(bào)文的接收,若是,繼續(xù)執(zhí)行步驟305,否則返回步驟
303。步驟305:將Wl當(dāng)前指向的BD的空閑標(biāo)志比特置0,然后將Wl指向第一 BD環(huán)的下一個(gè)BD。步驟306 硬件收發(fā)器判斷是否滿(mǎn)足產(chǎn)生接收中斷的條件(時(shí)間超過(guò)門(mén)限或報(bào)文個(gè)數(shù)超過(guò)門(mén)限),若是執(zhí)行步驟307。否則返回步驟301。步驟307 硬件收發(fā)器產(chǎn)生接收中斷。至此,硬件收發(fā)器部分的處理過(guò)程完成,接下來(lái)進(jìn)行驅(qū)動(dòng)軟件部分的處理,如圖4 所示,驅(qū)動(dòng)軟件部分的處理過(guò)程是驅(qū)動(dòng)軟件檢測(cè)到接收中斷后,利用第一讀指針從第一 BD 環(huán)中讀取數(shù)據(jù),然后利用第二寫(xiě)指針將所讀取的數(shù)據(jù)寫(xiě)入第二 BD環(huán)中,最后利用第二讀指針將第二 BD環(huán)的數(shù)據(jù)讀取出來(lái)。具體包括如下步驟步驟401 驅(qū)動(dòng)軟件在中斷處理程序中檢查Rl指向的第一 BD環(huán)中的BD是否有數(shù)據(jù),若是,執(zhí)行步驟402,否則轉(zhuǎn)至步驟406。所述中檢查Rl指向的BD是否有數(shù)據(jù)就是檢查中檢查Rl指向的BD的空閑標(biāo)志比特,如果為1表示沒(méi)有數(shù)據(jù),如果為0表示有數(shù)據(jù)待處理。步驟402 檢查W2指向的第二 BD環(huán)的BD是否空閑,若是,執(zhí)行步驟403,否則轉(zhuǎn)至步驟405。所述檢查W2指向的BD是否空閑同樣是檢查W2指向的BD的空閑標(biāo)志比特,如果為0表示有數(shù)據(jù)尚未處理,如果為1表示該BD空閑。步驟403 將W2指向BD的緩沖指針與Rl指向的BD的緩沖指針交換。步驟404 將W2指向的BD的空閑標(biāo)志比特置0 (表示該BD中有數(shù)據(jù)尚未處理), W2指向第二 BD環(huán)的下一個(gè)BD。步驟405 將Rl指向的BD的空閑標(biāo)志比特置1 (表示該BD空閑),R1指向下一個(gè) BD,然后轉(zhuǎn)至步驟401。步驟406 驅(qū)動(dòng)軟件在接收任務(wù)中檢查R2指向的BD的空閑標(biāo)志比特,判斷R2指向的BD是否有數(shù)據(jù),如果空閑標(biāo)志比特為1表示沒(méi)有數(shù)據(jù),退出任務(wù),完成數(shù)據(jù)接收處理。 如果為0表示有數(shù)據(jù)待處理,轉(zhuǎn)到步驟407。步驟407 驅(qū)動(dòng)軟件從R2指向的BD的緩沖地址中取出數(shù)據(jù)進(jìn)行處理,完成后執(zhí)行步驟408。步驟408 將R2指向的BD的空閑標(biāo)志比特置1 (表示該BD空閑),R2指向下一個(gè) BD,然后轉(zhuǎn)至步驟406。通過(guò)以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借助驅(qū)動(dòng)軟件加必需的硬件收發(fā)器平臺(tái)的方式來(lái)實(shí)現(xiàn),當(dāng)然也可以全部通過(guò)硬件收發(fā)器來(lái)實(shí)施,但很多情況下前者是更佳的實(shí)施方式?;谶@樣的理解,本發(fā)明的技術(shù)方案對(duì)背景技術(shù)做出貢獻(xiàn)的全部或者部分可以以驅(qū)動(dòng)軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)驅(qū)動(dòng)軟件產(chǎn)品可以存儲(chǔ)在存儲(chǔ)介質(zhì)中,如ROM/RAM、磁碟、光盤(pán)等,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備 (可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例或者實(shí)施例的某些部分所述的方法。以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。
權(quán)利要求
1.一種避免先入先出隊(duì)列FIFO溢出的方法,其特征在于,包括如下步驟A、在設(shè)備內(nèi)存中創(chuàng)建第一緩沖區(qū)描述符BD環(huán)和第二BD環(huán);B、硬件收發(fā)器將FIFO中的數(shù)據(jù)通過(guò)第一寫(xiě)指針寫(xiě)入第一BD環(huán)的空閑BD中,完成后硬件收發(fā)器產(chǎn)生接收中斷;C、驅(qū)動(dòng)軟件檢測(cè)到接收中斷后,利用第一讀指針從第一BD環(huán)中讀取數(shù)據(jù);驅(qū)動(dòng)軟件利用第二寫(xiě)指針將所讀取的數(shù)據(jù)寫(xiě)入第二 BD環(huán)中;驅(qū)動(dòng)軟件利用第二讀指針從第二 BD環(huán)中讀取數(shù)據(jù)并進(jìn)行處理。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述第一BD環(huán)和第二 BD環(huán)中的BD數(shù)目均為m,m > η,η為硬件收發(fā)器產(chǎn)生一個(gè)接收中斷對(duì)應(yīng)的最大報(bào)文數(shù)。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,對(duì)于第一BD環(huán)和第二 BD環(huán),同一個(gè)BD環(huán)中的各個(gè)BD在內(nèi)存中連續(xù)相鄰,BD的狀態(tài)字段中包含一個(gè)環(huán)回標(biāo)志比特。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,對(duì)于第一BD環(huán)和第二 BD環(huán),同一個(gè)BD環(huán)中的各個(gè)BD在內(nèi)存中不連續(xù)相鄰,BD中有一個(gè)特殊字段用于存放下一個(gè)BD的內(nèi)存起始地址,最后一個(gè)BD的該字段存放第一個(gè)BD的內(nèi)存起始地址。
5.根據(jù)權(quán)利要求1-4任一項(xiàng)所述的方法,其特征在于,步驟B包括Bi、硬件收發(fā)器FIFO達(dá)到高水位后,判斷FIFO中是否有數(shù)據(jù)需要轉(zhuǎn)移,若是執(zhí)行步驟 B2 ;否則轉(zhuǎn)至步驟B6 ;B2、判斷第一寫(xiě)指針指向的第一BD環(huán)中的BD是否為空閑,若是,執(zhí)行步驟B3,否則返回步驟B2 ;B3、從Wl指向的BD中取出緩沖區(qū)地址,將數(shù)據(jù)通過(guò)直接內(nèi)存訪問(wèn)DMA的方式寫(xiě)入到緩沖區(qū)中;B4、判斷第一 BD環(huán)是否完成一個(gè)報(bào)文的接收,若是,繼續(xù)執(zhí)行步驟B5,否則返回步驟B3 ;B5、設(shè)置第一寫(xiě)指針指向的BD的空閑標(biāo)志為有數(shù)據(jù),然后將第一寫(xiě)指針指向第一 BD環(huán)的下一個(gè)BD ;B6、硬件收發(fā)器判斷是否滿(mǎn)足產(chǎn)生接收中斷的條件,若是則產(chǎn)生接收中斷,完成步驟B; 否則返回步驟Bi。
6.根據(jù)權(quán)利要求1-4任一項(xiàng)所述的方法,其特征在于,步驟C包括Cl、驅(qū)動(dòng)軟件在中斷處理程序中檢查第一讀指針指向的第一 BD環(huán)中的BD是否有數(shù)據(jù), 若是執(zhí)行步驟C2,否則轉(zhuǎn)至步驟C6 ;C2、檢查第二寫(xiě)指針指向的第二BD環(huán)的BD是否空閑,若是,執(zhí)行步驟C3,否則轉(zhuǎn)至步驟C5 ;C3、將第二寫(xiě)指針指向BD的緩沖指針與第一讀指針指向的BD的緩沖指針交換; C4、設(shè)置第二寫(xiě)指針指向的BD的空閑標(biāo)志為有數(shù)據(jù),使第二寫(xiě)指針指向第二 BD環(huán)的下一個(gè) BD ;C5、設(shè)置第一讀指針指向的BD的空閑標(biāo)志為空閑,使第一讀指針指向第一 BD環(huán)的下一個(gè)BD,然后轉(zhuǎn)至步驟Cl ;C6、在接收任務(wù)中檢查第二讀指針指向的第二 BD環(huán)的BD是否有數(shù)據(jù),如果沒(méi)有數(shù)據(jù), 完成數(shù)據(jù)接收處理;如果有數(shù)據(jù),轉(zhuǎn)到步驟C7 ;·C7、從第二讀指針指向的第二 BD環(huán)的BD的緩沖地址中取出數(shù)據(jù)進(jìn)行處理,完成后執(zhí)行步驟C8 ;C8、設(shè)置第二讀指針指向的第二 BD環(huán)的BD的空閑標(biāo)志為空閑,使第二讀指針指向第二 BD環(huán)的下一個(gè)BD,然后轉(zhuǎn)至步驟C6。
7 一種設(shè)備,包括硬件收發(fā)器模塊,緩沖區(qū)描述符BD環(huán)模塊和驅(qū)動(dòng)軟件模塊 ,其特征在于,所述BD環(huán)模塊中創(chuàng)建有第一緩沖區(qū)描述符BD環(huán)和第二 BD環(huán),其中所述硬件收發(fā)器模塊,用于將先進(jìn)先出FIFO單元中的數(shù)據(jù)通過(guò)第一寫(xiě)指針寫(xiě)入第一 BD環(huán)的空閑BD中,完成后產(chǎn)生接收中斷;所述驅(qū)動(dòng)軟件模塊,用于在檢測(cè)到所述硬件收發(fā)器模塊產(chǎn)生的接收中斷后,利用第一讀指針從第一 BD環(huán)中讀取數(shù)據(jù);利用第二寫(xiě)指針將所讀取的數(shù)據(jù)寫(xiě)入第二 BD環(huán)中;并利用第二讀指針從第二 BD環(huán)中讀取數(shù)據(jù)并進(jìn)行處理。
8.根據(jù)權(quán)利要求7所述的設(shè)備,其特征在于,所述第一BD環(huán)和第二 BD環(huán)中的BD數(shù)目均為m,m > η,η為硬件收發(fā)器產(chǎn)生一個(gè)接收中斷對(duì)應(yīng)的最大報(bào)文數(shù)。
9.根據(jù)權(quán)利要求7所述的設(shè)備,其特征在于,對(duì)于第一BD環(huán)和第二 BD環(huán),同一個(gè)BD環(huán)中的各個(gè)BD在內(nèi)存中連續(xù)相鄰,BD的狀態(tài)字段中包含一個(gè)環(huán)回標(biāo)志比特。
10.根據(jù)權(quán)利要求7所述的設(shè)備,其特征在于,對(duì)于第一BD環(huán)和第二 BD環(huán),同一個(gè)BD 環(huán)中的各個(gè)BD在內(nèi)存中不連續(xù)相鄰,BD中有一個(gè)特殊字段用于存放下一個(gè)BD的內(nèi)存起始地址,最后一個(gè)BD的該字段存放第一個(gè)BD的內(nèi)存起始地址。
全文摘要
本發(fā)明提供了一種避免先入先出隊(duì)列(FIFO)溢出的方法,包括如下步驟A、在設(shè)備內(nèi)存中創(chuàng)建第一緩沖區(qū)描述符BD環(huán)和第二BD環(huán);B、硬件收發(fā)器將FIFO中的數(shù)據(jù)通過(guò)第一寫(xiě)指針寫(xiě)入第一BD環(huán)的空閑BD中,完成后硬件收發(fā)器產(chǎn)生接收中斷;C、驅(qū)動(dòng)軟件檢測(cè)到接收中斷后,利用第一讀指針從第一BD環(huán)中讀取數(shù)據(jù);驅(qū)動(dòng)軟件利用第二寫(xiě)指針將所讀取的數(shù)據(jù)寫(xiě)入第二BD環(huán)中;驅(qū)動(dòng)軟件利用第二讀指針從第二BD環(huán)中讀取數(shù)據(jù)并進(jìn)行處理。本發(fā)明方案在不修改硬件收發(fā)器的前提下避免出現(xiàn)接收FIFO溢出,相應(yīng)提高驅(qū)動(dòng)接收的穩(wěn)定性和可靠性。
文檔編號(hào)H04L12/56GK102209042SQ201110205098
公開(kāi)日2011年10月5日 申請(qǐng)日期2011年7月21日 優(yōu)先權(quán)日2011年7月21日
發(fā)明者黃偉 申請(qǐng)人:邁普通信技術(shù)股份有限公司