引言:
嵌入式處理器是一個復雜的高技術系統,要在短時間內掌握并開發出所有功能是很不容易的,而市場競爭則要求產品能夠快速上市,這一矛盾要求嵌入式處理器能夠有容易掌握和使用的開發工具平臺。提高用戶和程序員的時間-投入回報率。
在PDA,STB,DVD等消費類電子產品以及GPS,航空,勘探,測量等軍方產品中都得到了廣泛應用的ARM處理器具備完善的開發工具平臺,包括ARM公司和第三方提供的軟件開發工具包、軟件模擬器、目標板監控器、基于JTAG接口的在線實時仿真器以及針對不同微控制器(以ARM為內核)的評估板和開發板,給用戶提供了不同的選擇。
嵌入式應用程序的調試貫穿整個系統的開發過程,它提供糾正軟硬件錯誤改進系統性能的依據,有效使用調試工具能夠提高效率,縮短開發周期,增強產品的市場競爭力。
本文為基于ARM7的嵌入式系統開發過程中的調試難點提供了解決方案。
1.ARM公司調試工具介紹
ARM調試工具包括Angel,軟件模擬器ARMulator,在線實時仿真器Multi_ICE 或EmbeddedICE。
(1)Angel系統包括在主機上運行的調試器和在目標機上運行的Monitor, 通過串口通信,具有基本調試、通信、任務管理、異常行為處理等功能,支持C庫。缺點是需要占用目標機系統資源,如串口,ROM,RAM等,優點是成本低。
(2)ARMulator獨立于處理器硬件,是一種有效的源程序檢驗和測試工具。但值得注意的是,模擬器畢竟是以一種處理器模擬另一種處理器的運行,在指令執行時間、中斷響應、定時器等方面很可能與實際處理器有相當的差別。另外它無法和ICE(在線實時仿真器)一樣,仿真嵌入式系統在應用系統中的實際執行情況。
(3)Multi_ICE 或EmbeddedICE通過JTAG端口與目標系統聯接,價格昂貴,但使用方法簡單,調試快捷方便,無需占用系統資源。它可以設置實時地址和數據獨立的斷點、單步執行、對ARM內核完全存取和控制、對ASIC系統完全存取、完全存儲器存取(讀/寫)、完全I/O系統存取(讀/寫)。EmbeddedICE 和Multi-ICE 還可以使嵌入式微處理器存取主機系統的外設,如顯示器,鍵盤輸入,和磁盤驅動存儲器。
串口或并口 JTAG端口
2.調試過程
調試應該解決三個問題: 應用程序在許多極小的用戶事件中是否表現出預期行為?應用程序執行是否可靠?應用程序是否滿足了設計要求?所以調試分三個階段:快速定型階段,驗證階段和有效性確認階段。
(1)快速定型使程序員熟悉應用程序行為,確定在許多極小的用戶事件中程序工作是否符合預想。
(2)驗證階段仿真器應檢測到的如下問題:算法錯誤(如指針溢出,除0)、死源代碼、隊列溢出、死鎖、活鎖。
注:當一些事件圍繞一個封閉的對象循環觸發了一個無限消息流,如果沒有其他事件中止這個循環的消息流,消息流將會變得不確定,這種狀態叫做活鎖;铈i雖然浪費系統資源,但可能不會妨礙系統繼續工作,所以當發生活鎖時,有可能造成設計正確運轉的假象。
(3)有效性確認階段是檢驗應用程序表現出的行為是否總是符合預想(有效性),是否從不產生違反規則的行為(安全性),這對于實時系統尤其重要。
3.調試難點分析
3.1使用軟件模擬器模擬外部設備
ARMulator—ARM公司提供的軟件模擬器,是一個仿真各種ARM內核結構和指令集的程序。它與ARM調試器聯接,提供了在PC主機系統和支持的工作站上開發ARM軟件的環境,該環境是硬件獨立的。下面以Armulator為例說明使用軟件模擬器模擬外部設備的方法。ARMulator包括4個組成部分:
(1)ARM處理器內核模型:處理ARM內核與調試器之間的所有通信,不允許用戶修改。
(2)存儲器接口:在ARM模型與存儲器模型或存儲器管理單元模型之間傳遞數據。
(3)協處理器接口:處理ARM內核與協處理器之間的通信。
(4)操作系統接口:提供程序運行環境。
ARMulator核心能夠表現處理器的內核和高速緩存,但是在C源代碼中描述的存儲器系統可以由用戶設定為任意目標系統模型。ARMulator核心與存儲器模型之間的接口體現了ARM內核的引腳接口,包括為該存儲器模型在nFIQ和nIRQ引腳上產生中斷的能力。
用戶通過修改或重寫缺省的模型,幾乎可以模擬所有基于ARM處理器的系統,用來調試硬件相關代碼。當模擬外設時,用戶需要ARMulator 能夠仿真外部事件的發生,為此ARMulator提供了兩個例程輔助事件調度:ARM_Time用來返回從系統復位到當前的時間片數目;ARMul_ScheduleEvevt允許在一定時間后調用某個程序。
下面通過一個仿真并行端口的實例來說明具體方法,要求該并行口產生一個中斷,然后從一個文本文件中讀出一個字符放入存儲器中。實現步驟如下:
(1)建立新的存儲器模型。首先拷貝一份ARMulator的存儲器模型,作相應修改,創建parallel.c文件,添加兩個變量:中斷產生標志和指向要訪問的文本文件的指針,添加一個新程序parallel_set_irq用來觸發中斷并設置中斷產生標志為1。
(2)修改models.h和makefile。在models.h中添加MEMORY(Parallel)作為新的存儲器模型的根入口。編譯parallel.c產生目標文件添加到makefile中的目標文件列表中。
(3)添加新模型到ARMulator,并在PC機上使用微軟的Visual C++重建“ARMULATE.DLL”,產生新的ARMulator。
(4)修改armul.cnf,選擇該存儲器模型。
當應用程序訪問一個特定存儲器地址(如0x123450)時,ARMul_ScheduleEvent函數被激活。ARMul_ScheduleEvent函數在20000個時間片后調用parallel_set_irq,從而產生一個中斷服務請求,系統進入中斷服務程序(由應用程序設置中斷向量安裝ISR),中斷服務程序從另一個預定義的位置(如 0x123460 )讀出一個字符,并清除并行端口的中斷源,返回應用程序。
這種方法與用戶使用的ARM調試器沒有關系,因為它是軟件模擬器的一部分,不屬于調試器。這是一項非常有用的技術,可以擴展到用C語言為整個系統建立模型。例如,它可能模擬一個PDA系統,包括鍵盤,定時器,并行接口,液晶顯示屏等等。
3.2在源代碼級調試ROM中的目標文件
由于當前嵌入式應用程序復雜性的增加,代碼容量越來越大,國內嵌入式系統中代碼達到1M字節的并不少見。在開發嵌入式應用系統時,通常是將程序代碼裝載到RAM中運行調試,這將占用大量內存空間,提高系統成本。
EmbeddedICE或Multi-ICE,與ARM調試器通過JTAG端口聯接到ARM內核的EmbeddedICE邏輯電路上,使用戶能夠調試固化在ROM中的代碼。為了使用源代碼級符號調試信息調試ROM代碼(設置斷點,單步運行等),用戶需要生成兩個文件:
(1)代碼的二進制文件,用于固化在EPROM里或者下載到用戶系統上的FLASH里。該二進制文件不包含任何調試信息。
(2)相同代碼產生的帶有附加調試信息的文件,通過選擇窗口調試器菜單的“File-〉Load symbol only”或者符號調試器的“readsyms”指令裝載到調試器中。
使用仿真器調試固化在ROM里的程序時,要注意兩個問題:
(1)首先要將調試器內部設置的$vector_catch 與$semihosting_enabled設為零,禁止向量捕獲和半主機軟件中斷。因為仿真器能夠控制這些會俘獲異常行為的區域(0x00-0x1c,中斷向量表地址)。俘獲異常行為是通過用一個無用的二進制位值0xDEEEDEEE覆蓋中斷向量,調試器存儲中斷向量的原始值,顯示給用戶。只要該二進制值被提取并到達管道的執行階段,調試器就會調用自身的SWI(軟件中斷)服務程序處理異常行為,然后通知用戶,這樣用戶將無法調試自己的中斷服務程序。
(2) 對于ARM7xDI內核,用戶最多只能設置兩個斷點,這是因為EmbeddedICE宏單元
只有兩個實時觀測單元,這兩個單元可以設置為斷點或觀察點。例如:兩個ROM
中的硬件斷點,或一個ROM中的硬件斷點與多個RAM中的軟件斷點,而軟件斷
點只能設在RAM中。
結語:
軟件模擬器和目標Monitor提供了一種經濟的調試手段,對于很多設計來說已經足夠。但是也有很多場合,需要利用仿真器來找到程序錯誤。無論在哪一種場合,仿真器都能夠減少調試時間、簡化系統集成、增加可靠性、優化測試步驟,從而使其物有所值。更常見的情況是工程師在項目的不同階段同時使用軟件模擬器和仿真器,特別是在大的開發項目中。
|