鄧 偉 , 石 煒
(1.通信信息控制和安全技術(shù)重點(diǎn)實(shí)驗(yàn)室 浙江 嘉興 314033;2.中國(guó)電子科技集團(tuán)公司第三十六研究所 浙江 嘉興 314033)
在復(fù)雜的通信系統(tǒng)設(shè)計(jì)過(guò)程中,設(shè)計(jì)者通常會(huì)將系統(tǒng)劃分為獨(dú)立的功能單元,單元之間通過(guò)接口相互連接,實(shí)現(xiàn)系統(tǒng)功能。一般來(lái)說(shuō),單元之間的物理連接會(huì)盡量采用同一種物理接口,但建立在物理接口之上的通信協(xié)議卻因單元提供功能的差別而各不相同。開(kāi)發(fā)人員必須為每個(gè)單元開(kāi)發(fā)相應(yīng)的協(xié)議解析程序,從協(xié)議數(shù)據(jù)中提取出所需要的信息加以處理,完成單元的控制。
這些通信協(xié)議的構(gòu)成通常很類似,其主要構(gòu)成為幀數(shù)據(jù),并且?guī)瑪?shù)據(jù)的格式內(nèi)容大都包含地址、命令、參數(shù)、數(shù)據(jù)等信息。傳統(tǒng)的手工開(kāi)發(fā)方式需要針對(duì)每條協(xié)議編寫相應(yīng)的解析程序,使得系統(tǒng)開(kāi)發(fā)人員的主要精力無(wú)法集中在系統(tǒng)功能本身。針對(duì)這種情況,研究人員提出了遠(yuǎn)程過(guò)程調(diào)用(RPC)機(jī)制試圖解決這一問(wèn)題,但RPC的實(shí)現(xiàn)通常需要系統(tǒng)提供操作系統(tǒng)和TCP/IP協(xié)議棧[1-2],這無(wú)疑增加了系統(tǒng)開(kāi)發(fā)的難度;此外,一些簡(jiǎn)單的單元的接口控制邏輯通常是由低端的單片機(jī)構(gòu)成,無(wú)法提供RPC機(jī)制所需的運(yùn)行環(huán)境。這極大地限制了RPC機(jī)制的應(yīng)用范圍。相關(guān)文獻(xiàn)[3]指出,可以通過(guò)采用編譯技術(shù)來(lái)完成協(xié)議的解析和識(shí)別,但該文獻(xiàn)提出的方案的需要宿主機(jī)提供解釋性語(yǔ)言的支持,如VB、Python等語(yǔ)言,這些解釋性語(yǔ)言通常在大多數(shù)單元中并不存在。
筆者針對(duì)上述解決方案的不足,提出了一種接近于幀協(xié)議文本的幀協(xié)議描述語(yǔ)言,并利用編譯技術(shù)實(shí)現(xiàn)了一種自動(dòng)化解析器,該解析器將幀協(xié)議描述語(yǔ)言自動(dòng)轉(zhuǎn)換為標(biāo)準(zhǔn)C語(yǔ)言的數(shù)據(jù)類型,并生成相應(yīng)的解析函數(shù)和釋放函數(shù)。利用該方案,開(kāi)發(fā)人員只需要針對(duì)協(xié)議文本中的幀結(jié)構(gòu)編寫相應(yīng)的幀協(xié)議描述說(shuō)明,自動(dòng)化解析器可根據(jù)幀協(xié)議描述說(shuō)明自動(dòng)生成相應(yīng)的解析程序。開(kāi)發(fā)人員調(diào)用生成的解析函數(shù),即可提取出幀數(shù)據(jù)中包含的信息。該方案相對(duì)于RPC機(jī)制,減少了對(duì)系統(tǒng)環(huán)境的需求,極大地?cái)U(kuò)展了該方案的適用性。
文中設(shè)計(jì)的協(xié)議自動(dòng)化解析器主要包括幀協(xié)議語(yǔ)言、詞法分析器、語(yǔ)法分析器、語(yǔ)義分析等,協(xié)議自動(dòng)化解析器的工作流程如圖1所示。
圖1 協(xié)議自動(dòng)化解析器工作流程Fig.1 Working flow of automatic protocol analyzer
協(xié)議自動(dòng)解析器首先對(duì)幀格式描述語(yǔ)言進(jìn)行詞法分析和語(yǔ)法分析,根據(jù)分析結(jié)果生成標(biāo)準(zhǔn)C語(yǔ)言的數(shù)據(jù)結(jié)構(gòu)定義和幀數(shù)據(jù)的解析函數(shù)。由于在幀數(shù)據(jù)的解析的過(guò)程中,需要?jiǎng)討B(tài)的分配系統(tǒng)內(nèi)存,因此自動(dòng)化解析器還生成了對(duì)應(yīng)的內(nèi)存釋放函數(shù)。這樣避免了開(kāi)發(fā)人員手工編寫內(nèi)存釋放代碼可能存在的內(nèi)存泄露問(wèn)題。將自動(dòng)化解析器生成的C代碼通過(guò)C編譯器編譯變?yōu)榭蓤?zhí)行代碼。當(dāng)某幀數(shù)據(jù)到達(dá)時(shí),利用可執(zhí)行代碼即可完成幀協(xié)議的解析,并提取相應(yīng)的信息,復(fù)制到幀數(shù)據(jù)C語(yǔ)言結(jié)構(gòu)體相關(guān)域,應(yīng)用程序通過(guò)訪問(wèn)該結(jié)構(gòu)體即可完成信息的訪問(wèn)。
文中設(shè)計(jì)的幀協(xié)議描述語(yǔ)言是為了描述常用的通信協(xié)議而提出的一種專用描述語(yǔ)言,通過(guò)該語(yǔ)言可使設(shè)計(jì)人員方便的描述通信幀結(jié)構(gòu)。幀協(xié)議描述語(yǔ)言主要包括詞法部分和語(yǔ)法部分。詞法主要包括對(duì)幀協(xié)議語(yǔ)言所使用的關(guān)鍵字和保留符號(hào)的描述。為了使設(shè)計(jì)的描述語(yǔ)言符合開(kāi)發(fā)人員慣用的方式,文中定義了6類關(guān)鍵字和4類保留符號(hào),如表1所示。
表1 幀描述語(yǔ)言中的關(guān)鍵字和保留符號(hào)Tab.1 Keywords and reserved symbols in frame description language
幀協(xié)議描述語(yǔ)言語(yǔ)法部分采用了常見(jiàn)的上下文無(wú)關(guān)文法來(lái)定義。文中設(shè)計(jì)的幀協(xié)議描述語(yǔ)言的主要語(yǔ)法元素包括幀、域、變量和數(shù)組,具體的語(yǔ)法結(jié)構(gòu)定義如表2所示。
表2 幀描述語(yǔ)言的語(yǔ)法元素Tab.2 Syntax element in frame description language
Flex是lex工具的開(kāi)源版本[4],它的主要功能是根據(jù)用戶定義的詞法規(guī)則,生成面向字符流的自動(dòng)掃描程序,將字符流分解為獨(dú)立的token和token所對(duì)應(yīng)的詞法屬性。采用flex編寫的詞法分析程序主要包括3部分,每一部分用%%號(hào)分開(kāi)。其中第一部分為引用的頭文件,變量聲明等;第二部分為詞法規(guī)則定義的部分;第三部分為用戶定義的函數(shù)。每個(gè)詞法規(guī)則都由模式和動(dòng)作兩部分構(gòu)成。其中模式部分采用正則表達(dá)式來(lái)定義,當(dāng)字符流中出現(xiàn)了符合該正則表達(dá)式的部分時(shí),詞法掃描程序?qū)?zhí)行該模式對(duì)應(yīng)的動(dòng)作。
幀協(xié)議描述語(yǔ)言詞法分析主要包括對(duì)描述語(yǔ)言所定義的關(guān)鍵字、保留符號(hào)和合法標(biāo)志符的識(shí)別,其部分flex程序如下:
上述程序通過(guò)flex工具編譯并生成詞法分析程序后,即可對(duì)幀協(xié)議語(yǔ)言進(jìn)行詞法分析,該程序遇到int等關(guān)鍵字,會(huì)返回該關(guān)鍵字屬性;在遇到合法標(biāo)志符時(shí),會(huì)將yytext中該標(biāo)志字符串復(fù)制到y(tǒng)ylval.idName域中,返回變量屬性;在遇到整型字符串時(shí),會(huì)將yytext中的字符串轉(zhuǎn)為整型,賦值到y(tǒng)ylval.iVal域中,返回整型屬性。
Bison工具作為yacc的開(kāi)源版本[4],主要功能是根據(jù)用戶定義的上下文無(wú)關(guān)文法來(lái)描述語(yǔ)言規(guī)則,從而生成語(yǔ)法分析的程序。Bison程序的結(jié)構(gòu)與flex類似,同樣采用%%將文件分為3部分,第一部分包含頭文件聲明、函數(shù)聲明等;第二部分包括所有的語(yǔ)法規(guī)則表達(dá)式,也是語(yǔ)法分析的主要部分;第三部分是用戶自定義函數(shù),主要包含幀協(xié)議描述文件的打開(kāi)、關(guān)閉,輸出文件的創(chuàng)建等工作。
幀協(xié)議描述語(yǔ)言的bison文件的規(guī)則部分是主要構(gòu)成部分。bison文件的規(guī)則部分將幀協(xié)議語(yǔ)法描述為一套產(chǎn)生規(guī)則,每條規(guī)則都由
它表示一個(gè)通信幀由幀名稱和一個(gè)或多個(gè)域構(gòu)成,對(duì)應(yīng)的動(dòng)作是生成這條通信幀的C語(yǔ)言結(jié)構(gòu)體的定義。幀描述語(yǔ)言完整的規(guī)則部分如下:
Bison語(yǔ)法分析程序采用LALR分析方法[5-6]將詞法分析程序返回的token序列與給定的語(yǔ)法規(guī)則匹配,并依據(jù)匹配的語(yǔ)法部分構(gòu)建成相應(yīng)的語(yǔ)法樹(shù)。在幀語(yǔ)言文件分析結(jié)束后,相對(duì)應(yīng)的語(yǔ)法樹(shù)也已建立,此時(shí)語(yǔ)法分析階段結(jié)束,由主程序調(diào)用語(yǔ)義分析函數(shù)完成幀協(xié)議分析函數(shù)的生成。
幀協(xié)議描述語(yǔ)言的語(yǔ)義分析部分主要是從根節(jié)點(diǎn)遍歷語(yǔ)法部分構(gòu)成的語(yǔ)法樹(shù),并根據(jù)樹(shù)中每個(gè)節(jié)點(diǎn)的不同類型,產(chǎn)生相應(yīng)的標(biāo)準(zhǔn)C代碼。語(yǔ)義部分通過(guò)3次遍歷語(yǔ)法樹(shù),分別產(chǎn)生幀結(jié)構(gòu)定義,幀數(shù)據(jù)解析函數(shù)和幀數(shù)據(jù)釋放函數(shù)。
將文中設(shè)計(jì)的協(xié)議自動(dòng)化解析器應(yīng)用到某通信系統(tǒng)單元中,該單元的授時(shí)幀格式如表3所示。
表3 授時(shí)協(xié)議Tab.3 Time sync protocol
根據(jù)表3,可采用協(xié)議描述語(yǔ)言將授時(shí)幀描述如下:
將輸出的文件通過(guò)C編譯器編譯,編譯順利通過(guò)。該試驗(yàn)結(jié)果顯示,協(xié)議自動(dòng)化解析器生成的C代碼可以取代手工代碼開(kāi)發(fā),應(yīng)用程序通過(guò)調(diào)用time_sync_frame_anaylze_fn函數(shù)即可完成授時(shí)幀的解析,并在函數(shù)返回后可直接訪問(wèn)返回變量中的域,提取相關(guān)信息。如果授時(shí)幀協(xié)議有修改,開(kāi)發(fā)人員只需要修改幀協(xié)議描述文件,自動(dòng)化解析器將自動(dòng)完成C代碼的生成,這極大地減少了開(kāi)發(fā)人員的負(fù)擔(dān)。
文中開(kāi)發(fā)自動(dòng)化解析器可減少大量的代碼編寫工作,并且編碼的準(zhǔn)確性有很大提高。針對(duì)通信幀協(xié)議的更新,開(kāi)發(fā)人員只需要修改幀協(xié)議描述文件,這簡(jiǎn)化了幀協(xié)議代碼的維護(hù)工作,降低了幀協(xié)議開(kāi)發(fā)的難度,在通信協(xié)議軟件開(kāi)發(fā)方面具有很強(qiáng)的實(shí)用性。
[1]Iseminger D.網(wǎng)絡(luò)連接服務(wù)開(kāi)發(fā)人員參考庫(kù)RPC與WNet[M].3卷.北京:機(jī)械工業(yè)出版社,2001.
[2]許瓊,蔡文皓.一種嵌入式RPC的設(shè)計(jì)與實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2011(5):127-129.
XU Qiong,CAI Wen-hao.Design and implementation of embedded RPC[J].Electronic Design Engineering,2011(5):127-129.
[3]董立,趙恒永.基于編譯技術(shù)的協(xié)議解析方法[J].計(jì)算機(jī)工程,2007(11):66-68.
DONG Li,ZHAO Heng-yong.Protocol parsing method based on compiling technology[J].Computer Engineering,2007(11):66-68.
[4]利文.flex與bison[M].中文版.南京:東南大學(xué)出版社,2011.
[5]丁文魁,杜淑敏.編譯原理和技術(shù)[M].北京:電子工業(yè)出版社,2008.
[6]劉堅(jiān).編譯原理基礎(chǔ)[M].西安:西安電子科技大學(xué)出版社,2008.