一種中斷服務(wù)程序中通信故障的快速恢復(fù)方法
【專利摘要】本發(fā)明公開了一種中斷服務(wù)程序中通信故障的快速恢復(fù)方法,本發(fā)明結(jié)合在中斷服務(wù)程序中進(jìn)行故障檢測(cè)及恢復(fù)和在中斷處理任務(wù)中進(jìn)行故障檢測(cè)及恢復(fù)兩種方法的優(yōu)點(diǎn),通過細(xì)分故障類型為影響后續(xù)數(shù)據(jù)處理以及只影響當(dāng)前指令數(shù)據(jù)處理的故障,充分利用兩個(gè)數(shù)據(jù)包的時(shí)間間隔,影響后續(xù)數(shù)據(jù)處理的故障在中斷服務(wù)程序中處理,只影響當(dāng)前指令數(shù)據(jù)處理的故障在中斷處理任務(wù)中處理,減少了任務(wù)切換的次數(shù),縮短整個(gè)數(shù)據(jù)接收的時(shí)間,從而實(shí)現(xiàn)了接收即完成通信故障檢測(cè)和恢復(fù)的方法。本發(fā)明該方法已在嫦娥三號(hào)RS422通信過程中得到應(yīng)用,解決了型號(hào)中故障檢測(cè)及恢復(fù)與中斷處理時(shí)間相矛盾的問題,取得了很好的效果,具有很強(qiáng)的實(shí)用性。
【專利說明】一種中斷服務(wù)程序中通信故障的快速恢復(fù)方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種中斷服務(wù)程序中通信故障的快速恢復(fù)方法,尤其涉及一種在強(qiáng)實(shí)時(shí)嵌入式環(huán)境中中斷服務(wù)程序中通信故障快速恢復(fù)方法,可應(yīng)用強(qiáng)實(shí)時(shí)嵌入式軟件中斷服務(wù)程序中。
【背景技術(shù)】
[0002]串口通信具有傳輸距離遠(yuǎn)、傳輸穩(wěn)定、簡(jiǎn)單實(shí)用等特點(diǎn),已被廣泛應(yīng)用于工業(yè)控制、數(shù)據(jù)通信等領(lǐng)域。這些領(lǐng)域中,串口通信用于實(shí)時(shí)的接收其他設(shè)備發(fā)來的信息,需要實(shí)時(shí)響應(yīng),因此提高設(shè)備接收的實(shí)時(shí)性至關(guān)重要。
[0003]嫦娥三號(hào)兩器通過RS422進(jìn)行通信,通信波特率38.4kbps,包括起始位I位,數(shù)據(jù)位8位,偶校驗(yàn)位I位,停止位I位。嫦娥三號(hào)以單字節(jié)中斷的方式接收發(fā)送的指令,指令類型有2種。這兩種指令均有相同的2字節(jié)同步幀,兩種指令區(qū)別如下:取數(shù)指令:指令數(shù)據(jù)固定,長(zhǎng)度為3字節(jié);地面遙控指令:指令數(shù)據(jù)不固定,長(zhǎng)度為19字節(jié)。軟件采用中斷服務(wù)函數(shù)和中斷處理任務(wù)的方式,完成對(duì)整個(gè)中斷的響應(yīng)。中斷服務(wù)程序負(fù)責(zé)接收數(shù)據(jù),并通知中斷處理任務(wù)進(jìn)行后續(xù)處理。由于星上硬件的限制,RS422接收緩沖僅為I個(gè)字節(jié),因此應(yīng)用軟件必需在第3個(gè)字節(jié)到來前處理完當(dāng)前字節(jié)。根據(jù)波特率計(jì)算,每個(gè)字節(jié)最大處理時(shí)間為0.573ms。為了避免當(dāng)前通信異常影響下一條指令的接收和執(zhí)行,需要在較短的時(shí)間內(nèi)完成故障的快速檢測(cè)及恢復(fù)。
[0004]目前的解決方案如發(fā)表在《電子技術(shù)應(yīng)用》2007年第9期的“基于VxWorks操作系統(tǒng)的多路高速串口的通信方法設(shè)計(jì)”提到,串口接收數(shù)據(jù)時(shí),軟件可以通過中斷和輪詢方式獲取數(shù)據(jù),其中中斷接收的方式獲取數(shù)據(jù)較快。串口接收數(shù)據(jù)時(shí),軟件可以通過中斷和輪詢方式獲取數(shù)據(jù),其中中斷的方式獲取數(shù)據(jù)較快。如發(fā)表在《計(jì)算機(jī)技術(shù)與發(fā)展》第21卷第9期中的“基于VxWorks多任務(wù)程序設(shè)計(jì)”提到,在中斷中不能進(jìn)行太多處理,通常使用中斷服務(wù)程序中釋放信號(hào)量,在中斷任務(wù)中接收數(shù)據(jù)的方式來完成數(shù)據(jù)接收。然而,當(dāng)數(shù)據(jù)包由多個(gè)字節(jié)組成,每個(gè)字節(jié)觸發(fā)一次中斷發(fā)送時(shí),會(huì)導(dǎo)致中斷觸發(fā)頻繁。由于釋放信號(hào)量導(dǎo)致任務(wù)切換的次數(shù)增大,整個(gè)接收時(shí)間隨之變長(zhǎng),無法完成對(duì)通信過程中通信故障的檢測(cè)。
【發(fā)明內(nèi)容】
[0005]本發(fā)明解決的技術(shù)問題是:克服現(xiàn)有技術(shù)的不足,提供一種中斷服務(wù)程序中通信故障的快速恢復(fù)方法,解決了故障檢測(cè)及恢復(fù)與中斷處理時(shí)間相矛盾的問題,縮短中斷處的時(shí)間。
[0006]本發(fā)明的技術(shù)解決方案是:一種中斷服務(wù)程序中通信故障的快速恢復(fù)方法,步驟如下:
[0007](I)每個(gè)中斷周期中斷服務(wù)程序中斷接收外部請(qǐng)求數(shù)據(jù),判斷接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L與同步幀字節(jié)數(shù)LS的大小,若接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L小于同步幀的字節(jié)數(shù)LS,則接收外部請(qǐng)求數(shù)據(jù),接收完外部請(qǐng)求數(shù)據(jù)后等待下一個(gè)中斷周期開始,否則執(zhí)行步驟(2);
[0008](2)若接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L等于同步幀的字節(jié)數(shù)LS,則執(zhí)行如下操作:
[0009](a)從第一個(gè)字節(jié)開始,判斷接收到的外部請(qǐng)求數(shù)據(jù)與同步幀數(shù)據(jù)是否完全相等,如果接收到的外部請(qǐng)求數(shù)據(jù)與同步幀數(shù)據(jù)完全相等,則轉(zhuǎn)入執(zhí)行步驟(3);否則,執(zhí)行步驟(b);
[0010](b)置 i=l;
[0011](C)從第i個(gè)接收的外部請(qǐng)求數(shù)據(jù)開始,判斷接收到的外部請(qǐng)求數(shù)據(jù)與同步幀前LS-1個(gè)數(shù)據(jù)是否完全相等,如果接收到的外部請(qǐng)求數(shù)據(jù)與同步幀前LS-1個(gè)數(shù)據(jù)完全相等,則保留后接收到的L-1個(gè)外部請(qǐng)求數(shù)據(jù),并置L=L-1,然后轉(zhuǎn)入執(zhí)行步驟(3),否則執(zhí)行步驟Cd);
[0012](d)i=i+l,判斷i與同步巾貞的字節(jié)數(shù)LS的大小,若i>=LS,則置L=O,放棄接收到的外部請(qǐng)求數(shù)據(jù),然后轉(zhuǎn)入執(zhí)行步驟(3),否則返回執(zhí)行步驟(c);
[0013](3)判斷接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L與指令字節(jié)數(shù)LC的大小,若接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L小于指令的字節(jié)數(shù)LC,則執(zhí)行如下操作:
[0014](A)判斷接收到的外部請(qǐng)求數(shù)據(jù)是否為同步幀的最后一個(gè)數(shù)據(jù),如果不是則等待下一個(gè)中斷周期開始,如果是則執(zhí)行步驟(B);
[0015](B)判斷接收到的LS個(gè)字節(jié)與同步幀的數(shù)據(jù)是否完全相等,如果最后接收到的LS個(gè)字節(jié)與同步幀的數(shù)據(jù)完全相等,則保留后續(xù)LS個(gè)同步幀數(shù)據(jù)并置L=LS,然后等待下一個(gè)中斷周期開始,否則直接等待下一個(gè)中斷周期開始;
[0016]若接收到的外部請(qǐng)求數(shù)據(jù)大于等于指令的字節(jié)數(shù)LC,則執(zhí)行如下操作:
[0017](C)發(fā)送指令到中斷處理任務(wù)中,檢查最后一個(gè)外部請(qǐng)求數(shù)據(jù)是否為同步幀中的數(shù)據(jù),如果不是,則置L=0,清除接收到的外部請(qǐng)求數(shù)據(jù),然后等待下一個(gè)中斷周期開始,如果是則執(zhí)行步驟(D):
[0018](D)記最后一個(gè)外部請(qǐng)求數(shù)據(jù)為同步幀數(shù)據(jù)中的第i個(gè)數(shù)據(jù),判斷最后接收的i個(gè)外部請(qǐng)求數(shù)據(jù)是否與同步幀中前i個(gè)數(shù)據(jù)完全相等,如果相等則保留這i個(gè)外部請(qǐng)求數(shù)據(jù)并置L=i,等待下一個(gè)中斷周期開始;如果不相等則置L=0,清除接收到的外部請(qǐng)求數(shù)據(jù),等待下一個(gè)中斷周期開始;
[0019](4)結(jié)束,等待下一個(gè)中斷周期開始。
[0020]本發(fā)明與現(xiàn)有技術(shù)相比的有益效果是:本發(fā)明結(jié)合在中斷服務(wù)程序中進(jìn)行故障檢測(cè)及恢復(fù)和在中斷處理任務(wù)中進(jìn)行故障檢測(cè)及恢復(fù)兩種方法的優(yōu)點(diǎn),通過細(xì)分故障類型為影響后續(xù)數(shù)據(jù)處理以及只影響當(dāng)前指令數(shù)據(jù)處理的故障,充分利用兩個(gè)數(shù)據(jù)包的時(shí)間間隔,影響后續(xù)數(shù)據(jù)處理的故障在中斷服務(wù)程序中處理,只影響當(dāng)前指令數(shù)據(jù)處理的故障在中斷處理任務(wù)中處理,減少了任務(wù)切換的次數(shù),縮短整個(gè)數(shù)據(jù)接收的時(shí)間,從而實(shí)現(xiàn)了接收即完成通信故障檢測(cè)和恢復(fù)的方法。本發(fā)明該方法已在嫦娥三號(hào)RS422通信過程中得到應(yīng)用,解決了型號(hào)中故障檢測(cè)及恢復(fù)與中斷處理時(shí)間相矛盾的問題,取得了很好的效果,具有很強(qiáng)的實(shí)用性。
【專利附圖】
【附圖說明】
[0021]圖1為本發(fā)明的實(shí)現(xiàn)流程圖;[0022]圖2為檢驗(yàn)點(diǎn)I的實(shí)現(xiàn)流程圖;
[0023]圖3為檢驗(yàn)點(diǎn)2的實(shí)現(xiàn)流程圖;
[0024]圖4為檢驗(yàn)點(diǎn)3的實(shí)現(xiàn)流程圖。
【具體實(shí)施方式】
[0025]影響后續(xù)數(shù)據(jù)處理的故障包含:
[0026]同步幀錯(cuò)誤:需要丟棄后續(xù)字節(jié),直到收到一個(gè)正確的同步幀;
[0027]數(shù)據(jù)丟失:即當(dāng)前數(shù)據(jù)長(zhǎng)度未達(dá)到一條指令的長(zhǎng)度時(shí),再次收到一個(gè)正確的同步幀,應(yīng)丟棄同步幀外所有收到的數(shù)據(jù);
[0028]混合指令:指一條指令尚未發(fā)完,中間插入了另一條指令。該種故障需接收中間插入的指令,插入前到來的數(shù)據(jù)和后續(xù)數(shù)據(jù)則丟棄;
[0029]混合數(shù)據(jù):指在正常指令傳輸過程中有其他數(shù)據(jù)到來。在指令到來前或者在指令末尾插入數(shù)據(jù)則直接丟棄該數(shù)據(jù),在中間插入數(shù)據(jù)則歸結(jié)為指令內(nèi)容錯(cuò)誤和校驗(yàn)和錯(cuò)誤。
[0030]只影響當(dāng)前指令數(shù)據(jù)處理的故障包含:
[0031]指令內(nèi)容錯(cuò)誤,不影響后續(xù)數(shù)據(jù)接收,直接丟棄該指令。
[0032]校驗(yàn)和錯(cuò)誤,不影響后續(xù)數(shù)據(jù)接收,直接丟棄該指令。
[0033]由上述描述可以得出,影響后續(xù)數(shù)據(jù)處理的故障圍繞同步幀和指令長(zhǎng)度進(jìn)行。當(dāng)收到正確的同步幀時(shí),則丟棄此前的已接收數(shù)據(jù)。當(dāng)同步幀正確且指令長(zhǎng)度滿足要求時(shí),則不會(huì)發(fā)生影響后續(xù)數(shù)據(jù)處理的故障,可直接將該指令發(fā)送給只影響當(dāng)前指令數(shù)據(jù)處理的故障處理任務(wù)做進(jìn)一步處理。
[0034]影響后續(xù)數(shù)據(jù)處理的故障只需判斷同步幀,處理時(shí)間短,在中斷處理任務(wù)中進(jìn)行。只影響當(dāng)前指令數(shù)據(jù)處理的故障需要校驗(yàn)指令內(nèi)容,校驗(yàn)指令的校驗(yàn)和,處理時(shí)間較長(zhǎng),但不影響后續(xù)數(shù)據(jù)處理,可在中斷處理任務(wù)中進(jìn)行。
[0035]本發(fā)明的實(shí)現(xiàn)過程如圖1所示,具體步驟如下:
[0036](I)每個(gè)中斷周期中斷服務(wù)程序中斷接收外部請(qǐng)求數(shù)據(jù),判斷接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L與同步幀字節(jié)數(shù)LS的大小,若接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L小于同步幀的字節(jié)數(shù)LS,則接收外部請(qǐng)求數(shù)據(jù),接收完外部請(qǐng)求數(shù)據(jù)后等待下一個(gè)中斷周期開始,否則執(zhí)行步驟(2);
[0037](2)檢驗(yàn)點(diǎn)I的操作如圖2所示,若接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L等于同步幀的字節(jié)數(shù)LS,則執(zhí)行如下操作:
[0038](a)從第一個(gè)字節(jié)開始,判斷接收到的外部請(qǐng)求數(shù)據(jù)與同步幀數(shù)據(jù)是否完全相等,如果接收到的外部請(qǐng)求數(shù)據(jù)與同步幀數(shù)據(jù)完全相等,則轉(zhuǎn)入執(zhí)行步驟(3);否則,執(zhí)行步驟
(b);
[0039](b)置 i = l;
[0040](c)從第i個(gè)接收的外部請(qǐng)求數(shù)據(jù)開始,判斷接收到的外部請(qǐng)求數(shù)據(jù)與同步幀前LS-1個(gè)數(shù)據(jù)是否完全相等,如果接收到的外部請(qǐng)求數(shù)據(jù)與同步幀前LS-1個(gè)數(shù)據(jù)完全相等,則保留后接收到的L-1個(gè)外部請(qǐng)求數(shù)據(jù),并置L=L-1,然后轉(zhuǎn)入執(zhí)行步驟(3),否則執(zhí)行步驟Cd);
[0041](d)i=i+l,判斷i與同步巾貞的字節(jié)數(shù)LS的大小,若i>=LS,則置L=O,放棄接收到的外部請(qǐng)求數(shù)據(jù),然后轉(zhuǎn)入執(zhí)行步驟(3),否則返回執(zhí)行步驟(c);
[0042](3)判斷接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L與指令字節(jié)數(shù)LC的大小,若接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L小于指令的字節(jié)數(shù)LC,執(zhí)行如下操作,檢驗(yàn)點(diǎn)2的操作如圖3所示:
[0043](A)判斷接收到的外部請(qǐng)求數(shù)據(jù)是否為同步幀的最后一個(gè)數(shù)據(jù),如果不是則等待下一個(gè)中斷周期開始,如果是則執(zhí)行步驟(B);
[0044](B)判斷接收到的LS個(gè)字節(jié)與同步幀的數(shù)據(jù)是否完全相等,如果最后接收到的LS個(gè)字節(jié)與同步幀的數(shù)據(jù)完全相等,則保留后續(xù)LS個(gè)同步幀數(shù)據(jù)并置L=LS,然后等待下一個(gè)中斷周期開始,否則直接等待下一個(gè)中斷周期開始;
[0045]若接收到的外部請(qǐng)求數(shù)據(jù)大于等于指令的字節(jié)數(shù)LC,執(zhí)行如下操作,檢驗(yàn)點(diǎn)3的操作如圖4所示:
[0046](C)發(fā)送指令到中斷處理任務(wù)中,檢查最后一個(gè)外部請(qǐng)求數(shù)據(jù)是否為同步幀中的數(shù)據(jù),如果不是,則置L=0,清除接收到的外部請(qǐng)求數(shù)據(jù),然后等待下一個(gè)中斷周期開始,如果是則執(zhí)行步驟(D):
[0047](D)記最后一個(gè)外部請(qǐng)求數(shù)據(jù)為同步幀數(shù)據(jù)中的第i個(gè)數(shù)據(jù),判斷最后接收的i個(gè)外部請(qǐng)求數(shù)據(jù)是否與同步幀中前i個(gè)數(shù)據(jù)完全相等,如果相等則保留這i個(gè)外部請(qǐng)求數(shù)據(jù)并置L=i,等待下一個(gè)中斷周期開始;如果不相等則置L=0,清除接收到的外部請(qǐng)求數(shù)據(jù),等待下一個(gè)中斷周期開始;
[0048](4)結(jié)束,等待下一個(gè)中斷周期開始。
[0049]該設(shè)計(jì)方法充分利用兩條指令的時(shí)間間隔,細(xì)分故障為兩種故障類型,分別在中斷服務(wù)程序和中斷處理任務(wù)中進(jìn)行故障的快速檢測(cè)及恢復(fù),上述檢驗(yàn)點(diǎn)的處理保證了由中斷服務(wù)程序轉(zhuǎn)發(fā)的指令不可能同時(shí)包含2條指令,不會(huì)影響后續(xù)數(shù)據(jù)的處理,縮短中斷處的時(shí)間。
[0050]本發(fā)明未詳細(xì)描述內(nèi)容為本領(lǐng)域技術(shù)人員公知技術(shù)。
【權(quán)利要求】
1.一種中斷服務(wù)程序中通信故障的快速恢復(fù)方法,其特征在于步驟如下: (1)每個(gè)中斷周期中斷服務(wù)程序中斷接收外部請(qǐng)求數(shù)據(jù),判斷接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L與同步幀字節(jié)數(shù)LS的大小,若接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L小于同步幀的字節(jié)數(shù)LS,則接收外部請(qǐng)求數(shù)據(jù),接收完外部請(qǐng)求數(shù)據(jù)后等待下一個(gè)中斷周期開始,否則執(zhí)行步驟⑵; (2)若接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L等于同步幀的字節(jié)數(shù)LS,則執(zhí)行如下操作: (a)從第一個(gè)字節(jié)開始,判斷接收到的外部請(qǐng)求數(shù)據(jù)與同步幀數(shù)據(jù)是否完全相等,如果接收到的外部請(qǐng)求數(shù)據(jù)與同步幀數(shù)據(jù)完全相等,則轉(zhuǎn)入執(zhí)行步驟(3);否則,執(zhí)行步驟(b);
(b)置i=l ; (c)從第i個(gè)接收的外部請(qǐng)求數(shù)據(jù)開始,判斷接收到的外部請(qǐng)求數(shù)據(jù)與同步幀前LS-1個(gè)數(shù)據(jù)是否完全相等,如果接收到的外部請(qǐng)求數(shù)據(jù)與同步幀前LS-1個(gè)數(shù)據(jù)完全相等,則保留后接收到的L-1個(gè)外部請(qǐng)求數(shù)據(jù),并置L=L-1,然后轉(zhuǎn)入執(zhí)行步驟(3),否則執(zhí)行步驟(d); (d)i=i+l,判斷i與同步幀的字節(jié)數(shù)LS的大小,若i>=LS,則置L=0,放棄接收到的外部請(qǐng)求數(shù)據(jù),然后轉(zhuǎn)入執(zhí)行步驟(3),否則返回執(zhí)行步驟(c); (3)判斷接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L與指令字節(jié)數(shù)LC的大小,若接收到的外部請(qǐng)求數(shù)據(jù)字節(jié)數(shù)L小于指令的字節(jié)數(shù)LC,則執(zhí)行如下操作: (A)判斷接收到的外部請(qǐng)求數(shù)據(jù)是否為同步幀的最后一個(gè)數(shù)據(jù),如果不是則等待下一個(gè)中斷周期開始,如果是則執(zhí)行步驟(B); (B)判斷接收到 的LS個(gè)字節(jié)與同步幀的數(shù)據(jù)是否完全相等,如果最后接收到的LS個(gè)字節(jié)與同步幀的數(shù)據(jù)完全相等,則保留后續(xù)LS個(gè)同步幀數(shù)據(jù)并置L=LS,然后等待下一個(gè)中斷周期開始,否則直接等待下一個(gè)中斷周期開始; 若接收到的外部請(qǐng)求數(shù)據(jù)大于等于指令的字節(jié)數(shù)LC,則執(zhí)行如下操作: (C)發(fā)送指令到中斷處理任務(wù)中,檢查最后一個(gè)外部請(qǐng)求數(shù)據(jù)是否為同步幀中的數(shù)據(jù),如果不是,則置L=0,清除接收到的外部請(qǐng)求數(shù)據(jù),然后等待下一個(gè)中斷周期開始,如果是則執(zhí)行步驟(D): (D)記最后一個(gè)外部請(qǐng)求數(shù)據(jù)為同步幀數(shù)據(jù)中的第i個(gè)數(shù)據(jù),判斷最后接收的i個(gè)外部請(qǐng)求數(shù)據(jù)是否與同步幀中前i個(gè)數(shù)據(jù)完全相等,如果相等則保留這i個(gè)外部請(qǐng)求數(shù)據(jù)并置L=i,等待下一個(gè)中斷周期開始;如果不相等則置L=0,清除接收到的外部請(qǐng)求數(shù)據(jù),等待下一個(gè)中斷周期開始; (4)結(jié)束,等待下一個(gè)中斷周期開始。
【文檔編號(hào)】G06F11/14GK103593261SQ201310488184
【公開日】2014年2月19日 申請(qǐng)日期:2013年10月17日 優(yōu)先權(quán)日:2013年10月17日
【發(fā)明者】萬麗景, 黨紀(jì)紅, 關(guān)小川, 林琳, 葛瑩, 王晶 申請(qǐng)人:北京控制工程研究所