??? 摘 要: 在傳統(tǒng)的中斷和輪詢" title="輪詢">輪詢方式基礎(chǔ)上,提出一種中斷與輪詢相結(jié)合的接收機(jī)制,,可以根據(jù)負(fù)載情況,在設(shè)定的門限控制下,,對(duì)多路" title="多路">多路串口" title="串口">串口系統(tǒng)中不同的通道區(qū)分不同的接收方法,。應(yīng)用該方法在VxWorks操作系統(tǒng)上實(shí)現(xiàn)了對(duì)多路高速串口的實(shí)時(shí)接收處理。
??? 關(guān)鍵詞: 高速多串口? 中斷? 輪詢
?
??? 串口通信具有傳輸距離遠(yuǎn),、傳輸穩(wěn)定,、簡(jiǎn)單實(shí)用等特點(diǎn),已被廣泛應(yīng)用于工業(yè)控制,、數(shù)據(jù)采集,、網(wǎng)絡(luò)通信等領(lǐng)域。在這些應(yīng)用領(lǐng)域中,,串口通信用于實(shí)時(shí)地從各個(gè)串口接收數(shù)據(jù),,而向各個(gè)串口發(fā)送的主要是控制信息,一般不要求嚴(yán)格的實(shí)時(shí)性,。因此提高串口設(shè)備接收的實(shí)時(shí)性至關(guān)重要,。
??? 設(shè)備接收到數(shù)據(jù)時(shí),系統(tǒng)可通過(guò)兩種途徑獲取數(shù)據(jù)包到達(dá)的信息,。一種是中斷方式" title="中斷方式">中斷方式,,利用硬件中斷機(jī)制實(shí)現(xiàn)設(shè)備和系統(tǒng)的應(yīng)答對(duì)話,即當(dāng)外部設(shè)備需要CPU處理數(shù)據(jù)時(shí),,設(shè)備就發(fā)一個(gè)中斷信號(hào)給系統(tǒng),,系統(tǒng)在收到中斷請(qǐng)求時(shí)要保存中斷現(xiàn)場(chǎng),調(diào)用相應(yīng)的中斷服務(wù)程序響應(yīng)設(shè)備的中斷請(qǐng)求,,退出中斷處理程序后要恢復(fù)現(xiàn)場(chǎng),。上下文的切換要占據(jù)系統(tǒng)開(kāi)銷,在數(shù)據(jù)量過(guò)載時(shí)會(huì)使得中斷頻率過(guò)高,,CPU忙于處理硬件中斷,,上層應(yīng)用程序?qū)τ跀?shù)據(jù)包的處理無(wú)法執(zhí)行,而中斷程序還不斷往隊(duì)列中放數(shù)據(jù),系統(tǒng)將自陷在中斷響應(yīng)這一環(huán)節(jié),,產(chǎn)生所謂的“活鎖”,。另一種是輪詢方式,系統(tǒng)每隔一定時(shí)間便檢查一次物理設(shè)備,,若設(shè)備“報(bào)告”有數(shù)據(jù)到達(dá),,則調(diào)用相應(yīng)的處理程序。但固定的輪詢周期增加了數(shù)據(jù)等待處理時(shí)間,,降低了系統(tǒng)實(shí)時(shí)性,。而且當(dāng)數(shù)據(jù)量比較小時(shí),頻繁查詢沒(méi)有數(shù)據(jù)達(dá)到的設(shè)備也是對(duì)CPU資源的浪費(fèi),。
??? 可見(jiàn)中斷和輪詢方式都不能滿足不同負(fù)載情況下系統(tǒng)的實(shí)時(shí)性要求,。本文借鑒Linux系統(tǒng)中NAPI[1]方法,結(jié)合中斷與輪詢的優(yōu)點(diǎn),,提出一種輪詢與中斷結(jié)合的調(diào)度方式,。這種調(diào)度機(jī)制在多串口系統(tǒng)中,當(dāng)負(fù)載在不同的串口通道不均衡時(shí),,可以提高CPU的利用效率,,并能滿足業(yè)務(wù)的時(shí)延要求。另外,,根據(jù)到達(dá)數(shù)據(jù)量分析得出了輪詢,、中斷切換門限和輪詢周期。
1 算法描述
??? 在同一系統(tǒng)中處理相同業(yè)務(wù)量時(shí),,中斷和輪詢處理的時(shí)間相同,。因?yàn)檫^(guò)程相同,都是把數(shù)據(jù)從外設(shè)緩沖搬移到CPU內(nèi)存中,,所不同的是中斷進(jìn)行上下文切換要占據(jù)系統(tǒng)開(kāi)銷,,而輪詢只是查詢一下寄存器狀態(tài)。相比之下,,輪詢占用CPU的時(shí)間很短,,一般中斷為幾個(gè)μs,輪詢?yōu)閹装賜s,,根據(jù)不同系統(tǒng)而有差別,。相反,在數(shù)據(jù)量比較小的情況下輪詢中存在空轉(zhuǎn)情況,,無(wú)疑增加了系統(tǒng)開(kāi)銷,。
??? 目前,處理中斷和輪詢互換的方法有定時(shí)中斷法(Clocked Interrupts),,即設(shè)置一個(gè)定時(shí)器,定時(shí)器到時(shí),如果有中斷,,則響應(yīng)中斷,,調(diào)用中斷服務(wù)程序處理數(shù)據(jù)。這種方法在數(shù)據(jù)量大時(shí)類似于輪詢,,在負(fù)載小時(shí)中斷由異步事件觸發(fā)降低了開(kāi)銷,。但是這種機(jī)制需要一個(gè)精確的、頻率很高的系統(tǒng)時(shí)鐘,,并且這種方法受固定定時(shí)周期的限制,,不是在任何情況下都有效。
??? 在并行系統(tǒng)中還應(yīng)用了一種叫輪詢定時(shí)(Polling Watchdog)的機(jī)制,,這種方法主要是為了解決接收處理中的等待時(shí)延問(wèn)題,。基本思想就是在輪詢接收開(kāi)始時(shí)設(shè)置一個(gè)看門狗定時(shí)器,,以滿足業(yè)務(wù)的最小時(shí)延要求,,而且中斷要在接收超時(shí)才產(chǎn)生。此方法的不足之處是在負(fù)載小時(shí)解決不了輪詢空轉(zhuǎn)問(wèn)題,。
??? 混合中斷,、輪詢方式(HIP)主要應(yīng)用在網(wǎng)絡(luò)接口系統(tǒng)中。工作方式為基于觀測(cè)接收的負(fù)載,,改變切換門限,,自動(dòng)在中斷和輪詢兩種方式中切換。中斷方式?jīng)]有考慮到超時(shí)中斷,,當(dāng)數(shù)據(jù)到達(dá)間隔很大時(shí),,會(huì)降低實(shí)時(shí)性。在比較中斷和輪詢開(kāi)銷時(shí),,定義VI+V(B)為中斷開(kāi)銷,,其中VI為中斷的固有開(kāi)銷,V(B)為系統(tǒng)接收B字節(jié)數(shù)據(jù)的開(kāi)銷,,VP+V(B)為輪詢開(kāi)銷,,VP為輪詢的固有開(kāi)銷。但在一次輪詢和中斷接收中,,中斷和輪詢所接收的數(shù)據(jù)可能不相等,,中斷開(kāi)銷和輪詢開(kāi)銷便失去了比較意義。
??? 以上幾種方法均有不足,,但在多路串口系統(tǒng)中,,還各有不同的特點(diǎn),即在每個(gè)獨(dú)立的通道可能存在不同的負(fù)載情況,。如果對(duì)全部的串口通道統(tǒng)一應(yīng)用中斷方式或查詢方式,,則顯然不能適應(yīng)各自串口通道的數(shù)據(jù)量,不能滿足系統(tǒng)實(shí)時(shí)性和高效率的綜合要求。根據(jù)這一特點(diǎn),,提出了在多路串口系統(tǒng)中,,輪詢和中斷相結(jié)合的接收策略,在中斷方式下還靈活應(yīng)用了批中斷技術(shù),。
??? 算法描述:
??? com0=polling...comN=polling
??? For comID←0 up to comMAX
??????? ?If TI>γ or PU=PUMAX Then
????????? ???comID=interrupt
????????? ???DelList(comID)
??? N路串口的初始狀態(tài)為輪詢,,檢查輪詢隊(duì)列,如果數(shù)據(jù)到達(dá)間隔時(shí)間TI大于門限γ或者輪詢空轉(zhuǎn)次數(shù)PU等于空轉(zhuǎn)門限PUMAX,,則該端口改為中斷狀態(tài),,在輪詢隊(duì)列中刪除該端口。根據(jù)不同的系統(tǒng),,間隔時(shí)間門限γ和空轉(zhuǎn)門限PUMAX的取值不同,。
??? If TI<γ Then
?????? ??comID=polling
?????? ??AddList(comID)
??? 在中斷狀態(tài)下,如果數(shù)據(jù)到達(dá)間隔時(shí)間TI小于門限γ,,則該端口改為輪詢狀態(tài),,在輪詢隊(duì)列中增加該端口。
2 門限設(shè)計(jì)
??? 如果事件隨機(jī)發(fā)生而且發(fā)生頻率很低,,以致大多數(shù)輪詢都認(rèn)為事件沒(méi)有發(fā)生,,則中斷就會(huì)是首選的事件通知機(jī)制;如果事件定期發(fā)生且可以預(yù)測(cè),,而大多數(shù)輪詢都發(fā)現(xiàn)事件已發(fā)生,,則首選機(jī)制是輪詢。在這兩者之間存在這樣一種情況,,即輪詢行為和反應(yīng)型行為的效果都相同,,在它們之間如何選擇都無(wú)關(guān)緊要。這種情況即為所尋找的輪詢和中斷的切換門限,。
2.1 門限度量標(biāo)準(zhǔn)的選擇
??? 數(shù)據(jù)多少的衡量都是以單位時(shí)間內(nèi)的吞吐量計(jì)算,,即數(shù)據(jù)速率。如果以吞吐率" title="吞吐率">吞吐率的多少作為切換門限的標(biāo)準(zhǔn),,則在分組定長(zhǎng)情況下,,這種計(jì)算方法可以近似體現(xiàn)出負(fù)載情況,但當(dāng)分組不定長(zhǎng)時(shí)就不能體現(xiàn)實(shí)際負(fù)載了,,如圖1所示的四種情況,。
?
?
??? 圖1(a)和圖1(b)的分組長(zhǎng)度不同,但之間的到達(dá)間隔都很小,。計(jì)算得出圖1(b)單位時(shí)間的吞吐率明顯要比圖1(a)小,,但如果圖1(b)采用中斷方式,就要頻繁地響應(yīng)中斷,,效率將大大降低,。圖1(d)的分組很長(zhǎng),,一次接收中接收到的數(shù)據(jù)非常多,但之間的到達(dá)間隔很長(zhǎng),,如果計(jì)算吞吐率選擇的單位時(shí)間正好為數(shù)據(jù)接收時(shí)間,,在這一段時(shí)間內(nèi)吞吐率很大,,則誤認(rèn)為數(shù)據(jù)量很大,,選擇輪詢方式接收。相比之下,,圖1(c)和圖1(d)選用中斷方式更為理想,。
??? 根據(jù)以上分析可以發(fā)現(xiàn),用數(shù)據(jù)到達(dá)的時(shí)間間隔可以近似地表示數(shù)據(jù)量的大小,。如果數(shù)據(jù)到達(dá)間隔很小,,且頻繁到達(dá),則認(rèn)為負(fù)載很大,,選擇輪詢方式,;如果數(shù)據(jù)到達(dá)間隔很大,則認(rèn)為負(fù)載很小,,選擇中斷方式,。在輪詢方式中,如果根據(jù)已知的到達(dá)時(shí)間,,推算出下一數(shù)據(jù)的到達(dá)時(shí)間,,根據(jù)計(jì)算出的結(jié)果來(lái)設(shè)定輪詢周期,則輪詢效率更加提升,。
2.2 門限的計(jì)算
??? 上述計(jì)算到達(dá)間隔判斷切換時(shí)機(jī)的方式,,不能體現(xiàn)數(shù)據(jù)到達(dá)間隔的變化規(guī)律??蛇x用平均到達(dá)時(shí)間的均方根和均值的比值作為判斷切換的標(biāo)準(zhǔn),,這個(gè)比值系數(shù)代表了平均到達(dá)時(shí)間的變化程度。當(dāng)比值小時(shí)表明預(yù)測(cè)的值與平均值偏差很小,,數(shù)據(jù)到達(dá)的間隔時(shí)間是有規(guī)律的,,可以預(yù)測(cè)。這種情況顯然要應(yīng)用輪詢方式,,把輪詢周期設(shè)為平均到達(dá)間隔時(shí)間,。
??? 平均到達(dá)間隔時(shí)間的計(jì)算方法如下式:
???
式中:D為最后一個(gè)數(shù)據(jù)到達(dá)的間隔時(shí)間;α為平均到達(dá)間隔時(shí)間的加權(quán)系數(shù),,α控制著D相對(duì)于以往的到達(dá)時(shí)間間隔歷史所占的比重,。用這種方法,平均到達(dá)間隔時(shí)間就可以積累到達(dá)間隔時(shí)間了,。
??? 平均到達(dá)時(shí)間的方差用下式估計(jì):
???
式中:β為到達(dá)間隔時(shí)間的方差加權(quán)系數(shù),,且控制估計(jì)器的記憶性,。σ2開(kāi)方就得到平均到達(dá)間隔時(shí)間的均方根σ了。
??? 下式表明了切換到輪詢時(shí)的門限:
???
式中:γ為預(yù)測(cè)門限,,為系統(tǒng)可容忍的最大輪詢周期,,在本系統(tǒng)中為滿足上層的應(yīng)用,為20 ms,。表明數(shù)據(jù)到達(dá)間隔規(guī)律,;表明平均到達(dá)間隔小于系統(tǒng)所能忍受的最小間隔。數(shù)據(jù)到達(dá)不頻繁,,認(rèn)為滿足以上兩個(gè)條件時(shí)切換到輪詢模式,;當(dāng)滿足的條件相反時(shí),切換到中斷方式,。
3 實(shí)例分析
??? 在可接收10路空中信號(hào)的多串口系統(tǒng)中對(duì)該算法進(jìn)行實(shí)現(xiàn),,系統(tǒng)結(jié)構(gòu)如圖2。該系統(tǒng)可將數(shù)據(jù)信息(主要為語(yǔ)音數(shù)據(jù))接收后轉(zhuǎn)換為以太網(wǎng)數(shù)據(jù)包,,通過(guò)10MHz以太網(wǎng)口送出,。同時(shí),它從以太網(wǎng)口接收來(lái)自控制臺(tái)的各類指令,,完成相應(yīng)的處理任務(wù),。
?
??? 信號(hào)經(jīng)過(guò)1:10功分器,分給10個(gè)RF接收模塊,,完成RF接收,,輸出串行信號(hào),每路串口為串行信號(hào)的最大速率115.2kbps,,RF接收模塊每20ms發(fā)一個(gè)數(shù)據(jù)包,,一個(gè)數(shù)據(jù)包最大為30bit。之后串行信號(hào)經(jīng)過(guò)3片OX16C954(每片有4路UART)轉(zhuǎn)換成并行總線信號(hào),,輸出給MPC860T(CPU),。每片OX16C954設(shè)置有128B的環(huán)形緩沖區(qū),所以經(jīng)過(guò)時(shí)間緩沖區(qū)就會(huì)被寫滿,。為了保證不丟失數(shù)據(jù),,應(yīng)該在8.8ms內(nèi)完成對(duì)10個(gè)終端接收模塊進(jìn)行一次接收。OX16C954中斷門限設(shè)為64B,,當(dāng)接收緩沖超過(guò)64B時(shí),,OX16C954產(chǎn)生接收中斷。在OX16C954還設(shè)置有超時(shí)中斷,,當(dāng)從接收最后一個(gè)停止位中心開(kāi)始計(jì)時(shí),,在四個(gè)符號(hào)周期內(nèi)沒(méi)有接收新的信息,即就產(chǎn)生超時(shí)中斷,。批中斷的應(yīng)用如圖3,。多個(gè)串口通過(guò)CPLD共享一個(gè)中斷源,,在中斷頻繁,多個(gè)串口同時(shí)產(chǎn)生中斷的情況下,,實(shí)現(xiàn)了批中斷,,節(jié)約了中斷資源,提高了中斷效率,。
?
?
??? 本系統(tǒng)的設(shè)計(jì)基于VxWorks操作系統(tǒng),。VxWorks操作系統(tǒng)提供對(duì)多種處理器的廣泛支持,具有完善的開(kāi)發(fā)環(huán)境,、開(kāi)放的軟件接口,、優(yōu)異的實(shí)時(shí)性能和全面可靠的網(wǎng)絡(luò)功能及良好的可裁剪性,,適用于各種嵌入式環(huán)境的開(kāi)發(fā),。
??? 程序?qū)崿F(xiàn)過(guò)程:系統(tǒng)加電待操作系統(tǒng)啟動(dòng)之后,應(yīng)用程序首先根據(jù)主控和PC機(jī)的IP地址,,得到它們的MAC地址,,為以后進(jìn)行UDP數(shù)據(jù)傳送做準(zhǔn)備;初始化MPC860T的Port C口,,把PC12,、PC15初始化為數(shù)據(jù)輸出口,分別用于點(diǎn)亮運(yùn)行時(shí)的狀態(tài)燈和設(shè)置/清除硬件看門狗,;初始化OX16C954,,打開(kāi)10路串口,接收終端模塊的數(shù)據(jù),;同時(shí)向終端模塊發(fā)送數(shù)據(jù),,初始化UDP協(xié)議棧;最后,,進(jìn)入無(wú)限循環(huán)中,,從各個(gè)串口收集數(shù)據(jù),解開(kāi)數(shù)據(jù)包,,以UDP的方式,,把話音包發(fā)給PC機(jī),把非話音包發(fā)給主控,;同時(shí),,從網(wǎng)絡(luò)上接收來(lái)自主控的UDP數(shù)據(jù),根據(jù)端口號(hào),,把數(shù)據(jù)轉(zhuǎn)發(fā)給各個(gè)終端模塊,。PC機(jī)不直接向DPM發(fā)送UDP數(shù)據(jù),只有主控向各個(gè)終端發(fā)送數(shù)據(jù),,故由DPM至PC機(jī)的數(shù)據(jù)為單向,。管理看門狗,,每循環(huán)一次,開(kāi)關(guān)一次看門狗,,處理一次狀態(tài)燈,。整個(gè)程序的流程如圖4所示。
?
?
??? 在10路都沒(méi)有數(shù)據(jù)的極限情況下測(cè)量輪詢開(kāi)銷VP,。在這種極限情況下,,應(yīng)用全中斷的方式,10路串口沒(méi)有數(shù)據(jù)不會(huì)產(chǎn)生中斷,,中斷開(kāi)銷為0,;應(yīng)用全輪詢的方式,CPU每次只查詢外部寄存器但不接收數(shù)據(jù),,所以每次CPU都是空轉(zhuǎn),,測(cè)量出來(lái)的為輪詢的固定開(kāi)銷VP=163.84μs。在這種情況下,,中斷顯然要優(yōu)于輪詢,。
3.1 均衡負(fù)載
??? 在多路負(fù)載均衡的情況下,測(cè)量中斷吞吐率OI=B1為達(dá)到OX16C954中斷門限后,,觸發(fā)的接收中斷所接收的數(shù)據(jù)量(B1≥64B),;B2為產(chǎn)生超時(shí)中斷時(shí)所接收的數(shù)據(jù)量(B2≤64B)。輪詢吞吐率OP=B′為輪詢接收的數(shù)據(jù)量,。如圖5所示,,在VxWorks系統(tǒng)中1tick=1/8000(s)。因?yàn)樵O(shè)置了中斷門限,,所以中斷在數(shù)據(jù)量低的時(shí)刻有一個(gè)躍變,;輪詢的躍變由輪詢的周期設(shè)置,如果改變輪詢周期,,躍變點(diǎn)將發(fā)生轉(zhuǎn)移,。輪詢的吞吐率隨輸入數(shù)據(jù)量的增加而呈線性增長(zhǎng);在數(shù)據(jù)量低時(shí)中斷要優(yōu)于輪詢,,隨著數(shù)據(jù)量的增長(zhǎng)輪詢就要優(yōu)于中斷,,在兩者相交的時(shí)刻,通過(guò)實(shí)驗(yàn)可以找到γ和PUMAX的值,。
?
3.2 非均衡負(fù)載情況
??? 非均衡負(fù)載情況,,即m1路數(shù)據(jù)負(fù)載大、m2路數(shù)據(jù)負(fù)載小的情況(m1+m2=10)下,,測(cè)量OI,、OP和OC(中斷和輪詢相結(jié)合的吞吐率)。如圖6所示,,在橫坐標(biāo)為1處,,為m1=3,,m2=7的情況,由于應(yīng)用了批中斷,,中斷的效率要優(yōu)于輪詢,,中斷和輪詢相結(jié)合的方法要略優(yōu)于中斷;在橫坐標(biāo)為2處,,為m1=5,,m2=5的情況,相結(jié)合的方法要略優(yōu)于中斷和輪詢,;在橫坐標(biāo)3處為m1=7,,m2=3的情況,相結(jié)合的方法近似輪詢,,要優(yōu)于中斷,。
?
?
??? 本文在綜合分析各種串口接收方式不足的基礎(chǔ)上,提出了中斷和輪詢相結(jié)合的方法,。實(shí)驗(yàn)結(jié)果表明,,在滿足系統(tǒng)實(shí)時(shí)性要求的前提下,改進(jìn)后的高速多串口系統(tǒng)吞吐率比應(yīng)用單一的中斷或輪詢方式在多路高速串口系統(tǒng)中,、各串口負(fù)載不均衡的情況下,得到了明顯的提高,。
參考文獻(xiàn)
[1] SALIM J H,,NETWORKS Z,OLSSON R.Beyond softnet,,Proceedings of the 5th Annual Linux Showcase & Conference,,2001.
[2] DOVROLIS C,THAYER B,,RAMANATHAN P.HIP:Hybrid?Interrupt-Polling for the Network Interface.WI:University of Wisconsin-Madison,,2000.
[3] CHUNG J D,TRAW C B S,,SMITH J M,,Event-signaling?with-in higher performance network subsystems.in Proceedings,High Performance Communications Subsystems,,1995,,8.
[4] MAQUELIN O,GAO G R,,HUM H H J,,et al.Polling watchdog:Combining polling and interrupts for efficient message?handling.in Proceedings of the 23rd Annual International?Symposium on Computer Architecture,1996.
[5] Oxford Semiconductor.OX16C954 rev B Data Sheet R1.0.UK:Oxon,,2001.