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