徐喆 宋澤婷 陳新
摘要:為了提升在VxWorks開發(fā)過程中的調(diào)試效率和靈活性,提出一種串口調(diào)試信息組合打印和輸出管理方法。將時間信息和文件信息組合輸出,通過調(diào)試信息編號與調(diào)試信息等級進行打印輸出管理,同時支持顏色控制和文件保存。實驗仿真表明,借助該方法能夠快速實現(xiàn)定位和故障現(xiàn)場恢復(fù),使軟件調(diào)試、運行監(jiān)測和系統(tǒng)維護更加清晰直觀,滿足大系統(tǒng)集成的需要。
關(guān)鍵詞:VxWorks;串口調(diào)試;輸出管理
中圖分類號:TP31文獻標志碼:A文章編號:1008-1739(2019)22-57-3
0引言
在嵌入式VxWorks[1]軟件開發(fā)過程中,通過串口輸出打印信息,串口終端監(jiān)控調(diào)試信息是一種常用的調(diào)試手段。在VxWorks實時操作系統(tǒng)中,打印輸出接口主要使用printf, logMsg函數(shù)。printf函數(shù)是一個參數(shù)個數(shù)可變的函數(shù),功能是按照用戶指定的格式,將數(shù)據(jù)按一定的格式輸出若干個任意類型的數(shù)據(jù)[2]。如果其他任務(wù)正在使用,則因臨界資源問題會堵塞[3]當前任務(wù),因此不可用于中斷。中斷服務(wù)程序應(yīng)盡快結(jié)束,否則將引起阻塞,有許多函數(shù)不可調(diào)用,如:printf(),malloc(),semTake()函數(shù)等,但可以使用semGive(),logMsg(),msgQSend(),bcopy()[4]。
與之對應(yīng)的logMsg函數(shù)為任務(wù)式打印輸出函數(shù)、非實時性打印輸出,且固定為6個參數(shù)。VxWorks內(nèi)核創(chuàng)建優(yōu)先級為0的tLogTask打印任務(wù),通過信號量同步消息,格式化調(diào)試信息后打印輸出,也同時打印輸出對應(yīng)調(diào)用的任務(wù)名。
在實際應(yīng)用時,直接使用printf, logMsg都存在不足。為了方便調(diào)試和開發(fā),本文結(jié)合二者優(yōu)點,提出一種串口調(diào)試打印輸出管理方法。此方法使用通用的宏定義,支持可變參數(shù)和非實時性打印輸出,支持多核多任務(wù)系統(tǒng)使用,在調(diào)試信息打印輸出時同時輸出當前時間、文件名稱和對應(yīng)行數(shù),并支持顏色控制和文件保存,支持通過調(diào)試信息編號和等級管理輸出內(nèi)容。
1軟件設(shè)計
方法設(shè)計時使用標準C/C++開發(fā),操作系統(tǒng)使用VxWorks5.5.1,開發(fā)環(huán)境使用Tornado,硬件通信方式使用SecureCRT[5],打印輸出使用logMsg,仿真環(huán)境使用VxSim。目標仿真器VxSim提供了與真實目標機一致的調(diào)試與仿真運行環(huán)境,用戶不需要目標機和操作系統(tǒng)配置即可在Tornado環(huán)境中迅速開發(fā)調(diào)試[6]。
定義此軟件名為log4m,初始化完成后,對調(diào)試信息編號和等級進行管理,如果允許輸出則先加鎖,組合當前時間、調(diào)試信息等級、調(diào)試信息內(nèi)容、文件名稱和對應(yīng)行數(shù),并進行顏色控制和文件保存,調(diào)用logMsg打印輸出,解鎖后完成一次調(diào)試信息的有效輸出。軟件運行流程圖如圖1所示。
1.1實現(xiàn)方式
在軟件實現(xiàn)時,存在常用的4種實現(xiàn)方式。
方式1:使用臨時變量作為緩存空間,無需資源互斥鎖,但存在臨時變量被系統(tǒng)回收后打印亂碼的問題,且消耗任務(wù)堆棧[7]資源。
方式2:使用new堆棧的方式作為緩存空間,但反復(fù)new, delete,存在軟件設(shè)計內(nèi)存溢出和越界的風(fēng)險。
方式3:使用全局變量作為緩存空間,需要二進制信號量互斥鎖,同時為了防止打印亂碼需要使用數(shù)據(jù)輸出循環(huán)緩存方式。此方式可增加調(diào)試信息保存到文件中,因為在讀寫文件時同樣需要使用資源互斥鎖。二進制信號量能有效對共享資源的訪問進行互鎖,來實現(xiàn)互斥。
方式4:使用創(chuàng)建任務(wù)方式,將打印輸出放入緩存列表中,通過低優(yōu)先級任務(wù)輸出,保證當前運行任務(wù)的實時性能,存在輸出打印實時性變差的問題。
結(jié)合實際使用情況,本文設(shè)計使用方式3,在開發(fā)階段犧牲了一定的實時性能,但無需反復(fù)申請堆棧,同時滿足調(diào)試打印的實時性。產(chǎn)品交付后,可通過輸出管理直接關(guān)閉打印輸出,減少因打印導(dǎo)致系統(tǒng)實時性能減弱的問題。
1.2打印輸出管理
在打印輸出管理時,使用調(diào)試信息編號ID管理和調(diào)試信息等級LEVEL管理。
調(diào)試信息編號ID管理,設(shè)計10個調(diào)試信息ID,其中ID為0是默認ID號,通過對外的接口控制相應(yīng)的ID號是否輸出。調(diào)試信息ID的設(shè)計根據(jù)調(diào)試信息的類別進行區(qū)分,將一個大系統(tǒng)中的多種類多任務(wù)調(diào)試信息打印分開管理,防止打印信息過多導(dǎo)致實時性能減弱和延誤查找調(diào)試信息。
調(diào)試信息等級LEVEL管理,設(shè)計4個調(diào)試信息等級,從低到高分別為LOG4M_LEVEL_DEBUG、LOG4M_LEVEL_ WARNS,LOG4M_LEVEL_ERROR,LOG4M_LEVEL_FATAL,對應(yīng)調(diào)試級、警告級、錯誤級和重大級。調(diào)試信息等級的設(shè)計根據(jù)調(diào)試信息重要性進行區(qū)分,將重要的調(diào)試信息通過顏色控制和調(diào)試信息等級提示分開管理,提高調(diào)試效率。
1.3調(diào)試信息內(nèi)容組合
在調(diào)試信息內(nèi)容組合時,使用宏定義和可變參數(shù)的設(shè)計,使用時將宏定義轉(zhuǎn)為格式轉(zhuǎn)換程序。在preLog4m函數(shù)中,實現(xiàn)調(diào)試信息編號ID管理和調(diào)試信息等級LEVEL管理;使用Log4m_Event信號量,進行資源互斥鎖,semTake加鎖,semGive解鎖;使用sprintf對可變參數(shù)進行格式轉(zhuǎn)換;在makeLog4m函數(shù)中,實現(xiàn)調(diào)試信息組合、顏色控制和文件保存,調(diào)試信息的組合內(nèi)容,包括當前時間輸出、調(diào)試信息等級、調(diào)試信息內(nèi)容、文件名稱和對應(yīng)行數(shù);通過VxWorks系統(tǒng)庫函數(shù)time,localtime[8]獲取當前時間,通過編譯器內(nèi)置宏__FILE__獲取文件路徑,編譯器內(nèi)置宏__LINE__獲取對應(yīng)行數(shù),使用sprintf,strcat,將當前時間、文件名稱和對應(yīng)行數(shù)組合,其中文件名可使用strrchr(file,’/’)分割文件路徑獲取。
1.4顏色控制和文件保存
使用轉(zhuǎn)義字符“e”更改輸出格式,根據(jù)調(diào)試信息等級調(diào)用不同的輸出格式,實現(xiàn)顏色控制。常用的輸出格式有“\e[0m”,“\e[1m”,“\e[30m”,“\e[31m”,“\e[40m”,“\e[41m”。其中,“\e[0m”標識清除所有格式,“\e[1m”標識字體加粗,“\e[30m”標識黑色字體,“\e[31m”標識紅色字體,“\e[40m”標識黑色背景色,“\e[41m”標識紅色背景色。需要注意不同的打印終端存在差異,實際顏色控制效果略有不同。更改輸出格式后,格式更改會一直保持,需要使用“\e[0m”清除格式或退出打印終端。例如log4m_stroems標識準備輸出的調(diào)試信息,LOG4M_COLOR為常量數(shù)組保存輸出格式。
算法3:顏色控制程序
在具有可讀寫硬盤的環(huán)境下,可啟用文件保存功能,將調(diào)試信息保存到硬盤中。離線調(diào)試、恢復(fù)現(xiàn)場和問題回溯時,可快速定位錯誤位置和故障原因。
2實驗仿真
在VxSim中仿真模擬調(diào)試打印和輸出管理過程,因VxSim中不支持轉(zhuǎn)義字符“e”,仿真時不使用顏色控制。仿真程序在初始化InitLog4m完成后,使用測試程序仿真運行,程序如下:
在VxSim0中打印輸出“InitLog4m started!”,對應(yīng)的源碼文件名為log4micro.cpp,在第149行時調(diào)用,初始化完成;在VxSim0中打印輸出“test=1,info=2”,對應(yīng)的源碼文件名為log4micro.cpp,在第152調(diào)用,與測試要求一致。
仿真運行結(jié)果如圖2所示。
3結(jié)束語
本文討論了一種基于VxWorks串口調(diào)試信息組合打印和輸出管理方法,詳細介紹了軟件設(shè)計中的實現(xiàn)方式、打印輸出管理、調(diào)試信息內(nèi)容組合、顏色控制和文件保存,并通過仿真模擬的方式實現(xiàn)了此方法。通過使用此方法,在VxWorks嵌入式實時操作系統(tǒng)軟件聯(lián)試階段和系統(tǒng)集成階段,能有效提高軟件設(shè)計和調(diào)試效率,具有一定工程意義。
參考文獻
[1]徐小權(quán).基于VxWorks實時多任務(wù)的信號處理軟件設(shè)計[J].電腦知識與技術(shù), 2013,9(17):4009-4012.
[2]張菊.淺析C語言printf函數(shù)的功能及使用[J].中國科技信息,2012(10):111-116.
[3]查榮明.Linux與VxWorks的任務(wù)調(diào)度研究及應(yīng)用[J].信息與電腦(理論版),2018(11):17-20.
[4]籍林峰,曹偉. VxWorks操作系統(tǒng)中中斷的應(yīng)用[J].雷達與對抗,2004(3):67-69.
[5]李進印.用SecureCRT軟件實現(xiàn)分散寬帶網(wǎng)絡(luò)管理研究[J].無線互聯(lián)科技,2013(12):10-11.
[6]許坤.VxWorks系統(tǒng)中任務(wù)狀態(tài)轉(zhuǎn)換的研究[J].艦船電子對抗,2004,27(2):28-31.
[7]朱劍鋒,繆萬勝,康介祥.基于堆?;厮莸漠惓L幚韀J].計算機工程與設(shè)計,2014,35(12):4176-4180.
[8]燚陳.VxWorks_for_x86系統(tǒng)中實時時鐘的應(yīng)用[J].電子元器件應(yīng)用,2010,12(3):61-64.