陳飛,張?zhí)旌?/p>
(南京航空航天大學(xué)江蘇省航空動(dòng)力系統(tǒng)重點(diǎn)實(shí)驗(yàn)室,南京210016)
Zynq平臺(tái)的TTP/C總線控制器容錯(cuò)算法設(shè)計(jì)
陳飛,張?zhí)旌?/p>
(南京航空航天大學(xué)江蘇省航空動(dòng)力系統(tǒng)重點(diǎn)實(shí)驗(yàn)室,南京210016)
在自主設(shè)計(jì)的TTP/C總線控制器中,充分利用Zynq芯片的可編程邏輯單元和程序處理單元,設(shè)計(jì)了一種基于成員關(guān)系協(xié)議(GMP)的容錯(cuò)算法,以快速檢測(cè)與隔離總線集群中的故障節(jié)點(diǎn)。試驗(yàn)表明,所設(shè)計(jì)的容錯(cuò)算法能有效檢測(cè)并隔離總線集群中的故障節(jié)點(diǎn)。
容錯(cuò)算法;Zynq;TTP/C;GMP
目前,實(shí)時(shí)嵌入式系統(tǒng)中采用的串行通信協(xié)議普遍都是基于事件觸發(fā)的。大量研究表明:對(duì)高可靠性系統(tǒng)而言,時(shí)間觸發(fā)架構(gòu)(TTA)具有更大的優(yōu)勢(shì)[1]。1993年,在TTA架構(gòu)的基礎(chǔ)上,TTP/C(Time-Triggered Protocol/ Automotive Class C,時(shí)間觸發(fā)協(xié)議C類(lèi)標(biāo)準(zhǔn))被首次提出,其是一種用于互聯(lián)電子模塊的、分布式容錯(cuò)實(shí)時(shí)系統(tǒng)的通信協(xié)議,最大的特點(diǎn)是具有嚴(yán)格的時(shí)間確定性和高度的通信可靠性,主要面向?qū)ο笫呛娇蘸教鞈?yīng)用[2]。
容錯(cuò)能力是總線技術(shù)的基本要求,尤其是節(jié)點(diǎn)發(fā)生故障時(shí),須快速探測(cè)并隔離故障節(jié)點(diǎn),防止其影響總線上其他正常節(jié)點(diǎn)的信息發(fā)送[3]。在故障模式下,集群中的每個(gè)正常節(jié)點(diǎn)都必須對(duì)其他節(jié)點(diǎn)的運(yùn)行狀態(tài)有相同的判斷,以便采取和其他正常節(jié)點(diǎn)協(xié)調(diào)的容錯(cuò)行動(dòng),這就是集群的一致性。GMP是TTA架構(gòu)下的一種分布式多機(jī)容錯(cuò)策略,它的主要作用是通過(guò)快速探測(cè)和隔離故障節(jié)點(diǎn)來(lái)維持整個(gè)集群的一致性。GMP中規(guī)定:每個(gè)節(jié)點(diǎn)內(nèi)部都有一個(gè)實(shí)時(shí)更新的成員列表,用來(lái)表征節(jié)點(diǎn)對(duì)集群運(yùn)行狀態(tài)的認(rèn)知,GMP成功實(shí)現(xiàn)的基礎(chǔ)就是成員列表。
為保證TTP/C集群各個(gè)節(jié)點(diǎn)之間工作狀態(tài)的一致性,本文設(shè)計(jì)了一種基于GMP策略的容錯(cuò)算法,以此檢測(cè)集群中各節(jié)點(diǎn)的工作狀態(tài),實(shí)現(xiàn)快速檢測(cè)和隔離故障節(jié)點(diǎn)的目的,保證TTP/C總線集群的通信可靠性。
TTP/C是一種集成的時(shí)間觸發(fā)協(xié)議,采用靜態(tài)時(shí)分多路復(fù)用(TDMA)策略控制節(jié)點(diǎn)對(duì)傳輸介質(zhì)的訪問(wèn),每一個(gè)節(jié)點(diǎn)都只能在指定的時(shí)間段內(nèi)發(fā)送數(shù)據(jù)。在每個(gè)TDMA周期內(nèi),各個(gè)節(jié)點(diǎn)在預(yù)先設(shè)定的時(shí)間段內(nèi)以已知的延時(shí)在總線上廣播,多個(gè)不同長(zhǎng)度的時(shí)間段構(gòu)成一個(gè)TDMA周期,多個(gè)等長(zhǎng)的TDMA周期構(gòu)成一個(gè)集群周期。
節(jié)點(diǎn)傳輸?shù)臄?shù)據(jù)幀有兩種類(lèi)型:初始化幀和正常幀。正常幀不包含成員列表,但其CRC校驗(yàn)碼是結(jié)合發(fā)送節(jié)點(diǎn)成員列表計(jì)算得到的,因此接收節(jié)點(diǎn)需要用自身的成員列表來(lái)對(duì)接收到的正常幀進(jìn)行CRC解碼,以此判斷兩個(gè)節(jié)點(diǎn)的成員列表是否相同。由于所采用的TTP/C總線控制器并未實(shí)現(xiàn)正常幀的發(fā)送,因此本文的容錯(cuò)算法針對(duì)初始化幀設(shè)計(jì),各節(jié)點(diǎn)的成員列表直接包含在數(shù)據(jù)幀中,容錯(cuò)原理與正常幀的相同,但實(shí)現(xiàn)簡(jiǎn)單,無(wú)需進(jìn)行多次CRC解碼。
1.1 故障假設(shè)
TTP/C協(xié)議的故障假設(shè)如下[2]:①節(jié)點(diǎn)的故障類(lèi)型分為接收故障和發(fā)送故障,暫不考慮非對(duì)稱(chēng)故障;②節(jié)點(diǎn)只能在指定時(shí)間段內(nèi)發(fā)送消息,并且在每個(gè)TDMA周期內(nèi),只能發(fā)送一次消息;③在每個(gè)TDMA周期內(nèi)最多一個(gè)節(jié)點(diǎn)發(fā)生故障;④傳輸通道不能自發(fā)產(chǎn)生正確消息。
TTP/C協(xié)議通過(guò)派系避免算法(CA)和隱式確認(rèn)算法(IA)的交互實(shí)現(xiàn)容錯(cuò)GMP策略。
1.2 派系避免算法
除了成員列表外,節(jié)點(diǎn)內(nèi)部還定義了兩個(gè)計(jì)數(shù)器,確認(rèn)計(jì)數(shù)器AC和失敗計(jì)數(shù)器FC。兩個(gè)計(jì)數(shù)器在運(yùn)行中遵循累加原則:①當(dāng)前節(jié)點(diǎn)發(fā)送數(shù)據(jù)后,本地AC+1,并將自身添加到本地成員列表中;②若節(jié)點(diǎn)判定當(dāng)前時(shí)間段接收的數(shù)據(jù)幀錯(cuò)誤,那么FC+1,并在本地成員列表中刪除對(duì)應(yīng)接收節(jié)點(diǎn);③若節(jié)點(diǎn)判斷當(dāng)前時(shí)間段接收的數(shù)據(jù)幀正確,則本地AC+1,并在本地成員列表中增加對(duì)應(yīng)節(jié)點(diǎn);④若節(jié)點(diǎn)判斷當(dāng)前時(shí)間段為空,則本地AC和FC維持原值不變,但與當(dāng)前時(shí)間段對(duì)應(yīng)的節(jié)點(diǎn)將從本地成員列表刪除。
每一個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù)前都會(huì)執(zhí)行派系避免算法,判斷本地AC是否大于FC,如果為真,節(jié)點(diǎn)將數(shù)據(jù)發(fā)出并清零兩個(gè)計(jì)數(shù)器;否則節(jié)點(diǎn)進(jìn)入凍結(jié)狀態(tài),不發(fā)送數(shù)據(jù)。
1.3 隱式確認(rèn)算法
所謂隱式確認(rèn)是指接收節(jié)點(diǎn)無(wú)需專(zhuān)門(mén)的應(yīng)答幀來(lái)通知發(fā)送節(jié)點(diǎn)數(shù)據(jù)幀的發(fā)送正確與否,這既滿(mǎn)足了故障假設(shè)②,又節(jié)省了帶寬。隱式確認(rèn)算法引入了第1確認(rèn)節(jié)點(diǎn)和第2確認(rèn)節(jié)點(diǎn)的概念。當(dāng)節(jié)點(diǎn)發(fā)送數(shù)據(jù)后累加確認(rèn)計(jì)數(shù)器,需等待確認(rèn)節(jié)點(diǎn)確定自身發(fā)送數(shù)據(jù)是否正確。如果在下一次發(fā)送時(shí)仍未確認(rèn)自身發(fā)送數(shù)據(jù)是否正確,則認(rèn)為發(fā)生了發(fā)送故障,進(jìn)入凍結(jié)狀態(tài)。
當(dāng)節(jié)點(diǎn)A發(fā)送數(shù)據(jù)后,等待下一節(jié)點(diǎn)B在預(yù)期時(shí)間內(nèi)發(fā)送正確數(shù)據(jù)。如果A和B的成員列表在不考慮是否包含A的情形下其他各項(xiàng)均相同,則B是A的第1成功節(jié)點(diǎn),否則A認(rèn)為B節(jié)點(diǎn)故障,將其從成員列表刪除。在B是A的第1確認(rèn)節(jié)點(diǎn)情形下,如果B的成員列表包含A,則A被確認(rèn),AC+1,隱式確認(rèn)算法結(jié)束。否則A和B中必有一個(gè)發(fā)生了故障,需等待第2確認(rèn)節(jié)點(diǎn)。
在A找到其第1確認(rèn)節(jié)點(diǎn)B,但又不能確認(rèn)的情況下,需等待第2確認(rèn)節(jié)點(diǎn)C,節(jié)點(diǎn)C的數(shù)據(jù)幀是在預(yù)期時(shí)間內(nèi)正確接收的,其成員列表包含且只包含A和B中的一個(gè),而且與A成員列表中除A、B外其他各項(xiàng)均相同[4-5]。如果C的成員列表中包含A,則A被確認(rèn),在A的成員列表中刪除B并累加AC;否則A被C否認(rèn),B是正確的,A進(jìn)入凍結(jié)狀態(tài),隱式確認(rèn)算法結(jié)束。
本文利用Zynq的程序處理單元實(shí)現(xiàn)基于GMP策略的容錯(cuò)算法,而TTP/C總線的其他模塊在可編程邏輯單元實(shí)現(xiàn),主要包括集群?jiǎn)?dòng)模塊、時(shí)鐘同步模塊、數(shù)據(jù)收發(fā)模塊和BG模塊。總線控制器原理如圖1所示。
圖1 總線控制器原理
在正常運(yùn)行時(shí),時(shí)鐘同步模塊負(fù)責(zé)將本地時(shí)鐘與全局時(shí)鐘進(jìn)行同步,BG模塊負(fù)責(zé)限制發(fā)送時(shí)間在指定時(shí)間段內(nèi),數(shù)據(jù)收發(fā)模塊負(fù)責(zé)數(shù)據(jù)幀的發(fā)送和接收,包括CRC解碼也在此部分實(shí)現(xiàn)。CPU0作為主機(jī)處理器負(fù)責(zé)運(yùn)行應(yīng)用程序,CPU1為協(xié)議處理器。當(dāng)發(fā)送時(shí)間到后,時(shí)間觸發(fā)器向協(xié)議處理器發(fā)送一個(gè)中斷信號(hào),協(xié)議處理器將應(yīng)用程序中要發(fā)送的數(shù)據(jù)送入冗余總線收發(fā)器發(fā)送。非發(fā)送時(shí)間BG模塊控制485驅(qū)動(dòng),使得冗余總線收發(fā)器只能接收數(shù)據(jù)幀。當(dāng)冗余總線收發(fā)器接收到一個(gè)數(shù)據(jù)幀并進(jìn)行CRC校驗(yàn)之后,向協(xié)議處理器發(fā)送一個(gè)中斷信號(hào),協(xié)議處理器立即讀取接收到的數(shù)據(jù)幀和CRC校驗(yàn)結(jié)果。容錯(cuò)算法在協(xié)議處理器中實(shí)現(xiàn),交叉在發(fā)送程序和接收程序中。
2.1 空幀檢測(cè)算法
TTP/C總線協(xié)議并未指明如何實(shí)現(xiàn)空幀的檢查,但協(xié)議中的容錯(cuò)原理明確指明了出現(xiàn)空幀時(shí)如何累加兩個(gè)計(jì)數(shù)器,因此本文設(shè)計(jì)了一種空幀檢測(cè)算法,該算法實(shí)現(xiàn)簡(jiǎn)單,無(wú)需時(shí)刻讀取節(jié)點(diǎn)的本地時(shí)間以確認(rèn)當(dāng)前時(shí)間段是否接收到數(shù)據(jù)幀。空幀檢測(cè)算法的原理如圖2所示。
每次執(zhí)行接收程序時(shí),節(jié)點(diǎn)依據(jù)本地時(shí)間獲得當(dāng)前接收數(shù)據(jù)幀所處TDMA周期內(nèi)時(shí)間段的編號(hào)node_rec (TTP/C協(xié)議規(guī)定每個(gè)TDMA周期可以包含4~64個(gè)時(shí)間段,在這里規(guī)定每個(gè)TDMA周期開(kāi)始的時(shí)間段編號(hào)為1,并以此類(lèi)推),并與上一接收數(shù)據(jù)幀的時(shí)間段編號(hào)node_rec_ old比較。如果node_rec大于node_rec_old,說(shuō)明當(dāng)前比較的兩個(gè)數(shù)據(jù)幀處在同一TDMA周期內(nèi),只需比較兩者是否差1,就可檢測(cè)是否有空幀現(xiàn)象;如果node_rec小于node_rec_old,說(shuō)明當(dāng)前比較的兩個(gè)數(shù)據(jù)幀處在兩個(gè)TDMA周期內(nèi),此時(shí)為檢測(cè)空幀現(xiàn)象,需將node_rec加上TDMA周期內(nèi)時(shí)間段的個(gè)數(shù)MAX再做檢測(cè),檢測(cè)方式與處在同一TDMA周期內(nèi)的情形相同。注意:空幀檢測(cè)程序執(zhí)行完畢后需更新node_rec_old。
圖2 空幀檢測(cè)算法流程圖
需特別注意,兩次接收程序中間可能需要執(zhí)行發(fā)送程序,發(fā)送程序中首先利用自身節(jié)點(diǎn)所處時(shí)間段編號(hào)Node_ Info和node_rec_old判斷是否出現(xiàn)空幀,判斷方式與接收程序類(lèi)似,之后需將node_rec_old更新成Node_Info,以便下一時(shí)刻執(zhí)行接收程序時(shí),空幀檢測(cè)算法能夠有效執(zhí)行。
2.2 容錯(cuò)算法的實(shí)現(xiàn)
容錯(cuò)算法由派系避免、隱式確認(rèn)和空幀檢查3部分組成,交叉在發(fā)送程序和接收程序中實(shí)現(xiàn)。發(fā)送程序中容錯(cuò)算法流程圖如圖3所示。
圖3 發(fā)送程序中容錯(cuò)算法流程圖
在發(fā)送程序中,先執(zhí)行空幀檢測(cè)算法,再以此判斷AC與FC、隱式確認(rèn)結(jié)果,如果兩次判斷都通過(guò),則說(shuō)明節(jié)點(diǎn)正常,否則節(jié)點(diǎn)故障進(jìn)入凍結(jié)狀態(tài)。
在接收程序中,節(jié)點(diǎn)首先判斷是否需要進(jìn)行隱式確認(rèn)。如果不需要進(jìn)行隱式確認(rèn),說(shuō)明本身發(fā)送正確,只需依據(jù)接收方的成員列表判斷對(duì)方是否正確;如果需要進(jìn)行隱式確認(rèn),則需判斷要等待哪一個(gè)確認(rèn)節(jié)點(diǎn),并依據(jù)隱式確認(rèn)原理進(jìn)行判斷,同時(shí)累加AC和FC,流程如圖4所示。
具體代碼如下:
試驗(yàn)集群包含4個(gè)節(jié)點(diǎn),每個(gè)TDMA周期分配4個(gè)時(shí)間段,并通過(guò)串口將本地成員列表和接收到的其他節(jié)點(diǎn)成員列表一起發(fā)送給串口助手進(jìn)行顯示,以此判斷節(jié)點(diǎn)當(dāng)前是否處在正常工作狀態(tài)以及集群中的故障節(jié)點(diǎn)是哪一個(gè)。串口通信協(xié)議如下所示:
0 1 2 3~7 7 8 9 0x55 0x AA本地成員列表節(jié)點(diǎn)1~4的成員列表count fault校驗(yàn)
圖4 接收程序中容錯(cuò)算法流程圖
count表示一個(gè)TDMA周期內(nèi)發(fā)送節(jié)點(diǎn)接收到的數(shù)據(jù)幀的個(gè)數(shù),fault為1,表示檢測(cè)到當(dāng)前TDMA周期內(nèi)存在節(jié)點(diǎn)未發(fā)送數(shù)據(jù)。成員列表采用一個(gè)8位無(wú)符號(hào)整形數(shù)表示,低4位從第0位開(kāi)始分別表示1~4號(hào)節(jié)點(diǎn)的狀態(tài),1表示節(jié)點(diǎn)正常,0表示節(jié)點(diǎn)故障,高4位暫時(shí)未啟用,默認(rèn)為1。
圖5所示是1號(hào)節(jié)點(diǎn)發(fā)送給串口助手的成員列表信息,由于1號(hào)節(jié)點(diǎn)不能接收到自身發(fā)送的數(shù)據(jù)幀,因此所有串口助手接收的數(shù)據(jù)中第3個(gè)數(shù)據(jù)(1號(hào)節(jié)點(diǎn)成員列表)為零,但是可以從第2個(gè)數(shù)據(jù)看到本地成員列表。圖中方框區(qū)域是節(jié)點(diǎn)檢測(cè)到集群故障后發(fā)送的第一組信息。由于1號(hào)節(jié)點(diǎn)只能在其他節(jié)點(diǎn)發(fā)送數(shù)據(jù)幀之后更新其各節(jié)點(diǎn)的成員列表,這會(huì)導(dǎo)致串口助手中顯式的各節(jié)點(diǎn)成員列表存在滯后,才會(huì)出現(xiàn)圖5中存在3個(gè)節(jié)點(diǎn)的成員列表不同的現(xiàn)象,但這并不會(huì)影響容錯(cuò)算法的有效性,最終3個(gè)正常節(jié)點(diǎn)的成員列表一致,有效判斷出故障的編號(hào),并且故障節(jié)點(diǎn)進(jìn)入凍結(jié)狀態(tài),不再發(fā)送數(shù)據(jù)幀。如2號(hào)節(jié)點(diǎn)故障后,其余3個(gè)節(jié)點(diǎn)的成員列表變?yōu)镕D,第1位數(shù)據(jù)變?yōu)?,對(duì)應(yīng)的是2號(hào)節(jié)點(diǎn)故障,此時(shí)2號(hào)節(jié)點(diǎn)進(jìn)入凍結(jié)狀態(tài),1號(hào)節(jié)點(diǎn)不再接收到2號(hào)節(jié)點(diǎn)發(fā)送的數(shù)據(jù)幀,count等于2,fault等于1。
圖5 節(jié)點(diǎn)發(fā)生接收故障時(shí)容錯(cuò)算法效果圖
本文基于Zynq平臺(tái)在自主設(shè)計(jì)的TTP/C總線控制器上實(shí)現(xiàn)了一種基于GMP策略的容錯(cuò)算法,并實(shí)現(xiàn)了協(xié)議中未指明的空幀檢測(cè)算法。試驗(yàn)驗(yàn)證表明所設(shè)計(jì)的容錯(cuò)算法可以有效檢測(cè)并隔離集群中的故障節(jié)點(diǎn),保證集群的正常運(yùn)行。
[1]魏婷,張喜民,陳益,等.一種基于TTP/C協(xié)議的容錯(cuò)策略研究[J].航空計(jì)算技術(shù),2008,38(3):90-93.
[2]Time-Triggered Protocol TTP/C High-Level Specification Document Protocol Version 1.1.Specification edition 1.4.3, 2003.
[3]楊福宇.TTP/C組籍算法存在的問(wèn)題[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2014(10):1-4.
[4]劉雙與,郭麗娟,張激,等.TTP/C協(xié)議的一致性機(jī)制研究[J].計(jì)算機(jī)工程,2006,32(5):119-121.
[5]劉冬冬,張?zhí)旌?陳建,等.TTP/C協(xié)議的關(guān)鍵特性研究[J].計(jì)算機(jī)測(cè)量與控制,2012,20(10):69-72.
陳飛(碩士研究生),主要從事航空發(fā)動(dòng)機(jī)控制系統(tǒng)設(shè)計(jì)與仿真;張?zhí)旌?教授),研究方向?yàn)榍度胧娇刂葡到y(tǒng)、系統(tǒng)控制與仿真。
Fault Tolerant Algorithm for TTP/C Bus Controller Based on Zynq
Chen Fei,Zhang Tianhong
(Jiangsu Province Key Laboratory of Aerospace Power System,Nanjing University of Aeronautics and Astronautics,Nanjing 210016,China)
The fault tolerant algorithm is the basis of the TTP/C bus,which is a kind of time-triggered data bus with the characteristics of strict time certainty and high reliability.A fault tolerant algorithm based on group member protocol is realized on the self-designed TTP/C bus controller for the rapid detection and isolation of the fault nodes in the TTP/C cluster.The experiment results show that the designed fault tolerant algorithm can effectively detect and isolate the fault nodes in the cluster.
fault tolerant algorithm;Zynq;TTP/C;GMP
V233.7
:A
薛士然
2016-05-11)