呂孟恩,韓曉明,張鵬軍
(中北大學(xué) 機電工程學(xué)院,太原030051)
目前武器系統(tǒng)通訊仍然多采用CAN 總線,隨著對武器系統(tǒng)控制速率及精度要求的不斷提高,CAN總線逐漸顯現(xiàn)出不足,如:總線通信速率在系統(tǒng)中某些關(guān)鍵部位無法達(dá)到預(yù)期要求;傳輸模式過于簡單等。FlexRay 總線具有高傳輸效率、故障可容錯等特點,彌補了CAN 總線的不足,于是FlexRay 總線技術(shù)在火炮系統(tǒng)中得到應(yīng)用。FlexRay 總線協(xié)議中數(shù)據(jù)段的長度為254 字節(jié),而CAN 總線的數(shù)據(jù)段長度為13 字節(jié),因此當(dāng)火控系統(tǒng)中同時存在CAN 協(xié)議與FlexRay 協(xié)議時,若要實現(xiàn)兩種總線的通信,首先要解決數(shù)據(jù)幀格式不統(tǒng)一的問題。
CAN 總線使用串行通訊方式,支持分布式實時控制,工作方法有多主工作方式、非破壞仲裁技術(shù)和接收濾波3 種。它的數(shù)據(jù)幀分為標(biāo)準(zhǔn)幀和擴展幀,均由7 個位場組成,如圖1所示[1]。
圖1 CAN 2.0B 標(biāo)準(zhǔn)數(shù)據(jù)幀格式Fig.1 CAN 2.0B standard data frame format
幀起始是數(shù)據(jù)幀的起始標(biāo)志,是一個顯性位;仲裁場包含了11 位的識別符和遠(yuǎn)程發(fā)送請求位(RTR),節(jié)點根據(jù)標(biāo)識符的值判斷是否接收該報文;控制場由一個4 位的數(shù)據(jù)長度代碼和2 個顯性保留位組成,DLC 長度可以作為判斷數(shù)據(jù)是否全部接收的依據(jù);數(shù)據(jù)場中存放的是將要發(fā)送的數(shù)據(jù),數(shù)據(jù)長度最高為8 個字節(jié),最低可以為0 字節(jié),由高位到低位依次發(fā)送;CRC 場包含CRC 序列和CRC界定符;應(yīng)答場由應(yīng)答間隙和應(yīng)答界定符組成,應(yīng)答間隙中的ACK 信號可以作為判斷接收器接收到的報文是否有效的依據(jù),若接收到的報告為 “顯性”,則報文接收成功,若接收到的報告為“隱性”,則報文接收失敗[2]。
FlexRay 總線作為近年發(fā)展迅速的一種事件觸發(fā)類型的新型現(xiàn)場總線技術(shù),其所具有的高實時性、高確定性、擁有容錯性等優(yōu)點使FlexRay 得到廣泛應(yīng)用。FlexRay 的一個通信周期由4 個部分組成,包含了靜態(tài)段、動態(tài)段、特征符號窗和網(wǎng)絡(luò)空閑時間[3],其中靜態(tài)段采用時分多路的信息傳輸方式,動態(tài)段采用柔性時分多路復(fù)用訪問方式。靜態(tài)段可以劃分成多個長度相同的靜態(tài)時隙分配給網(wǎng)絡(luò)中各節(jié)點,當(dāng)所分配的時隙到來時該節(jié)點才能對數(shù)據(jù)進行收發(fā)。動態(tài)段則更加靈活的支持事件觸發(fā)。
FlexRay 的數(shù)據(jù)幀由3 個部分組成,即幀頭部分、有效數(shù)據(jù)段和幀尾部分,數(shù)據(jù)幀格式如圖2所示。其中,有效數(shù)據(jù)部分最高由254 個字節(jié)組成。在CRC 校驗中,有效數(shù)據(jù)部分的前6 個字節(jié)設(shè)為碼距,當(dāng)數(shù)據(jù)長度超過248 字節(jié)時,碼距長度減小為4個字節(jié)。
圖2 FlexRay 數(shù)據(jù)幀格式Fig.2 FlexRay data frame format
FlexRay 總線協(xié)議與CAN 總線協(xié)議為兩種不同的總線協(xié)議,無法直接進行數(shù)據(jù)傳輸。為了解決FlexRay 與CAN 的通信問題,本文設(shè)計了一種基于CAN 協(xié)議和FlexRay 協(xié)議的網(wǎng)關(guān),通過轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu)實現(xiàn)信息交互調(diào)度。兩種協(xié)議的對比關(guān)系如表1所示。
表1 FlexRay 協(xié)議與CAN 協(xié)議對比關(guān)系表Tab.1 Comparison of FlexRay protocol and CAN protocol
本網(wǎng)關(guān)通過對FlexRay 總線和CAN 總線中的數(shù)據(jù)幀進行拆分,然后再將拆分后的數(shù)據(jù)在網(wǎng)關(guān)中進行重組,按需求發(fā)送至FlexRay 目標(biāo)節(jié)點或者CAN 目標(biāo)節(jié)點,達(dá)到數(shù)據(jù)在兩種總線之間傳輸?shù)哪康模瑢崿F(xiàn)總線之間的互相通信。網(wǎng)關(guān)系統(tǒng)結(jié)構(gòu)框圖如圖3所示。
圖3 網(wǎng)關(guān)系統(tǒng)結(jié)構(gòu)框圖Fig.3 Gateway system structure diagram
網(wǎng)關(guān)核心單元采用16 位微控制器MC9S12XF512,該控制器同時集成了CAN 總線單元和FlexRay 總線單元,其中FlexRay 總線驅(qū)動器選用TJA1080 芯片,該通訊控制器可以實現(xiàn)物理總線與FlexRay 總線之間的通訊。同時,該芯片可以讓FlexRay 網(wǎng)絡(luò)具有差分發(fā)送和差分接收的功能,單通道通訊速率可達(dá)到10 Mbps,極大地提高了系統(tǒng)的數(shù)據(jù)傳輸速率。CAN 信號收發(fā)器選用TJA1050 芯片,該芯片實現(xiàn)了物理總線與CAN 總線之間的通信,使CAN 總線具備了差動接收和差動發(fā)送的功能。TJA1050 將輸出信號的CAN_H 與CAN_L 進行耦合,增強了信號的抗電磁干擾能力,即使周圍存在較大的電磁輻射,網(wǎng)關(guān)仍具有優(yōu)秀的差動接收能力[4]。
CAN 總線與FlexRay 總線屬于兩種不同的總線協(xié)議,所以在設(shè)計兩種總線子網(wǎng)時存在一定差別。當(dāng)信號在兩種網(wǎng)絡(luò)之間的相互傳輸時,網(wǎng)關(guān)首先接收來自目標(biāo)節(jié)點上的數(shù)據(jù),然后對數(shù)據(jù)進行拆分、緩存和重裝,實現(xiàn)格式的轉(zhuǎn)換。最后,將重裝之后的報文放在另一個總線網(wǎng)絡(luò)中,面向目標(biāo)節(jié)點進行傳輸。FlexRay-CAN 網(wǎng)關(guān)的軟件結(jié)構(gòu)主要由FlexRay信號接收中斷、FlexRay 信號接收循環(huán)隊列、FlexRay信號接收處理任務(wù)、CAN 信號發(fā)送循環(huán)隊列、CAN信號發(fā)送任務(wù)和中斷處理任務(wù)等功能組成,實現(xiàn)消息在不同總線協(xié)議之間的轉(zhuǎn)換和傳輸。網(wǎng)關(guān)軟件結(jié)構(gòu)如圖4所示。
圖4 FlexRay-CAN 網(wǎng)關(guān)軟件架構(gòu)Fig.4 FlexRay-CAN gateway software architecture
當(dāng)需要在FlexRay 子網(wǎng)中路由消息時,F(xiàn)lexRay-CAN 網(wǎng)關(guān)生成一個中斷,中斷處理子程序接收要轉(zhuǎn)發(fā)的消息,并將該消息從接收緩沖區(qū)發(fā)送到FlexRay 子網(wǎng)的報文接收隊列中,然后網(wǎng)關(guān)通過在FRtoCAN 網(wǎng)關(guān)路由表中查找需要發(fā)送的FlexRay 報文所映射的信息,將FlexRay 報文接收隊列中的消息發(fā)送至CAN 子網(wǎng)的發(fā)送緩沖區(qū)中。由于FlexRay數(shù)據(jù)段的長度約為CAN 的19 倍,所以在將數(shù)據(jù)從FlexRay 子網(wǎng)傳輸?shù)紺AN 子網(wǎng)時,需要對FlexRay報文進行拆分,將其分割成CAN 子網(wǎng)的目標(biāo)節(jié)點能夠接收的報文格式,該過程采用雙緩沖區(qū)結(jié)構(gòu)以保證數(shù)據(jù)的完整性[5]。
當(dāng)火炮系統(tǒng)接收FlexRay 報文時,依據(jù)FRtoCAN路由表將報文的數(shù)據(jù)復(fù)制到目標(biāo)節(jié)點,流程如圖5所示。
在一個通信周期的靜態(tài)段發(fā)送報文時,一般用槽標(biāo)號表示FlexRay 報文標(biāo)號。當(dāng)FlexRay 執(zhí)行數(shù)據(jù)接收處理任務(wù)時,為防止信息緩存器中的內(nèi)容在數(shù)據(jù)接收處理的過程中改變,首先需要將信息緩存器進行鎖存,等待接收處理任務(wù)完成之后再將其釋放。由于FlexRay 報文中數(shù)據(jù)量大于CAN 報文的數(shù)據(jù)量,所以將FlexRay 報文存儲在雙緩沖區(qū)結(jié)構(gòu)中,優(yōu)化CAN 報文的發(fā)送處理任務(wù)[6]。
在雙緩沖區(qū)結(jié)構(gòu)中,主緩沖區(qū)和從緩沖區(qū)狀態(tài)的切換與所有與雙緩沖區(qū)相關(guān)的CAN 報文發(fā)送都基于2 個條件:一是讀操作在CAN 報文數(shù)據(jù)緩沖區(qū)的狀態(tài)標(biāo)志位信息,二是狀態(tài)切換使能標(biāo)志位在主從緩沖區(qū)的狀態(tài)信息。緩沖區(qū)中的屬性描述表以及索引號決定了CAN 報文的發(fā)送任務(wù)是否順利完成。CAN 報文發(fā)送任務(wù)流程如圖6所示。
圖5 FlexRay 報文接收任務(wù)流程Fig.5 FlexRay message receiving task flow chart
在雙緩沖區(qū)結(jié)構(gòu)中,從緩沖區(qū)的寫操作和主緩沖區(qū)的讀操作分別只能發(fā)生在FRtoCAN 網(wǎng)關(guān)處于報文接收處理任務(wù)階段和CAN 報文發(fā)送任務(wù)階段,通過交換主從緩沖區(qū)的基地址可以實現(xiàn)主從緩沖區(qū)狀態(tài)切換。FlexRay-CAN 網(wǎng)關(guān)中存在的制約條件避免了搶占式調(diào)度現(xiàn)象的發(fā)生。該性質(zhì)避免了主從緩沖區(qū)的狀態(tài)切換動作發(fā)生在資源臨界區(qū)或者中斷臨界區(qū)中,從而極大地提高了主從緩沖區(qū)的基地址交換效率[7]。
對于在FlexRay-CAN 網(wǎng)關(guān)中轉(zhuǎn)發(fā)的報文主要分為2 種:一種是“上行數(shù)據(jù)”,指的是將CAN 網(wǎng)絡(luò)中的報文發(fā)送到FlexRay 網(wǎng)絡(luò)中;另一種是“下行數(shù)據(jù)”,指的是將FlexRay 網(wǎng)絡(luò)中報文發(fā)送到CAN 網(wǎng)絡(luò)中。上行數(shù)據(jù)和下行數(shù)據(jù)的轉(zhuǎn)換方法基本一致,本文主要解決數(shù)據(jù)在發(fā)送時存在的數(shù)據(jù)幀不兼容和消息調(diào)度的問題。
圖6 CAN 報文發(fā)送流程Fig.6 Flow chart of CAN message sending
通過對CAN 數(shù)據(jù)幀和FlexRay 數(shù)據(jù)幀的分析,決定在進行數(shù)據(jù)轉(zhuǎn)換時采用多消息幀打包的方法。在數(shù)據(jù)發(fā)送之前,將CAN 網(wǎng)關(guān)的數(shù)據(jù)發(fā)送隊列的前M 個有效數(shù)據(jù)幀進行整合,存儲在FlexRay 幀的有效數(shù)據(jù)段內(nèi),使其轉(zhuǎn)換成符合FlexRay 數(shù)據(jù)幀的格式。CAN 總線的消息幀包括仲裁域、控制域和數(shù)據(jù)域,數(shù)據(jù)長度最大為13 個字節(jié),而FlexRay 的有效數(shù)據(jù)段為0~254 個字節(jié),所以M 的取值范圍應(yīng)該為1≤M≤19。
對于消息調(diào)度的轉(zhuǎn)發(fā),本文采用了多隊列混合優(yōu)先級調(diào)度方式,如圖7所示。在數(shù)據(jù)隊列內(nèi)部采用最早截止期優(yōu)先(earliest deadline first,EDF)算法,每兩個隊列之間采用改進加權(quán)輪轉(zhuǎn)調(diào)度(weighted roundRobin,WRR)算法。
圖7 消息調(diào)度示意圖Fig.7 Message scheduling diagram
CAN 子網(wǎng)所傳輸?shù)南⒅校瑥膶崟r角度考慮可以分為三類:軟實時消息、硬實時消息和非實時消息,依據(jù)這三類分別設(shè)置三個獨立隊列。對三個隊列內(nèi)的CAN 消息采用EDF 算法進行優(yōu)先級調(diào)度排序,以滿足網(wǎng)絡(luò)中消息傳輸?shù)膶崟r性要求[8]。對于三個隊列之間的調(diào)度采用WRR 算法,該算法首先給三個隊列分別賦予不同的權(quán)值,然后再輪巡處理各隊列之間的數(shù)據(jù)。所賦予的權(quán)值大小決定了隊列消息的發(fā)送順序。高權(quán)值會優(yōu)先處理,一般將對實時性要求較高的信息存儲在高權(quán)值的隊列中,因此會導(dǎo)致高權(quán)值隊列一直占用CPU,存儲在低權(quán)值隊列中的非實時性數(shù)據(jù)短時間內(nèi)不能及時發(fā)送,增加了系統(tǒng)的負(fù)擔(dān),影響數(shù)據(jù)的實時性。為解決系統(tǒng)的實時性和公平性問題,在各隊列之間采用基于閾值的動態(tài)權(quán)值改進加權(quán)輪轉(zhuǎn)調(diào)度(WRR)算法。
在一個循環(huán)周期內(nèi),動態(tài)權(quán)值對隊列服務(wù)的次數(shù)與權(quán)值相對應(yīng)。Z1、Z2、Z3分別為硬實時隊列權(quán)值、軟實時隊列權(quán)值和非實時隊列權(quán)值,且Z1>Z2>Z3,輪轉(zhuǎn)次數(shù)為i,在非實時隊列的緩沖區(qū)中,非實時數(shù)據(jù)所占的比例為K,閾值M 為一個固定百分?jǐn)?shù),其值小于1。具體算法過程如下:
步驟1初始化賦予Z1=a;Z2=b,Z3=c;a>b,a、b、c 均為整數(shù);輪轉(zhuǎn)次數(shù)i=1;
步驟2按數(shù)據(jù)隊列的優(yōu)先級對CAN 報文進行分類,然后送入不同的隊列,在隊列內(nèi)部按照最早截止期優(yōu)先算法進行排序;
步驟3在輪巡過程中有如下規(guī)定:若i≤a,對硬實時隊列的數(shù)據(jù)組包發(fā)送;若i≤b,對軟實時隊列的數(shù)據(jù)組包發(fā)送;若i≤c,對非實時隊列的數(shù)據(jù)包發(fā)送。如果此時K≥M,則c=c+1,則返回步驟2,且i=i+1,直到i>a 時,一個完整的輪巡周期結(jié)束,此時返回步驟1。
在初始化時,從硬實時隊列消息的發(fā)送優(yōu)先級方面考慮,令硬實時隊列的權(quán)值大于非實時隊列權(quán)值和軟實時隊列權(quán)值,保證了硬實時隊列的消息優(yōu)先發(fā)送,但由此會導(dǎo)致某一時刻實時隊列發(fā)送的消息較多,非實時隊列中的消息不能及時發(fā)送,數(shù)據(jù)大量聚集,造成消息的阻塞延遲。為了改善這一狀況,將非實時隊列的權(quán)值設(shè)為動態(tài)權(quán)值,根據(jù)當(dāng)前隊列中非實時消息所占的比例,當(dāng)非實時隊列權(quán)值超過設(shè)定值大小時,動態(tài)權(quán)值權(quán)值大小加1。這樣在保證硬實時消息的發(fā)送優(yōu)先級的同時可以改善實時隊列中的消息長時間占用CPU 的情況[9]。
如果三個隊列中同時存在需要被處理的數(shù)據(jù)幀時,在每個隊列中選取前X 個數(shù)據(jù)幀打包發(fā)送;如果數(shù)據(jù)幀數(shù)量小于X,則可以直接發(fā)送;如果某一隊列中沒有數(shù)據(jù)幀,則不對該隊列進行任何處理,直接開始對下一個隊列進行操作。
FlexRay 總線具有數(shù)據(jù)量大、通信速率快等優(yōu)點,在未來應(yīng)用于火炮系統(tǒng)是大勢所趨。本文通過分析CAN 總線與FlexRay 總線的數(shù)據(jù)幀結(jié)構(gòu),對數(shù)據(jù)幀進行拆分重組,設(shè)計了一種可以實現(xiàn)兩者數(shù)據(jù)轉(zhuǎn)換的網(wǎng)關(guān),解決了兩種總線的通信問題,各隊列之間采用基于閾值的動態(tài)權(quán)值改進加權(quán)輪轉(zhuǎn)調(diào)度算法提高了火炮系統(tǒng)的信號傳輸速率和穩(wěn)定性,對提高火控系統(tǒng)的響應(yīng)速度有著深刻意義。