對于開發嵌入式系統,軟件調試一直是一個難度大、直接影響產品質量的重要環節。由于嵌入式系統本身不具備調試環境,又有較高的實時性要求,所以必須要有外部調試工具的協助工作。ICE仿真器作為嵌入式調試的核心設備,可以幫助用戶實現斷點調試、單步運行、寄存器與內存讀寫、閃存燒寫等功能。
嵌入式系統通??梢苑譃橛布⒂布寗印崟r操作系統以及上層應用等幾部分。其中實時操作系統是整個系統的管理者,起著承上啟下,合理分配系統資源的作用。操作系統的開發、調試是系統開發的重要環節。如果操作系統不能穩定運行,整個系統就無法正常工作;反之,操作系統正常工作了,再進行上層應用開發就會變得快速、穩定、可靠。同時,穩定的系統也有利于進行各種相關測試。
圖1 ICE仿真器工作示意圖
日本橫河數字計算機公司出品的AdvicePro仿真器產品,通過對實時操作系統TCB(Task Control Block)的解析,非常直觀地顯示操作系統的資源信息以及各進程的狀態,為客戶提供穩定的系統調試平臺。以橫河數字計算機公司為大唐移動提供的實時操作系統ThreadX調試方案為例,ThreadX是一種以占用空間小、可靠性高、實時性高、完全源代碼透明而聞名的實時操作系統,完全與Green Hills Software的MULTI IDE集成,并包含可識別內核的調試(kernel awareness debugging)、工程項目管理、源代碼瀏覽、事件跟蹤分析、代碼分析,用于系統及應用項目監控。作為多任務系統,在系統運行時,會產生多個線程互相通信,交替工作。ThreadX的各個線程的信息都保存在TCB結構體中,ThreadX的TCB結構體的一部分如下:
typedef struct TX_THREAD_STRUCT
{
ULONG tx_thread_id; /* Control block ID */
ULONG tx_run_count; /* Thread's run counter */
VOID_PTR tx_stack_ptr; /* Thread's stack pointer */
VOID_PTR tx_stack_start; /* Stack starting address */
VOID_PTR tx_stack_end; /* Stack ending address */
ULONG tx_stack_size; /* Stack size */
ULONG tx_time_slice; /* Current time-slice */
ULONG tx_new_time_slice; /* New time-slice */
CHAR_PTR tx_thread_name; /* Pointer to thread's name */
UINT tx_priority; /* Priority of thread (0-31)*/
UINT tx_state; /* Thread's execution state */
UINT tx_delayed_suspend; /* Delayed suspend flag */
UINT tx_suspending; /* Thread suspending flag */
UINT tx_preempt_threshold; /* Preemption threshold */
ULONG tx_priority_bit; /* Priority ID bit */
}
線程的信息保存在TCB結構體中,因此只要能夠對TCB進行解析,就可以獲取各線程的相關信息,跟蹤系統狀態。例如,在圖2所示的系統中,通過解析,我們可以知道,該系統中共有9個線程被啟動,同時工作。其中線程System_Timer_Thread擁有的優先級,狀態為SUSPENDED。
圖2 多線程狀態表示界面
在多任務系統中,每個進程都擁有獨立使用的堆棧,用于保存進程在函數調用、中斷處理時產生的臨時信息、數據。適當地為堆棧分配空間,是維護系統穩定,節約系統資源的一個核心環節。因為,如果為堆棧分配的空間過小,當需要保存的信息較多時,堆棧就可能會溢出,從而導致系統崩潰;反之,如果給堆棧分配的空間過大,就會浪費寶貴的系統資源。AdvicePro的系統堆棧分析功能,可以直觀地幫助用戶了解到系統堆棧的狀態,控制余量,在保證系統穩定的前提下,節省系統資源,提高系統效率。
通過線程堆棧資源表示界面(圖3),可以清楚地觀察到各線程堆棧的當前狀態。例如為線程System_Timer_Thread分配的堆??臻g是0x801f5a3~0x801f1a4,大小為400個雙字,當前堆棧指針指向0x801f514,已使用空間占全部空間的14%。這樣就可以非常直觀地了解到堆棧的使用狀況,有效預防由于堆棧溢出而引起的系統崩潰。
圖3 線程堆棧資源表示界面
AdvicePro的實時操作系統調試功能是通過TCL腳本語言來實現的。TCL是一種很通用的腳本語言,它幾乎在所有的平臺上都可以解釋運行,功能強大,是Tool Command Language的縮寫,主要適用于發布命令給一些交互程序,如文本編輯器、調試器和shell。它有簡單的語法和很強可擴充性,TCL可以創建新的過程以增強其內建命令的執行能力。AdvicePro的調試軟件MicroView-Plus中內嵌了TCL解釋器,用戶可以根據需要自行定制界面,增加了產品的靈活性。
以上,我們只是以ThreadX為例,簡單介紹了AdvicePro仿真器在嵌入式實時操作系統調試中的應用。作為日本成熟的嵌入式測試產品,AdvicePro在Symbian、Linux、Nucleus等操作系統上也有相當豐富的實際經驗。