徐喆 宋澤婷 陳新
摘要:為了提升在VxWorks開發過程中的調試效率和靈活性,提出一種串口調試信息組合打印和輸出管理方法。將時間信息和文件信息組合輸出,通過調試信息編號與調試信息等級進行打印輸出管理,同時支持顏色控制和文件保存。實驗仿真表明,借助該方法能夠快速實現定位和故障現場恢復,使軟件調試、運行監測和系統維護更加清晰直觀,滿足大系統集成的需要。
關鍵詞:VxWorks;串口調試;輸出管理
中圖分類號:TP31文獻標志碼:A文章編號:1008-1739(2019)22-57-3

0引言
在嵌入式VxWorks[1]軟件開發過程中,通過串口輸出打印信息,串口終端監控調試信息是一種常用的調試手段。在VxWorks實時操作系統中,打印輸出接口主要使用printf, logMsg函數。printf函數是一個參數個數可變的函數,功能是按照用戶指定的格式,將數據按一定的格式輸出若干個任意類型的數據[2]。如果其他任務正在使用,則因臨界資源問題會堵塞[3]當前任務,因此不可用于中斷。中斷服務程序應盡快結束,否則將引起阻塞,有許多函數不可調用,如:printf(),malloc(),semTake()函數等,但可以使用semGive(),logMsg(),msgQSend(),bcopy()[4]。
與之對應的logMsg函數為任務式打印輸出函數、非實時性打印輸出,且固定為6個參數。VxWorks內核創建優先級為0的tLogTask打印任務,通過信號量同步消息,格式化調試信息后打印輸出,也同時打印輸出對應調用的任務名。
在實際應用時,直接使用printf, logMsg都存在不足。為了方便調試和開發,本文結合二者優點,提出一種串口調試打印輸出管理方法。此方法使用通用的宏定義,支持可變參數和非實時性打印輸出,支持多核多任務系統使用,在調試信息打印輸出時同時輸出當前時間、文件名稱和對應行數,并支持顏色控制和文件保存,支持通過調試信息編號和等級管理輸出內容。
1軟件設計
方法設計時使用標準C/C++開發,操作系統使用VxWorks5.5.1,開發環境使用Tornado,硬件通信方式使用SecureCRT[5],打印輸出使用logMsg,仿真環境使用VxSim。目標仿真器VxSim提供了與真實目標機一致的調試與仿真運行環境,用戶不需要目標機和操作系統配置即可在Tornado環境中迅速開發調試[6]。
定義此軟件名為log4m,初始化完成后,對調試信息編號和等級進行管理,如果允許輸出則先加鎖,組合當前時間、調試信息等級、調試信息內容、文件名稱和對應行數,并進行顏色控制和文件保存,調用logMsg打印輸出,解鎖后完成一次調試信息的有效輸出。軟件運行流程圖如圖1所示。

1.1實現方式
在軟件實現時,存在常用的4種實現方式。
方式1:使用臨時變量作為緩存空間,無需資源互斥鎖,但存在臨時變量被系統回收后打印亂碼的問題,且消耗任務堆棧[7]資源。
方式2:使用new堆棧的方式作為緩存空間,但反復new, delete,存在軟件設計內存溢出和越界的風險。
方式3:使用全局變量作為緩存空間,需要二進制信號量互斥鎖,同時為了防止打印亂碼需要使用數據輸出循環緩存方式。此方式可增加調試信息保存到文件中,因為在讀寫文件時同樣需要使用資源互斥鎖。二進制信號量能有效對共享資源的訪問進行互鎖,來實現互斥。
方式4:使用創建任務方式,將打印輸出放入緩存列表中,通過低優先級任務輸出,保證當前運行任務的實時性能,存在輸出打印實時性變差的問題。
結合實際使用情況,本文設計使用方式3,在開發階段犧牲了一定的實時性能,但無需反復申請堆棧,同時滿足調試打印的實時性。產品交付后,可通過輸出管理直接關閉打印輸出,減少因打印導致系統實時性能減弱的問題。
1.2打印輸出管理
在打印輸出管理時,使用調試信息編號ID管理和調試信息等級LEVEL管理。
調試信息編號ID管理,設計10個調試信息ID,其中ID為0是默認ID號,通過對外的接口控制相應的ID號是否輸出。調試信息ID的設計根據調試信息的類別進行區分,將一個大系統中的多種類多任務調試信息打印分開管理,防止打印信息過多導致實時性能減弱和延誤查找調試信息。
調試信息等級LEVEL管理,設計4個調試信息等級,從低到高分別為LOG4M_LEVEL_DEBUG、LOG4M_LEVEL_ WARNS,LOG4M_LEVEL_ERROR,LOG4M_LEVEL_FATAL,對應調試級、警告級、錯誤級和重大級。調試信息等級的設計根據調試信息重要性進行區分,將重要的調試信息通過顏色控制和調試信息等級提示分開管理,提高調試效率。
1.3調試信息內容組合
在調試信息內容組合時,使用宏定義和可變參數的設計,使用時將宏定義轉為格式轉換程序。在preLog4m函數中,實現調試信息編號ID管理和調試信息等級LEVEL管理;使用Log4m_Event信號量,進行資源互斥鎖,semTake加鎖,semGive解鎖;使用sprintf對可變參數進行格式轉換;在makeLog4m函數中,實現調試信息組合、顏色控制和文件保存,調試信息的組合內容,包括當前時間輸出、調試信息等級、調試信息內容、文件名稱和對應行數;通過VxWorks系統庫函數time,localtime[8]獲取當前時間,通過編譯器內置宏__FILE__獲取文件路徑,編譯器內置宏__LINE__獲取對應行數,使用sprintf,strcat,將當前時間、文件名稱和對應行數組合,其中文件名可使用strrchr(file,’/’)分割文件路徑獲取。


1.4顏色控制和文件保存
使用轉義字符“e”更改輸出格式,根據調試信息等級調用不同的輸出格式,實現顏色控制。常用的輸出格式有“\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標識準備輸出的調試信息,LOG4M_COLOR為常量數組保存輸出格式。
算法3:顏色控制程序

在具有可讀寫硬盤的環境下,可啟用文件保存功能,將調試信息保存到硬盤中。離線調試、恢復現場和問題回溯時,可快速定位錯誤位置和故障原因。
2實驗仿真
在VxSim中仿真模擬調試打印和輸出管理過程,因VxSim中不支持轉義字符“e”,仿真時不使用顏色控制。仿真程序在初始化InitLog4m完成后,使用測試程序仿真運行,程序如下:

在VxSim0中打印輸出“InitLog4m started!”,對應的源碼文件名為log4micro.cpp,在第149行時調用,初始化完成;在VxSim0中打印輸出“test=1,info=2”,對應的源碼文件名為log4micro.cpp,在第152調用,與測試要求一致。
仿真運行結果如圖2所示。
3結束語
本文討論了一種基于VxWorks串口調試信息組合打印和輸出管理方法,詳細介紹了軟件設計中的實現方式、打印輸出管理、調試信息內容組合、顏色控制和文件保存,并通過仿真模擬的方式實現了此方法。通過使用此方法,在VxWorks嵌入式實時操作系統軟件聯試階段和系統集成階段,能有效提高軟件設計和調試效率,具有一定工程意義。

參考文獻
[1]徐小權.基于VxWorks實時多任務的信號處理軟件設計[J].電腦知識與技術, 2013,9(17):4009-4012.
[2]張菊.淺析C語言printf函數的功能及使用[J].中國科技信息,2012(10):111-116.
[3]查榮明.Linux與VxWorks的任務調度研究及應用[J].信息與電腦(理論版),2018(11):17-20.
[4]籍林峰,曹偉. VxWorks操作系統中中斷的應用[J].雷達與對抗,2004(3):67-69.
[5]李進印.用SecureCRT軟件實現分散寬帶網絡管理研究[J].無線互聯科技,2013(12):10-11.
[6]許坤.VxWorks系統中任務狀態轉換的研究[J].艦船電子對抗,2004,27(2):28-31.
[7]朱劍鋒,繆萬勝,康介祥.基于堆棧回溯的異常處理[J].計算機工程與設計,2014,35(12):4176-4180.
[8]燚陳.VxWorks_for_x86系統中實時時鐘的應用[J].電子元器件應用,2010,12(3):61-64.