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