牛昱棟,劉永春,高發(fā)廷
(中國重型汽車集團汽車研究總院,山東 濟南 250002)
從車輛發(fā)明至今,汽車已經(jīng)從純粹的機械結(jié)構(gòu)發(fā)展到擁有數(shù)個甚至數(shù)十個控制單元,隨著車輛安全、舒適需求的增加,控制單元的數(shù)量越來越多,對網(wǎng)絡(luò)的負擔也越來越大。車輛根據(jù)不同的功能域進行了劃分,每個域擁有一個獨立的CAN總線網(wǎng)絡(luò),但是由于車輛是一個完整的整體,每個域之間存在著一定數(shù)據(jù)的流通,信號穩(wěn)定實時轉(zhuǎn)發(fā),才能保證車輛整體功能的穩(wěn)定可靠。
本文通過對CAN報文屬性的研究、操作系統(tǒng)的運行模式與信號網(wǎng)絡(luò)轉(zhuǎn)發(fā)的需求分析,設(shè)計一套適用于大部分情況的快速穩(wěn)定的跨網(wǎng)絡(luò)轉(zhuǎn)發(fā)策略,并且具有相當?shù)撵`活性。
車輛上存在多個總線網(wǎng)絡(luò)間信號交互的時候,我們將轉(zhuǎn)發(fā)前即存在該信號的總線網(wǎng)絡(luò)稱為該信號的源網(wǎng)絡(luò),將該信號轉(zhuǎn)發(fā)到總線網(wǎng)絡(luò)稱為該信號的目標網(wǎng)絡(luò)。在CAN總線網(wǎng)絡(luò)之間的數(shù)據(jù)流即為從源網(wǎng)絡(luò)轉(zhuǎn)發(fā)到目標網(wǎng)絡(luò),轉(zhuǎn)發(fā)邏輯的實現(xiàn)我們稱之為網(wǎng)關(guān)功能區(qū),圖1給出了總線數(shù)據(jù)從源網(wǎng)絡(luò)轉(zhuǎn)發(fā)到目標網(wǎng)絡(luò)上的具體流向,此過程主要由網(wǎng)關(guān)功能區(qū),判斷該信號是否需要轉(zhuǎn)發(fā)并將其轉(zhuǎn)發(fā)到特別目標網(wǎng)絡(luò),無關(guān)信號不會被轉(zhuǎn)發(fā)。
圖1 總線數(shù)據(jù)數(shù)據(jù)流向
網(wǎng)關(guān)功能區(qū)是CAN總線網(wǎng)絡(luò)信號轉(zhuǎn)發(fā)功能的實現(xiàn)區(qū)域,負責(zé)從源網(wǎng)絡(luò)接收數(shù)據(jù),判斷數(shù)據(jù)是否需要轉(zhuǎn)發(fā)到目標網(wǎng)絡(luò),若需要轉(zhuǎn)發(fā),則將該數(shù)據(jù)發(fā)送至目標網(wǎng)絡(luò)。
網(wǎng)關(guān)功能區(qū)細分為4個子功能模塊,分別為CAN信號接收子模塊、CAN信號轉(zhuǎn)發(fā)需求判斷子模塊、CAN信號發(fā)送子模塊和CAN信號發(fā)送成功確認子模塊,圖2為各個子功能模塊間的數(shù)據(jù)流向。
圖2 網(wǎng)關(guān)功能區(qū)內(nèi)數(shù)據(jù)流向
1)CAN信號接收子模塊負責(zé)信號的初步接收,并將信號中需要的信息保存至相應(yīng)CAN網(wǎng)絡(luò)的接收buffer中,等待CAN信號轉(zhuǎn)發(fā)需求判斷子模塊對數(shù)據(jù)進行具體判斷處理。
2)CAN信號轉(zhuǎn)發(fā)需求判斷子模塊將接收buffer中的信號與提前準備好的轉(zhuǎn)發(fā)配置表對比,判斷該信號是否需要轉(zhuǎn)發(fā),若需要轉(zhuǎn)發(fā),則將該信號存放在對應(yīng)通道的發(fā)送buffer中,等待CAN信號發(fā)送子模塊判斷信號合適進行發(fā)送。
3)CAN信號發(fā)送子模塊,判斷各個CAN通道的發(fā)送buffer的狀態(tài)與當前CAN網(wǎng)絡(luò)狀態(tài),當buffer狀態(tài)不為空且CAN網(wǎng)絡(luò)狀態(tài)為空閑時,按先進先出依次發(fā)送CAN信號到相應(yīng)的網(wǎng)絡(luò)上。
4)CAN信號發(fā)送成功確認子模塊,當需要轉(zhuǎn)發(fā)的CAN信號發(fā)送成功后,此模塊會被回調(diào),判斷發(fā)送buffer中還存在CAN信號未發(fā)送則跳轉(zhuǎn)到CAN信號發(fā)送子模塊,若發(fā)送buffer為空則退出,等待新CAN信號的到來。
CAN信號接收子模塊位于中斷當中,主要任務(wù)是將CAN網(wǎng)絡(luò)接收到的數(shù)據(jù)從寄存器搬移到特定的RAM區(qū)域,并觸發(fā)CAN信號轉(zhuǎn)發(fā)需求判斷子模塊的事件。為了達到穩(wěn)定安全的目的,在中斷中的工作盡量做得少,圖3為CAN信號接收子模塊的數(shù)據(jù)流向。
圖3 CAN信號接收子模塊數(shù)據(jù)流向
CAN信號轉(zhuǎn)發(fā)需求判斷子模塊被觸發(fā)之后,讀取RAM中存放的具體的數(shù)據(jù)并與轉(zhuǎn)發(fā)配置表中的信息對比,確認是否需要轉(zhuǎn)發(fā),若需要轉(zhuǎn)發(fā),則根據(jù)配置表中的信息,將需要轉(zhuǎn)發(fā)的數(shù)據(jù)存放至對應(yīng)通道的發(fā)送buffer中??紤]到操作系統(tǒng)之間通過事件切換任務(wù)需要時間,在成功接收到信號后直接在同一個任務(wù)中調(diào)用CAN信號發(fā)送子模塊。圖4為CAN信號轉(zhuǎn)發(fā)需求判斷子模塊的數(shù)據(jù)流向。
圖4 CAN信號轉(zhuǎn)發(fā)需求判斷子模塊數(shù)據(jù)流向
CAN信號發(fā)送子模塊即將具體的數(shù)據(jù)從發(fā)送buffer中取出,通過寄存器操控硬件將數(shù)據(jù)發(fā)送到目標網(wǎng)絡(luò)上,圖5為CAN信號發(fā)送子模塊的數(shù)據(jù)流向。
圖5 CAN信號發(fā)送子模塊的數(shù)據(jù)流向
CAN信號發(fā)送成功確認子模塊負責(zé)管理一條報文發(fā)送后,確認發(fā)送成功并判斷是否繼續(xù)向目標網(wǎng)絡(luò)發(fā)送CAN信號。圖6為CAN信號發(fā)送成功確認子模塊的操作流程。
圖6 CAN信號發(fā)送成功確認子模塊的操作流程
本文闡述了一種CAN總線信號快速跨網(wǎng)絡(luò)轉(zhuǎn)發(fā)算法,該算法實現(xiàn)了CAN總線信號快速跨網(wǎng)絡(luò)轉(zhuǎn)發(fā),并且在快速的基礎(chǔ)上兼顧了穩(wěn)定,考慮了不同邏輯的相互分離與所應(yīng)處于數(shù)據(jù)流的位置,形成閉環(huán),不會造成數(shù)據(jù)沖突,邏輯實現(xiàn)復(fù)雜性小,可適用于任何跨網(wǎng)絡(luò)的ECU,轉(zhuǎn)發(fā)速度快,保證了數(shù)據(jù)的實時有效,可以為CAN信號轉(zhuǎn)發(fā)、處理提供重要的參考。