利用嵌入式仿真器實現(xiàn)調(diào)試功能
引言
本文介紹了一種先進的片上嵌入式仿真系統(tǒng)功能及其應(yīng)用實例。由于該系統(tǒng)集成在MCU內(nèi)部,包括復(fù)雜斷點設(shè)置、觸發(fā)序列發(fā)生器及處理器狀態(tài)存儲器等多種功能模塊,使工程師在設(shè)計電路中實現(xiàn)調(diào)試功能。
調(diào)試方法對比
調(diào)試是嵌入式產(chǎn)品開發(fā)人員的主要工作之一。隨著電路設(shè)計趨于復(fù)雜化,調(diào)試過程也變得愈加困難和耗時。仿真器的不足之處在于不能準確再現(xiàn)實際應(yīng)用時的工作狀態(tài),許多仿真器僅僅仿真了CPU內(nèi)核及少數(shù)外設(shè)。不過,仿真器也有諸多優(yōu)點,可提供代碼覆蓋、配置及條件斷點等功能。嵌入式應(yīng)用通常涉及多個軟硬件交互過程。由于MCU工作在不同環(huán)境下,實時事件有時由外接電路產(chǎn)生,有時由自身集成的ADC或者計時器產(chǎn)生。有時,MCU還與DSP配合組成更加復(fù)雜的系統(tǒng)。在只有CPU內(nèi)核的仿真器環(huán)境內(nèi)調(diào)試、校驗IC間通信軟件并不容易。
另一種常用方法是使用電路內(nèi)仿真器(ICE),它使用適配器替代目標電路板MCU,并連接了用于模擬MCU活動的復(fù)雜電路,同時提供調(diào)試功能。ICE吸收了仿真器在真實環(huán)境實時運行軟件的優(yōu)點,但其價格昂貴、體積較大且無法提供100%精確度,尤其是涉及到ADC、DAC、比較器、振蕩器及電壓參考電路等模擬外設(shè)時。
通過在MCU中增加具備調(diào)試功能的嵌入式仿真器克服了上述缺點。嵌入式仿真過程中,調(diào)試用主機通過JTAG等串行接口直接連接到片上仿真邏輯電路。應(yīng)用程序代碼在MCU的運行狀況與沒有連接調(diào)試接口時相同。由于軟件是在實際工作環(huán)境下調(diào)試,所以在軟件開發(fā)完成后無需與硬件再進行調(diào)試。
某些8位和16位微型控制器現(xiàn)在也具備了嵌入式調(diào)試功能,但大多數(shù)還只能提供存儲器存取、CPU執(zhí)行控制及硬件斷點設(shè)置等基本功能,與成熟的ICE相比還有較大的提高空間。最新16位MCU提供的嵌入式仿真模塊增加了更多新功能,從而縮小了與ICE的差距,下面將介紹部分新型MCU高級調(diào)試功能及應(yīng)用實例。
EEM系統(tǒng)構(gòu)成
TI MSP430 MCU中集成的增強型嵌入式仿真模塊(EEM)包含以下功能塊:基本觸發(fā)器、觸發(fā)器組合邏輯發(fā)生器、觸發(fā)器序列發(fā)生器、觸發(fā)器動作、狀態(tài)存儲及時鐘控制單元(如圖1所示)。
要使用EEM進行調(diào)試,則至少要配置八個可用基本觸發(fā)器輸入中的一個。一般情況下,只能對CPU地址總線(MAB)指定的內(nèi)存位置停止執(zhí)行程序進行觸發(fā)器設(shè)置。但現(xiàn)在MCU中的觸發(fā)器能夠支持非常復(fù)雜的設(shè)置。除了地址總線以外,所有觸發(fā)器還可通過配置來監(jiān)控CPU數(shù)據(jù)總線(MDB)、內(nèi)部CPU寄存器及部分處理器控制信號。此外,如果需要則可以在地址及數(shù)據(jù)總線觸發(fā)器加入位掩碼以隔離需要的值,常數(shù)及“等于”、“不等于”、“小于”和“大于”等比較選項可以使用。以上這些功能組合起來即可實現(xiàn)復(fù)雜的斷點設(shè)置。
通過將可用基本觸發(fā)器輸出的邏輯功能進行組合形成了復(fù)雜觸發(fā)器。用戶可以自行定義本單元的觸發(fā)器輸出,即基本觸發(fā)器輸入的組合邏輯。例如,組合地址、數(shù)據(jù)總線觸發(fā)器后即可監(jiān)控存儲器某一位置是否發(fā)生了特定值的讀/寫操作。這個復(fù)雜的觸發(fā)器事件可以用作直接停止執(zhí)行某個程序或產(chǎn)生一個狀態(tài)存儲事件。同時,觸發(fā)器序列發(fā)生器(具有四種狀態(tài)的嵌入式狀態(tài)機)可以對觸發(fā)器時間進行設(shè)定。觸發(fā)器所建立的可編程轉(zhuǎn)換條件引起在幾種狀態(tài)間的動作轉(zhuǎn)換。當序列發(fā)生器到達最后事件狀態(tài)時,MCU可配置為停止程序運行和/或產(chǎn)生一個狀態(tài)存儲事件。
狀態(tài)存儲單元可以使用任何復(fù)雜觸發(fā)器,該存儲單元是一個環(huán)形緩沖區(qū),最多含有8條記錄,每條記錄分別是16位地址總線、16位數(shù)據(jù)總線以及CPU部分重要控制信號在觸發(fā)發(fā)生時的快照。可以將其看作能夠采集狀態(tài)信息而又不會影響MCU軟件實時運行的簡單跟蹤緩沖區(qū)。當基本觸發(fā)事件發(fā)生時或在每個CPU時鐘周期,可以用觸發(fā)器組合邏輯或觸發(fā)器序列輸出捕捉系統(tǒng)快照。
現(xiàn)在某些MCU的EEM附帶了時鐘控制單元,三個可用內(nèi)部時鐘樹信號均可驅(qū)動ADC、LCD驅(qū)動器、計時器及串行通信模塊等不同外設(shè)。停止程序執(zhí)行時,時鐘控制單元能對每個模塊進行配置而使外設(shè)繼續(xù)得到時鐘信號。當處理器在調(diào)試過程中停止時,時鐘將停止,如果仿真模塊簡單停止所有時鐘(如到達斷點時),則可能發(fā)生通信字符丟失或A/D轉(zhuǎn)換結(jié)果有誤等不必要的副作用。另一種實現(xiàn)方法是仿真停止時繼續(xù)向外設(shè)提供時鐘,但是該解決方案可能引起計時器等模塊永久設(shè)置中斷標志(即使是在CPU停止時),使源代碼進入單步運行。使用時鐘控制單元,開發(fā)人員可以有選擇地向應(yīng)用模塊發(fā)送時鐘信號。
利用EEM建立復(fù)雜斷點
EEM具有設(shè)定程序斷點的能力,如果能夠為斷點增加一個條件則在眾多情況下可簡化調(diào)試環(huán)境。例如,用C語言編寫的嵌入式應(yīng)用程序?qū)崿F(xiàn)復(fù)雜的狀態(tài)機。當前狀態(tài)存儲為全局變量,可在整個源代碼的不同位置得到更新。應(yīng)用時,全局變量在錯誤條件下進入了狀態(tài)‘3’。如果要找出引起意外轉(zhuǎn)換的源代碼段,需要監(jiān)控狀態(tài)機變量‘StateVar’,當該值為‘3’時,利用EEM模塊觸發(fā)器即可停止程序運行。該復(fù)雜斷點是兩個基本EEM觸發(fā)器的邏輯與組合。圖2為如何實現(xiàn)復(fù)雜觸發(fā)器的簡化示意圖。