基于GAL的BDM調(diào)試系統(tǒng)設(shè)計(jì)
目前應(yīng)用Motorola微處理器開發(fā)嵌入式系統(tǒng)時(shí)基本上都是使用Motorola公司提供的開發(fā)系統(tǒng)或者CodeWarrior公司的開發(fā)系統(tǒng)等付費(fèi)昂貴的調(diào)試工具。最近由于Flash技術(shù)的發(fā)展,特別是一些CPU(如CPU12/16/32/32+,PowerPC5xx/8xx,ColdFire等)可以用JTAG口在背景模式下調(diào)試,故仿真器已可以省去。而且隨著BDM調(diào)試模式逐漸標(biāo)準(zhǔn)化,自制BDM調(diào)試工具變得越來(lái)越容易,特別是對(duì)于支持BDM調(diào)試模式的多種類型的CPU,自己設(shè)計(jì)的BDM調(diào)試系統(tǒng)只需少量的改動(dòng)即可移植使用,而不必重復(fù)購(gòu)買價(jià)格昂貴的調(diào)試開發(fā)系統(tǒng),這樣做可以節(jié)省大量的成本。
1 BDM調(diào)試模式介紹
Motorola微處理器的調(diào)試模塊針對(duì)不同場(chǎng)合的應(yīng)用分別提供了3種調(diào)試支持:實(shí)時(shí)跟蹤、BDM調(diào)試和實(shí)時(shí)調(diào)試。實(shí)時(shí)跟蹤是要求能夠跟蹤應(yīng)用程序的動(dòng)態(tài)執(zhí)行路徑,這是實(shí)時(shí)系統(tǒng)的基本要求;在BDM調(diào)試方式下,處理器被停機(jī),大量的命令可以被發(fā)送到處理器中訪問(wèn)內(nèi)存和寄存器,外部仿真系統(tǒng)使用一個(gè)三腳、串行的雙工通道與處理器通信;實(shí)時(shí)調(diào)試則可以不需要CPU停止運(yùn)行,調(diào)試中斷允許實(shí)時(shí)系統(tǒng)執(zhí)行一個(gè)惟一的服務(wù)例程,快速保存主要的寄存器和變量等上下文內(nèi)容,并使系統(tǒng)立即返回到正常操作,外部的開發(fā)系統(tǒng)能訪問(wèn)被保存的數(shù)據(jù)是因?yàn)橛布С痔幚砥骱虰DM初始化命令的一致性操作。
其中BDM調(diào)試模式為設(shè)計(jì)人員提供了一種低層次的調(diào)試手段,讓用戶能夠中斷CPU的運(yùn)行,單步調(diào)試程序,讀取CPU的各個(gè)寄存器的內(nèi)容,這些僅僅是通過(guò)向CPU發(fā)送幾個(gè)簡(jiǎn)單的命令就可以實(shí)現(xiàn),顯然,這樣使調(diào)試軟件的設(shè)計(jì)很簡(jiǎn)單,通常自己就可以編寫。硬件調(diào)試卡的設(shè)計(jì)也非常簡(jiǎn)單,關(guān)鍵是要滿足好通信時(shí)序關(guān)系和電平轉(zhuǎn)換要求。
這幾種調(diào)試方式都共用26腳的BDM調(diào)試引腳信號(hào),這些信號(hào)的定義如表1所示,BDM調(diào)試主要使用了DSCLK,DSI,DSO三種信號(hào)。
2 BDM調(diào)試系統(tǒng)的運(yùn)行條件及其系統(tǒng)組成
(1)系統(tǒng)運(yùn)行的限制條件
盡管許多BDM命令可以與處理器并行操作,但是要想安全可靠地使用BDM操作,最好的方法就是讓處理器停止運(yùn)行。但是停機(jī)操作對(duì)于那些要求實(shí)時(shí)響應(yīng)的應(yīng)用程序的調(diào)試顯然不理想。但是由于實(shí)時(shí)跟蹤和實(shí)時(shí)調(diào)試模塊與BDM調(diào)試模塊引腳共用,所以升級(jí)和擴(kuò)展BDM調(diào)試系統(tǒng),可以很容易支持實(shí)時(shí)應(yīng)用程序的調(diào)試。
(2)BDM調(diào)試系統(tǒng)組成
該系統(tǒng)主要由3個(gè)部分組成,如圖1所示。
BDM調(diào)試卡作用是完成從并口到BDM調(diào)試端口(信號(hào)定義如表1所示)的操作時(shí)序的轉(zhuǎn)換;BDM調(diào)試卡的驅(qū)動(dòng)程序則是完成開發(fā)系統(tǒng)與待開發(fā)的嵌入式系統(tǒng)的通信過(guò)程處理,如合成一定格式的數(shù)據(jù)包、解釋接收到的應(yīng)答數(shù)據(jù)或者微處理器的狀態(tài)數(shù)據(jù)等;BDM調(diào)試軟件則是功能軟件,完成讀寫指定位置的Flash或者SRAM數(shù)據(jù)、暫停、復(fù)位等功能。
值得注意的是,由于現(xiàn)在BDM調(diào)試模塊的標(biāo)準(zhǔn)化,調(diào)試卡和驅(qū)動(dòng)程序在不同型號(hào)的CPU上將具有通用性,只是BDM調(diào)試軟件需要根據(jù)各種CPU對(duì)應(yīng)的指令集來(lái)稍加修改即可復(fù)用。下面將以作者開發(fā)的一個(gè)針對(duì)Motorola公司的32位單片機(jī)MCF5272設(shè)計(jì)BDM調(diào)試系統(tǒng)的過(guò)程進(jìn)行論述。
3 CodeFire系列處理器MCF5272的BDM調(diào)試系統(tǒng)的設(shè)計(jì)
3.1 BDM調(diào)試卡設(shè)計(jì)
BDM接口的串行操作時(shí)序分析如圖2所示。從圖2中可以看出,在調(diào)試模塊的串行狀態(tài)機(jī)中所有的事件是基于處理器時(shí)鐘(PSTCLK)的上升沿的。DSCLK的頻率是PSTCLK的1/5,并且DSCLK的上升沿相對(duì)于PSTCLK的上升沿有一定的延時(shí)。這里的 DSCLK的作用類似于周期性的使能信號(hào)。每一次串行數(shù)據(jù)的傳輸可分為4個(gè)階段:C1,C2,C3和C4。在DSCLK的高電平期間,數(shù)據(jù)從DSI輸入,經(jīng)過(guò)2個(gè)PSTCLK周期的同步(C1和C2)而被采樣,然后在DSCLK的低電平期間PSTCLK的第1個(gè)上升沿處(C3)來(lái)臨時(shí)BDM狀態(tài)機(jī)改變狀態(tài),隨后在第2個(gè)PSTCLK上升沿(C4),DSI準(zhǔn)備傳送新的數(shù)據(jù),DSO上則輸出原來(lái)數(shù)據(jù)輸入相對(duì)應(yīng)的應(yīng)答數(shù)據(jù)。BDM狀態(tài)機(jī)在DSI上數(shù)據(jù)采樣檢測(cè)到的時(shí)候改變狀態(tài),當(dāng)所有的數(shù)據(jù)傳輸完畢,BDM狀態(tài)機(jī)的狀態(tài)也就不會(huì)有什么改變。
根據(jù)BDM端口的信號(hào)定義,不難看出這些信號(hào)都是單向的。其中要注意的是:PSTCLK是調(diào)試模塊從處理器中獲取的,而DSCLK則是外部的開發(fā)系統(tǒng)產(chǎn)生的。要實(shí)現(xiàn)從并口到BDM口的時(shí)序操作轉(zhuǎn)換,最簡(jiǎn)單的方式是使并口工作在SPP端口模式下的4位組模式,在該模式下每次通過(guò)狀態(tài)端口的4個(gè)狀態(tài)位反向傳送半個(gè)字節(jié),兩次傳輸完成向PC機(jī)傳送一個(gè)字節(jié)數(shù)據(jù)[1]。他的操作時(shí)序如圖3所示。
由于所有的信號(hào)都是單向的,時(shí)序和邏輯比較簡(jiǎn)單,因此,采用GAL器件實(shí)現(xiàn)并口操作時(shí)序與BDM操作時(shí)序的轉(zhuǎn)換。GAL要實(shí)現(xiàn)的功能主要是數(shù)據(jù)的串并和并串轉(zhuǎn)換。
GAL器件與并口接口的信號(hào)有:
輸入信號(hào):D0~D7,C1(主機(jī)忙狀態(tài)線),DSCLK(提供串行通信時(shí)鐘信號(hào))。
輸出信號(hào):S3,S4,S5,S7(這4個(gè)信號(hào)做數(shù)據(jù)反向輸出),S6(給PC機(jī)提供一個(gè)中斷信號(hào))。
他與BDM端口接口的信號(hào)有:
輸入信號(hào):PSTCLK,DSO。
輸出信號(hào):DSI?!?br />
故需配置12個(gè)輸入端和6個(gè)輸出端,故選用74GAL16V8的器件即可滿足要求[2]?,F(xiàn)在GAL器件要實(shí)現(xiàn)的即是將與并口接口的輸入信號(hào)(D0~D7,C1,DSCLK)轉(zhuǎn)換成與BDM接口的輸出信號(hào)(DSI),同理,也要將與BDM端口接口的輸入信號(hào)(PSTCLK,DSO)轉(zhuǎn)換成與并口接口的輸出信號(hào)(S3,S4,S5,S6,S7),實(shí)現(xiàn)了這2個(gè)轉(zhuǎn)換,然后對(duì)GAL編程,設(shè)計(jì)PCB版圖,可以很快做出BDM調(diào)試卡。
3.2 BDM驅(qū)動(dòng)程序的設(shè)計(jì)
BDM調(diào)試卡已經(jīng)實(shí)現(xiàn)了并口到BDM口的時(shí)序操作轉(zhuǎn)換,按照一定的數(shù)據(jù)格式傳送和接收數(shù)據(jù)則是BDM調(diào)試卡的驅(qū)動(dòng)程序要完成的工作,驅(qū)動(dòng)程序?qū)?shù)據(jù)的處理分為2層:底層完成基本的字節(jié)數(shù)據(jù)的收發(fā)(恢復(fù)和拆分);上層則完成數(shù)據(jù)包的收發(fā)。底層的數(shù)據(jù)收發(fā)原理在調(diào)試卡的設(shè)計(jì)過(guò)程中已經(jīng)做了詳細(xì)的介紹,以下主要介紹數(shù)據(jù)包的收發(fā)處理程序設(shè)計(jì)應(yīng)注意的事項(xiàng)。
從BDM操作時(shí)序圖中可以看出,串行通道數(shù)據(jù)傳輸速度從直流到PSTCLK頻率的1/5頻率之間,該通道使用雙工模式,數(shù)據(jù)可在主控設(shè)備和從控設(shè)備之間同時(shí)發(fā)送和接收,每次傳送的數(shù)據(jù)塊由一個(gè)17 b的數(shù)據(jù)包組成,該數(shù)據(jù)包由一個(gè)狀態(tài)/控制位和一個(gè)16 b數(shù)據(jù)字組成。數(shù)據(jù)格式如下所示:
發(fā)送數(shù)據(jù)時(shí)最高位為控制標(biāo)志,該位保留,在開發(fā)系統(tǒng)向CPU發(fā)出命令和數(shù)據(jù)時(shí),該位應(yīng)該被清除。
接收數(shù)據(jù)時(shí)最高位為狀態(tài)標(biāo)志位,指示從CPU返回的消息類型。他與數(shù)據(jù)域及數(shù)據(jù)表示的消息含義之間的關(guān)系為:
顯然,由于每次只能傳送一個(gè)字節(jié),故發(fā)送一個(gè)數(shù)據(jù)包需要執(zhí)行3次傳送操作。應(yīng)注意由于并口工作在4位組模式,每次只能接收4 b數(shù)據(jù)[1],而并口操作是以字節(jié)為單位進(jìn)行的,因此,實(shí)際上接收一個(gè)數(shù)據(jù)包最少應(yīng)該執(zhí)行6次接收操作,而不是5次。也即是說(shuō)最后剩下一位數(shù)據(jù)也要當(dāng)一個(gè)字節(jié)傳送,這在驅(qū)動(dòng)程序的設(shè)計(jì)當(dāng)中很容易弄錯(cuò)。
BDM調(diào)試模塊為外部開發(fā)系統(tǒng)提供了12個(gè)基本類型的命令(用助記符表示):RAREG/RDREG(讀A/D寄存器),WAREG/WDREG(寫A/D寄存器),READ(從存儲(chǔ)器讀數(shù)據(jù)),WRITE(向存儲(chǔ)器寫數(shù)據(jù)),DUMP(與READ命令結(jié)合使用轉(zhuǎn)儲(chǔ)數(shù)據(jù)塊),F(xiàn)ILL(與WRITE命令結(jié)合使用填充數(shù)據(jù)塊),GO(繼續(xù)執(zhí)行程序),NOP(不做任何操作,可以被用做一個(gè)空指令),RCREG(讀系統(tǒng)控制寄存器),WCREG(向系統(tǒng)控制寄存器寫入數(shù)據(jù)),RDMREG(讀調(diào)試模塊寄存器),WDMREG(寫向調(diào)試模塊寄存器寫入數(shù)據(jù));各種命令和他對(duì)應(yīng)的應(yīng)答數(shù)據(jù)的格式可以從MCF5272芯片資料上查到。上層驅(qū)動(dòng)程序最終的任務(wù)就是實(shí)現(xiàn)這12種基本命令數(shù)據(jù)和應(yīng)答數(shù)據(jù)的收發(fā),并為調(diào)試軟件提供相應(yīng)的函數(shù)調(diào)用接口,具體的驅(qū)動(dòng)程序設(shè)計(jì)比較簡(jiǎn)單,關(guān)鍵是要注意對(duì)從調(diào)試模塊返回的狀態(tài)數(shù)據(jù)進(jìn)行出錯(cuò)處理。特別是應(yīng)該區(qū)別CPU還沒準(zhǔn)備好和總線操作被中止2種消息。前者出現(xiàn)的比較多,一般是在CPU正在執(zhí)行一個(gè)任務(wù),不能及時(shí)響應(yīng)BDM命令時(shí)返回的消息,而后者則往往是CPU執(zhí)行了2條有沖突的指令(也即是非法訪問(wèn)資源)。這個(gè)在驅(qū)動(dòng)程序中看不出有很大的區(qū)別,但是在調(diào)試應(yīng)用程序時(shí)經(jīng)常報(bào)告“BUSError”信息。
3.3 BDM調(diào)試軟件的設(shè)計(jì)
該軟件應(yīng)該具有如下基本的功能:系統(tǒng)初始化,重啟系統(tǒng),檢查CPU外圍期間工作是否正常,讀寫Flash中的數(shù)據(jù),讀寫SRAM中的數(shù)據(jù),單步執(zhí)行程序。
調(diào)試軟件主要是調(diào)用驅(qū)動(dòng)程序?qū)崿F(xiàn)的12種BDM調(diào)試命令接口函數(shù)來(lái)實(shí)現(xiàn)各種功能的。其中需要傳遞參數(shù)給驅(qū)動(dòng)程序的有:
①檢查外部設(shè)備接口是否工作正常:如RS232串口、USB口、并口、網(wǎng)口等。這類操作需要接口地址和中斷號(hào)等參數(shù),并且需要返回操作結(jié)果。
②讀寫SRAM和Flash中的數(shù)據(jù):這些操作需要提供存儲(chǔ)器的地址范圍。
調(diào)試軟件的設(shè)計(jì)因開發(fā)系統(tǒng)的操作系統(tǒng)不同,在實(shí)現(xiàn)上有比較大的區(qū)別,但處理過(guò)程基本相同,因此,軟件的設(shè)計(jì)也比較簡(jiǎn)單,沒有必要贅述。
3.4 系統(tǒng)運(yùn)行及其測(cè)試
應(yīng)用MCF5272做嵌入式系統(tǒng)開發(fā)時(shí),開發(fā)平臺(tái)的操作系統(tǒng)是RedHatLinux,因此,驅(qū)動(dòng)程序和調(diào)試軟件都是針對(duì)Linux設(shè)計(jì)的。驅(qū)動(dòng)程序?qū)DM調(diào)試卡作為一個(gè)字符設(shè)備看待,BDM卡的初始化是在/usr/src/linux/driverschar/mem.c中添加BDM卡初始化代碼[3],該設(shè)備的基本入口點(diǎn)在驅(qū)動(dòng)程序的file_operation結(jié)構(gòu)中,對(duì)BDM卡的操作命令均在此實(shí)現(xiàn),具體代碼不再詳述。
調(diào)試系統(tǒng)做整體測(cè)試時(shí),首先要在Linux下創(chuàng)建一個(gè)字符型的BDM設(shè)備,然后執(zhí)行insmod命令將驅(qū)動(dòng)程序模塊打入操作系統(tǒng)內(nèi)核中[3],在成功地創(chuàng)建了BDM設(shè)備文件和安裝好BDM調(diào)試卡的驅(qū)動(dòng)程序之后,就可以調(diào)試和執(zhí)行該調(diào)試軟件了。
4 結(jié)語(yǔ)
BDM調(diào)試系統(tǒng)具有成本低、操作方便、移植簡(jiǎn)單等特點(diǎn)。在Linux環(huán)境下針對(duì)MCF5272成功開發(fā)了BDM調(diào)試系統(tǒng)后,又先后將該系統(tǒng)軟件稍加改動(dòng),就輕易地移植到與MCF5272同屬ColdFire系列的MCF5249和Power PC系列的MPC555等CPU上,并且在Window下重新編寫了驅(qū)動(dòng)程序和調(diào)試軟件,使用圖形界面操作,基本上達(dá)到了CodeWarrior相應(yīng)軟件的功能,為產(chǎn)品的快速低成本開發(fā)做出了貢獻(xiàn)。
評(píng)論