黃小波,邵 威
(中國電子科技集團公司第三十八研究所 安徽 合肥 230013)
在嵌入式技術飛速發(fā)展的今天,嵌入式產(chǎn)品已出現(xiàn)在社會的各個領域,包括通信、軍事、儀表、航空、航天、工業(yè)控制及家庭消費等。從嵌入式系統(tǒng)的外觀上看,嵌入式系統(tǒng)像是一個“可編程”的電子“器件”;從構成上看,嵌入式系統(tǒng)是集軟硬件于一體的、可獨立工作的計算機系統(tǒng);從功能上看,它是對宿主對象進行控制,使其具有“智能”的控制器。從應用的角度看,嵌入式系統(tǒng)與通用計算機系統(tǒng)相比,有如下一些特點:
1)專用性。由于嵌入式系統(tǒng)通常是面向某個特定應用的,所以嵌入式系統(tǒng)的硬件和軟件,尤其是軟件,都是為特定用戶群來設計的,它通常都具有某種專用性的特點。
2)實時性。目前,嵌入式系統(tǒng)廣泛應用于生產(chǎn)過程控制、數(shù)據(jù)采集、傳輸通信等場合,主要用來對宿主對象進行控制。例如,對嵌入在武器裝各中的嵌入式系統(tǒng)、在火箭中的嵌入式系統(tǒng)等應用中的實時性要求就極高。實時性是對嵌入式系統(tǒng)的普遍要求,是設計者和用戶重點考慮的一個重要指標。
嵌入式系統(tǒng)軟件的調(diào)試技術一直是一項困難而富有挑戰(zhàn)性的技術。嵌入式系統(tǒng)中的軟件調(diào)試與桌面軟件的調(diào)試有很大的不同[1]。調(diào)試嵌入式系統(tǒng)時,調(diào)試器和被調(diào)試程序往往是物理上分離的。調(diào)試器運行在宿主機上,而被調(diào)試程序運行在目標機上,宿主機與目標機之間通過某種媒介進行通信。同時,還要在目標機上運行一個稱為調(diào)試代理(Debug Agent)的監(jiān)控程序,由它來負責與運行在宿主機上的調(diào)試器進行通信,控制被調(diào)試程序的執(zhí)行,并將被調(diào)試程序的執(zhí)行情況及時反饋給調(diào)試器。對一些響應時間要求在毫秒或微妙的系統(tǒng)軟件中,在調(diào)試過程中,還要考慮設計的調(diào)試程序是否會導致系統(tǒng)延時、是否會破壞系統(tǒng)軟件的高實時性要求。本文針對工程實際應用背景,提出了一種基于數(shù)組動態(tài)保存、文件記錄和后期數(shù)據(jù)處理的在線調(diào)試技術,在滿足系統(tǒng)軟件高實時性要求的前提下,有效地解決了通訊數(shù)據(jù)丟包排查、數(shù)據(jù)誤碼率驗證和運行過程中關鍵變量的可持續(xù)跟蹤問題,對解決系統(tǒng)聯(lián)調(diào)中出現(xiàn)的問題有很強的現(xiàn)實價值。
程序的動態(tài)調(diào)試就是實際上機調(diào)試。根據(jù)程序編譯、連接和運行時計算機給出的錯誤信息進行程序調(diào)試,這是程序調(diào)試中最常用的方法,也是最初步的動態(tài)調(diào)試。在此基礎上,通過分段隔離、設置斷點、跟蹤打印等對程序進一步調(diào)試。目前常用的動態(tài)調(diào)試方法包括:
1)使用在線仿真器
隨著低成本的在線調(diào)試能力的增強,如ARM的ICE[2-3](在線仿真器),通過指令單步調(diào)試變得更容易。這種方式可以查看和修改變量值,顯示寄存器的內(nèi)容,查看內(nèi)存塊。
2)使用遠端調(diào)試器
通過遠端調(diào)試器[4-5],登錄或接管目標系統(tǒng)操作權限,實現(xiàn)讀/寫內(nèi)存與寄存器、設置斷點、單步執(zhí)行和繼續(xù)執(zhí)行功能。
3)在IDE(集成編輯環(huán)境)中使用動態(tài)調(diào)試
很多IDE都帶有動態(tài)調(diào)試功能[6],諸如:單步運行、變量監(jiān)視等,有的甚至給出了寄存器、反匯編、函數(shù)調(diào)用堆棧。但上述方法通常只有在目標系統(tǒng)停止運行時候才可以實現(xiàn)。然而,很多實時系統(tǒng)是不能停止的,由此引出如下動態(tài)調(diào)試方法。
4)使用 assert(斷言)
目前一般嵌入式操作系統(tǒng)都支持C或C++語言。C或C++語言有一個很實用的系統(tǒng)函數(shù):assert()。一旦計算發(fā)生錯誤,程序就會立即終止,并提醒程序員有錯誤發(fā)生,在哪一行。使用斷言最根本的好處是自動發(fā)現(xiàn)許多運行時產(chǎn)生的錯誤,但斷言不能發(fā)現(xiàn)所有錯誤。
5)使用 printf()函數(shù)
對于用C或C++語言編寫的嵌入式軟件,可以將printf()函數(shù)來插入到代碼中的關鍵位置來查看或輸出對象的動態(tài)行為。但過度使用 printf()函數(shù)將導致程序臃腫,且會造成系統(tǒng)延時。當通過串口傳遞信息時,這個延時會更長。
6)使用文件實時保存
將變量實時寫入本地文件中,通過對保存的文件進行后續(xù)分析,查看系統(tǒng)在整個運行過程中行為的變化情況。由于文件實時讀寫過程中會強制占用系統(tǒng)時間,所以對于一些高實時性運行環(huán)境,使用文件實時讀取方式會破壞系統(tǒng)工作環(huán)境的完整性。
基于數(shù)組動態(tài)保存、文件記錄和后期數(shù)據(jù)處理的在線調(diào)試技術的具體設計流程如圖1所示。
圖1 在線調(diào)試技術處理流程圖Fig.1 Flow chart of online debugging technique process
對上述流程圖中的執(zhí)行條件,可以在程序設計時預先定義好觸發(fā)條件,也可以通過外部發(fā)送控制命令(如通過網(wǎng)絡、串口或1553B總線等發(fā)送命令)來產(chǎn)生觸發(fā)事件。為考慮程序通用性,設計如下函數(shù):void WriteDataToBuf(unsiged char*pch,unigned short len);用于將需保存的單個數(shù)據(jù)或一串數(shù)據(jù)寫入到數(shù)組buf中。
函數(shù)WriteDataToBuf使用如下:
1)存放char或unsiged char類型數(shù)據(jù),如:unsiged char m_value=0x11; WriteDataToBuf(&m_value,1);
2)存放short或unsiged short類型數(shù)據(jù),如 unsiged short m_value=0x1111; WriteDataToBuf(&m_value,2);
3)存放占用4個字節(jié)長度的類型數(shù)據(jù) (long,float等),如 float m_value=12.345; WriteDataToBuf(&m_value,4);
4)存放長度為len的數(shù)組,如 unsiged char m_value[20],WriteDataToBuf(m_value,20);
為便于直觀查看文件pData中數(shù)據(jù),一般將文件pData生成后綴名為txt文件,生成的文件pData.txt一般采用16進制保存 (用戶可自行定義存儲方式)。對生成的pData.txt文件,依據(jù)實際應用需求,可進行后續(xù)加工處理。通常的處理方式包括:
①將變量存儲的類型轉換為10進制數(shù)據(jù);
②通過其它數(shù)據(jù)分析工具進行分析,如origin,excel,matlab等,以查看數(shù)據(jù)或一串數(shù)組的變化情況;
③編寫特制應用軟件進行數(shù)據(jù)分析處理。
某SAR(Synthetic Aperture Radar,合成孔徑雷達)系統(tǒng)組成示意圖如圖2所示。
圖2 SAR系統(tǒng)組成示意圖Fig.2 Schematic diagram of the SAR system components
圖中虛線框內(nèi)為與SAR連接的外部設備。其中測控處理軟件固化在監(jiān)控分系統(tǒng)板載PC104中,采用QNX操作系統(tǒng),編寫語言為C++。測控處理軟件接收的控制指令由一體化顯控發(fā)送,發(fā)送的方式為非周期形式。由于為無線鏈路通訊方式,存在數(shù)據(jù)指令丟失的可能,為增加指令通訊的可靠性,每一控制指令連續(xù)發(fā)送3次。設一體化顯控發(fā)送的指令包記為A={A1,A2,A3,A4…An},n=16。 指令包經(jīng)過機載數(shù)據(jù)終端重新打包后形成指令包 B,記為 B={A,B1,B2,…Bm},m=44。 指令包A成為指令包B的子包。測控處理軟件通過異步串口接收機載數(shù)據(jù)終端發(fā)送的指令包B。
為減少人工操作,一體化顯控界面設計了多種一鍵操作模式,點擊一個控制按鈕,會自動發(fā)送若干條控制指令,最多會一次發(fā)出10條以上控制命令,每條控制指令重復發(fā)送3次,兩條指令間隔時間在20 ms內(nèi),也即意味測控處理軟件在1秒內(nèi)會收到近50條控制指令。
在實際聯(lián)調(diào)過程中,發(fā)現(xiàn)測控處理軟件收到的指令包A存在丟包現(xiàn)象。丟包的原因可以通過鏈路組成形成如下猜測(如下猜測之一或其組合):
①一體化顯控發(fā)送出來的指令包A已經(jīng)丟包;
②指令包A經(jīng)過無線鏈路傳輸?shù)綑C載數(shù)據(jù)終端前已經(jīng)丟包;
③機載終端接收指令包A,在處理過程及重新對數(shù)據(jù)打包形成指令包B過程中丟包;
④測控處理軟件通過串口接收到完整指令包,但在處理過程中丟包。
由于虛線部分為外部設備,且已經(jīng)過聯(lián)調(diào)(當然沒有和SAR聯(lián)調(diào)過),如上猜測2)和3)暫時排除在外。而一體化顯控采用VC編程,可方便驗證猜測1)的情況。
為便于測試,一體化顯控發(fā)送控制指令時,將某個字節(jié)定義為幀編號,每發(fā)送出一條指令時,幀編號加1。假設一體化顯控發(fā)送出去的控制指令都正確的話,如果測控處理軟件通過串口收到的控制指令丟包,正常的排查措施如下:
① 在測控處理軟件中使用printf函數(shù)將接收到的數(shù)據(jù)通過屏幕輸出的方式實時打印出來。帶來的問題是,屏幕刷新速度太快,無法確認數(shù)據(jù)實際接收情況;同時頻繁使用printf函數(shù)會造成系統(tǒng)延時,影響串口接收中斷,破壞了系統(tǒng)實際工作環(huán)境。
②累計1 s統(tǒng)計接收到的正確數(shù)據(jù)包,然后通過printf()函數(shù)輸出到屏幕上。帶來的問題是,無法確認是哪組指令出現(xiàn)丟包,每組指令丟包多少;
③在測控處理軟件中將從串口接收到的原始數(shù)據(jù)實時保存到文件中。帶來的問題是,采用實時文件讀寫方式會造成系統(tǒng)延時,影響串口接收中斷,破壞了系統(tǒng)實際工作環(huán)境。
④在機載數(shù)據(jù)終端送出數(shù)據(jù)時采用串口調(diào)試工具。帶來的問題是,由于現(xiàn)場條件約束,無法使用串口調(diào)試工具。
針對上述調(diào)試手段的不足,現(xiàn)采用基于數(shù)組動態(tài)保存、文件記錄和后期數(shù)據(jù)處理的在線調(diào)試技術來查看數(shù)據(jù)丟包率及數(shù)據(jù)丟包可能的源頭。具體解決過程如下:
① 申請一個較大空間的數(shù)組,如可存字節(jié)長度為100 000個;
② 通過調(diào)試工具(一般可用網(wǎng)絡調(diào)試工具)向測控處理軟件發(fā)送數(shù)據(jù)存數(shù)組指令;
③一段時間后發(fā)送數(shù)據(jù)存文件指令,生成pData.txt文件;
④將生成的pData.txt文件用ftp工具下載到本地計算機;
⑤ 使用VC編寫一個自動分析數(shù)據(jù)的軟件,將文件pData.txt中的數(shù)據(jù)按照數(shù)據(jù)包B的長度進行抽取,以查看數(shù)據(jù)包B中數(shù)據(jù)是否存在數(shù)據(jù)錯位;
⑥在抽取出數(shù)據(jù)包B的基礎上,通過軟件再抽取出數(shù)據(jù)包A。并可以根據(jù)實際情況,自動分析數(shù)據(jù)中校驗和錯誤率、有效控制命令數(shù)、相鄰數(shù)據(jù)幀編號之差等。
通過上述方法,就可以分析出數(shù)據(jù)的丟包數(shù)、丟包率、數(shù)據(jù)傳輸錯位情況,同時可判斷是由于機載數(shù)據(jù)終端送出時已丟包還是由于測控處理軟件在處理過程中產(chǎn)生了數(shù)據(jù)丟包。最終將問題定位在猜測2)上。
相比較一般常用調(diào)試方法,基于數(shù)組動態(tài)保存、文件記錄和后期數(shù)據(jù)處理的在線調(diào)試技術具有如下優(yōu)點:1)不中斷當前程序執(zhí)行過程;2)對程序動態(tài)實時性能影響較小,特別是對高實時性要求的系統(tǒng)軟件,此優(yōu)點尤其突出;3)可根據(jù)實際需求保存任意時間段、任意變量的數(shù)據(jù)值,便于后續(xù)分析;4)可查看變量在毫秒或微秒級內(nèi)的動態(tài)變化過程。
[1]陳云川,羅克露.嵌入式軟件調(diào)試技術[M].北京,電子工業(yè)出版社,2009.
[2]張春燕.嵌入式系統(tǒng)調(diào)試技術初探[J].電腦知識與技術,2010,6(30):8627-8629.
ZHANG Chun-yan.Research of debugging technique to embedded system[J].Journal of Computer Knowledge and Technology,2010,6(30):8627-8629.
[3]張楷,湯志忠.一種新的高速嵌入式系統(tǒng)軟件調(diào)試技術[J].計算機工程與應用,2003(29):59-62.
ZHANG Kai,TANG Zhi-zhong.A new high speed embedded system software debug technology[J].Journal of Computer Engineering and Applictiaon,2003(29):59-62.
[4]李紅衛(wèi).嵌入式遠程調(diào)試工具的研究與實現(xiàn)[J].微計算機信息,2009,25(2):87-89.
LI Wei-hong.Study and realization of embedded remote debugging tool[J].Journal of Control&Automation,2009,25(2):87-89.
[5]黃光紅,李鋼,張仁斌.通用嵌入式系統(tǒng)遠程調(diào)試器的研究與設計[J].計算機測量與控制,2008,16(6):853-855.
HUANG Guang-hong,LI Gang,ZHANG Ren-bin.Research and design of universal embedded system remote debugger[J].Journal of Comouter Measurement&Control,2008,16(6):853-855.
[6]魯愛國,萬曦.基于vxWorks的嵌入式軟件遠程調(diào)試[J].艦船電子工程,2007,27(6):151-154.
LU Ai-guo,WAN Xi.Deep discourse about remote debugging of embeded software based on vxWorks[J].Journal of Ship Electronic Engineering,2007,27(6):151-154.