亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

基于目標(biāo)機(jī)上的ejtag部件的交叉調(diào)試器實(shí)現(xiàn)方法

文檔序號:6386173閱讀:259來源:國知局
專利名稱:基于目標(biāo)機(jī)上的ejtag部件的交叉調(diào)試器實(shí)現(xiàn)方法
技術(shù)領(lǐng)域
基于目標(biāo)機(jī)上的EJTAG部件的交叉調(diào)試器實(shí)現(xiàn)方法屬于計(jì)算機(jī)系統(tǒng)調(diào)試工具領(lǐng)域。
背景技術(shù)
在開發(fā)和生產(chǎn)新的電子、電腦產(chǎn)品時(shí),經(jīng)常會面對以下幾個(gè)方面的問題(1)電路的器件布局日益復(fù)雜;(2)元器件小型化、復(fù)雜的封裝、密集的管腳;和(3)電路板小型化、使用表面焊接技術(shù)等。這給產(chǎn)品的線路測試、故障檢查以及排除帶來很大的麻煩。用傳統(tǒng)的線路檢測設(shè)備已經(jīng)很難,甚至無法使用。解決這個(gè)問題的一個(gè)方法是使用邊界掃描技術(shù)即BST(Boundary Scan Technology)。該技術(shù)由IEEE技術(shù)委員會的聯(lián)接測試行動(dòng)小組(JTAG,JointTest Action Group)制定(工業(yè)標(biāo)準(zhǔn)IEEE1149.1),可用于測試電路板上的(1)各器件本身的邏輯是否正確;(2)各器件之間的連接情況;和(3)組合起來的器件是否完成了預(yù)定的功能等。
擴(kuò)展JTAG即EJTAG(Enhanced JTAG)規(guī)范是在JTAG規(guī)范基礎(chǔ)上進(jìn)行的擴(kuò)展。EJTAG的操作對象是MIPS公司的MIPS微處理器或是包含MIPS核的片上系統(tǒng)即SOC(System-on-a-Chip)芯片組件。EJTAG提供了應(yīng)用程序和核心代碼軟件調(diào)試的應(yīng)用接口。它具有以下一些功能1)設(shè)置硬件斷點(diǎn)(Hardware Breakpoint);2)單步執(zhí)行(Single Step Excution);3)支持測試訪問端口即TAP(Test Access Port)接口EJTAG使用TAP接口將測試數(shù)據(jù)傳入或者傳出CPU核心。除了支持標(biāo)準(zhǔn)的JTAG指令以外,EJTAG還具有自己新定義的指令。
4)支持軟件斷點(diǎn)指令SDBBP(Software Debug Breakpoint)。
基于EJTAG的調(diào)試器可用于調(diào)試監(jiān)控程序、操作系統(tǒng),并且可以通過調(diào)試診斷程序,分析確定CPU及主板的故障,是CPU研制工作順利進(jìn)行的重要工具。我們提出了一種利用軟件有效控制和使用目標(biāo)機(jī)上的EJTAG部件的方案,據(jù)此完成了基于EJTAG的交叉調(diào)試器的設(shè)計(jì)與實(shí)現(xiàn),大大降低了成本,并具有很好的可移植性(支持不同的微處理器只需要修改少量的代碼)。

發(fā)明內(nèi)容
本發(fā)明的目的在于有效控制和使用目標(biāo)機(jī)上的EJTAG部件,以便捷的方式實(shí)現(xiàn)運(yùn)行在宿主機(jī)上的匯編級和源碼級的調(diào)試功能。
根據(jù)本發(fā)明實(shí)現(xiàn)的基于目標(biāo)機(jī)上的EJTAG部件的交叉調(diào)試器的思路是(1)本調(diào)試器適用的目標(biāo)機(jī)為MIPS系列體系結(jié)構(gòu)的CPU,并且它擴(kuò)展了支持EJTAG規(guī)范的部件;參見圖1,非透明填充背景的部分為EJTAG增加的部分;只需要CPU可以執(zhí)行基本的指令集(包括MTC0/MFC0/LUI/LW/SW/LB/SB/DERET/ADD等)就可以使用。
(2)測試訪問端口TAP接口的5個(gè)JTAG信號TCK(測試時(shí)鐘Test Clock信號)、TMS(測試方式選擇Test Mode Select信號)、TDI(測試數(shù)據(jù)輸入Test Data Input信號)、TDO(測試數(shù)據(jù)輸出Test Data Output信號)和TRST*(測試復(fù)位Test Reset Input*信號)通過簡單的線路與宿主機(jī)的并口相連;表1是JTAG信號和宿主機(jī)上的I/O端口數(shù)據(jù)的對應(yīng)關(guān)系。
表1JTAG信號和I/O端口數(shù)據(jù)信號對照表

其中BASE代表所用的并口的基地址,在PC機(jī)上其默認(rèn)值是0x378。BASE+1表示并口的狀態(tài)端口。表中的信號方向是從宿主機(jī)(PC)的角度看的。復(fù)位信號TRST*是可選信號,表中未列出其對應(yīng)關(guān)系。
(3)匯編級調(diào)試功能運(yùn)行于Windows系統(tǒng),被調(diào)試目標(biāo)代碼的顯示格式使用反匯編代碼;源碼級調(diào)試功能運(yùn)行于Linux系統(tǒng);下載到目標(biāo)機(jī)的格式采用的是Motorola的S-記錄即S-Record格式。
(4)調(diào)試器的基本功能涉及斷點(diǎn)管理(增加、刪除、列出斷點(diǎn))、信息查詢(查看/修改寄存器的內(nèi)容、查看/修改指定地址的數(shù)據(jù))、執(zhí)行控制(單步、繼續(xù)、暫停、復(fù)位)及代碼管理(裝入目標(biāo)代碼用于本地顯示、目標(biāo)代碼下載到目標(biāo)機(jī)、顯示源代碼)等。
(5)調(diào)試器的工作是一個(gè)軟硬件協(xié)同工作的過程。調(diào)試器啟動(dòng)時(shí),將EJTAG控制寄存器即ECR寄存器中的復(fù)位標(biāo)志位Rocc置0,以及EJTAG中斷請求位EjtabBrk,虛擬內(nèi)存段dseg(debug segment)有效位ProbEn,和調(diào)試?yán)庀蛄康刂房刂莆籔robTrap皆置1,使CPU中斷正在執(zhí)行的程序,進(jìn)入調(diào)試模式。CPU進(jìn)入調(diào)試模式后,它依次執(zhí)行調(diào)試器發(fā)送過來的指令,并和調(diào)試器交換有關(guān)內(nèi)容,從而完成調(diào)試工作。
(6)調(diào)試命令的交換格式采用GNU組織的GDB遠(yuǎn)程串行協(xié)議即RSP(Remote SerialProtocol,)格式,這樣運(yùn)行于Windows系統(tǒng)的匯編級調(diào)試和運(yùn)行于Linux系統(tǒng)的高級語言級調(diào)試可以共享用于轉(zhuǎn)換與處理過程的代碼。
(7)高級語言級調(diào)試器的前端采用GNU組織的GDB,后端通過驅(qū)動(dòng)程序和EJTAG/JTAG信號轉(zhuǎn)換及處理過程接口。EJTAG驅(qū)動(dòng)程序采用可裝載的內(nèi)核模塊(loadable kernel module)的方式。
根據(jù)本發(fā)明實(shí)現(xiàn)的基于EJTAG的交叉調(diào)試器的基本工作過程是(1)調(diào)試器循環(huán)檢測ECR寄存器的PrAcc位(暫停標(biāo)志位,Process Access Pending),若為0,繼續(xù)檢測;若為1,表示處理器已經(jīng)完成請求的操作而暫停,轉(zhuǎn)(2);(2)調(diào)試器根據(jù)運(yùn)行的狀態(tài),決定下一步動(dòng)作·如果是等待CPU中斷,表示CPU已進(jìn)入調(diào)試?yán)馓幚?,等待例外處理的代碼;那么把特定指令放入TAP的DATA寄存器(數(shù)據(jù)寄存器);·如果是剛讓CPU執(zhí)行了load/store指令,并且操作數(shù)地址位于dseg段,那么需要提供操作數(shù)(load指令,往TAP的DATA寄存器寫),或者讀出數(shù)據(jù)(store指令,從TAP的DATA寄存器讀);(3)調(diào)試器把ECR的PrAcc位置為0,表示調(diào)試器就緒,CPU可以繼續(xù);(4)轉(zhuǎn)(1)。
本發(fā)明提出的利用軟件有效控制和使用目標(biāo)機(jī)上的EJTAG部件的方案體現(xiàn)在調(diào)試器命令的處理過程中。各基本調(diào)試命令的處理過程基本相似,下面以“查看寄存器的值”為例加以說明(1)用戶通過圖形用戶界面GUI或者命令行輸入調(diào)試請求查看寄存器reg的內(nèi)容,其命令格式假定為print $reg;(2)分析用戶的調(diào)試請求命令(print $reg);取reg寄存器的順序號no.of $reg;打包命令(request=ReadReg,index=no.of $reg,length=sizeof(int));調(diào)用(3);轉(zhuǎn)(4);(3)分析調(diào)試請求(ReadReg);把該請求的處理轉(zhuǎn)換成為一序列的機(jī)器指令;其主要部分如下MTC0 $t1,DESAVE;保存$t1寄存器LW $t1,HIGH(dseg);dseg就是0xFF20 0000SW no.of $reg,0($t1);內(nèi)容送入TAP的DATA寄存器MFC0 $t1,DESAVE;恢復(fù)$t1寄存器把有關(guān)命令序列一條一條地通過TAP接口送給CPU執(zhí)行,并取回寄存器內(nèi)容;打包響應(yīng)(response=success,length=sizeof(int),value=value of $reg);返回響應(yīng);(4)獲得響應(yīng)(response=success,length=sizeof(int),value=value of $reg);響應(yīng)轉(zhuǎn)換成用戶友好的方式$reg=0x12345678(假設(shè)value=0x12345678);顯示結(jié)果到GUI或者命令行。
讀寫TAP寄存器是完成以上過程的核心步驟之一。根據(jù)EJTAG規(guī)范,TAP控制器是一個(gè)有限狀態(tài)機(jī),參見圖3,它的狀態(tài)是由TCK和TMS確定的。TAP控制器在TCK上升沿采樣TMS信號,然后根據(jù)狀態(tài)轉(zhuǎn)換圖進(jìn)行轉(zhuǎn)換。TAP狀態(tài)轉(zhuǎn)換圖有16個(gè)狀態(tài),如圖2-5所示。圖中箭頭邊上的數(shù)字表示在TCK上升沿時(shí),TMS信號的是處于高電平還是低電平。圖3中所標(biāo)識的狀態(tài)含義如下Test-Logic-Reset狀態(tài)測試邏輯復(fù)位狀態(tài),它是初始狀態(tài),在此狀態(tài)下,邊界掃描測試邏輯是被禁止的;Run-Test/Idle狀態(tài)控制寄存器在兩個(gè)掃描操作之間進(jìn)入這種狀態(tài),并且在TMS輸入為‘0’時(shí)一直保持在此狀態(tài),在此狀態(tài)下,所有指令寄存器和測試數(shù)據(jù)寄存器內(nèi)容保持不變;Select-DR-Scan狀態(tài)確定掃描數(shù)據(jù)寄存器狀態(tài),在此狀態(tài)下,所有測試數(shù)據(jù)寄存器保持不變;Select-IR-Scan狀態(tài)確定掃描指令寄存器狀態(tài),在此狀態(tài)下,所有測試數(shù)據(jù)寄存器保持不變;Capture-DR狀態(tài)對指令寄存器進(jìn)行譯碼,確定要掃描的數(shù)據(jù)寄存器;Shift-DR狀態(tài)在這個(gè)狀態(tài)下測試數(shù)據(jù)寄存器連接到TDI和TDO之間,每個(gè)時(shí)鐘周期數(shù)據(jù)串行向TDO方向移動(dòng);Exit1-DR狀態(tài)是暫時(shí)的中間狀態(tài),在這個(gè)狀態(tài)下數(shù)據(jù)保持不變;Pause-DR狀態(tài)在這個(gè)狀態(tài)下,暫時(shí)停止測試數(shù)據(jù)在TDI和TDO之間的移動(dòng);Exit2-DR狀態(tài)在這個(gè)狀態(tài)下,刷新在Shift-DR狀態(tài)移位的數(shù)據(jù)寄存器;Update-DR狀態(tài)在這個(gè)狀態(tài)下,在Shift-DR狀態(tài)移入的數(shù)據(jù)存入由指令寄存器指定的寄存器中;Capture-IR狀態(tài)在這個(gè)狀態(tài)下,指令寄存器自動(dòng)裝入固定向量(000012);Shift-IR狀態(tài)在這個(gè)狀態(tài)下指令寄存器連接到TDI和TDO之間,每個(gè)時(shí)鐘周期數(shù)據(jù)串行向TDO方向移動(dòng);Exit1-IR狀態(tài)是暫時(shí)的中間狀態(tài),在這個(gè)狀態(tài)下數(shù)據(jù)保持不變;Pause-IR狀態(tài)在這個(gè)狀態(tài)下,暫時(shí)停止測試數(shù)據(jù)在TDI和TDO之間的移動(dòng);Exit2-IR狀態(tài)在這個(gè)狀態(tài)下,刷新在Shift-IR狀態(tài)移位的指令寄存器;Update-DR狀態(tài)在這個(gè)狀態(tài)下,在Shift-IR狀態(tài)移入的指令生效。
TAP寄存器的讀寫是在Shift-DR或Shift-IR狀態(tài)進(jìn)行的,數(shù)據(jù)在TCK時(shí)鐘下降沿串行從TDO移出,在上升沿串行從TDI移入。寫TAP寄存器時(shí)忽略從TDO移出的數(shù)據(jù),新數(shù)據(jù)從TDI移入;讀TAP寄存器時(shí)保存從TDO移出的數(shù)據(jù)供返回,同時(shí)將其再從TDI移入,以避免破壞寄存器的內(nèi)容。其主要流程為驅(qū)動(dòng)TAP使其轉(zhuǎn)移到Shift-IR狀態(tài)把寄存器的選擇指令寫入TAP的指令寄存器IR驅(qū)動(dòng)TAP使其轉(zhuǎn)移到Shift-DR狀態(tài)for(循環(huán)次數(shù)=0;循環(huán)次數(shù)<數(shù)據(jù)寄存器的位數(shù);循環(huán)次數(shù)++)從TDO移出數(shù)據(jù)(至本地變量)if(是讀取操作)保存該數(shù)據(jù)(到本地變量)TDI(移入數(shù)據(jù))=從TDO移出的數(shù)據(jù)//避免破壞寄存器的內(nèi)容
else∥是寫入操作TDI(移入數(shù)據(jù))=要寫入寄存器的數(shù)據(jù)從TDI移入數(shù)據(jù)(至選中的寄存器的最高位)endfor驅(qū)動(dòng)TAP使其轉(zhuǎn)移到Update-DR狀態(tài)if(是讀取操作)返回讀出的寄存器內(nèi)容基本調(diào)試命令的完成需要與目標(biāo)機(jī)CPU進(jìn)行配合。本發(fā)明提出的利用軟件有效控制和使用目標(biāo)機(jī)上的EJTAG部件的方案中,需要目標(biāo)機(jī)CPU的調(diào)試?yán)忭憫?yīng)過程如下當(dāng)發(fā)生調(diào)試?yán)鈺r(shí),CPU判斷ECR(EJTAG控制寄存器)中的ProbTrap位(調(diào)試?yán)庀蛄康刂房刂莆?。如果該位是0,就跳轉(zhuǎn)到0xBFC0 0480。這個(gè)地方是由監(jiān)控程序或操作系統(tǒng)提供的調(diào)試?yán)獬绦?。最后?zhí)行DERET,CPU返回正常模式,繼續(xù)執(zhí)行;如果該位是1,就跳轉(zhuǎn)到0xFF20 0200。在調(diào)試模式下,0xFF20 0200位于實(shí)際不存在的虛擬內(nèi)存段dseg(debugsegment)中。這時(shí)候,CPU把PC存入TAP的地址寄存器即ADDRESS寄存器,然后置有關(guān)的狀態(tài)位,等待從TAP送過來指令然后執(zhí)行。具體過程是(1)處理器把程序計(jì)數(shù)器即PC送到TAP的ADDRESS寄存器;(2)處理器寫TAP模塊中的ECR寄存器的標(biāo)志位PrAcc=1;PRnW(暫停種類0表示讀,1表示寫)=0等;(3)處理器不停的檢測PrAcc位,為1則繼續(xù)等待;若為0則進(jìn)入(4);(4)把TAP的Data寄存器中的指令放到IR寄存器中,處理器按如下幾種情況依次執(zhí)行·如果是DERET指令,則轉(zhuǎn)(6);·如果不是load/store指令,直接執(zhí)行,然后轉(zhuǎn)(5);·如果是load/store指令,但是操作數(shù)地址不在dseg(0xFF000000-0xFF3F0000)之內(nèi),直接執(zhí)行,然后轉(zhuǎn)(5);·如果是load指令,處理流程為把操作數(shù)地址放入TAP的ADDRESS寄存器;CPU暫停(置ECR的PrAcc=1,PRnW=0等),等待調(diào)試器提供操作數(shù);
CPU循環(huán)檢測ECR的PrAcc,一直到為0進(jìn)入下一步;從TAP的DATA寄存器讀取操作數(shù),執(zhí)行該指令;轉(zhuǎn)(5);·如果是store指令,處理流程為把操作數(shù)地址和寄存器內(nèi)容分別放入TAP的ADDRESS、DATA寄存器;CPU暫停(置ECR的PrAcc=1,PRnW=1等),等待調(diào)試器取走數(shù)據(jù);CPU循環(huán)檢測ECR的PrAcc,一直到為0進(jìn)入轉(zhuǎn)(5);(5)處理器把PC值加4,轉(zhuǎn)(1);(6)退出調(diào)試模式,繼續(xù)執(zhí)行原來的代碼。
本發(fā)明的特征在于調(diào)試命令的處理過程是全部在宿主PC機(jī)上運(yùn)行的,它包含以下步驟(1)使擴(kuò)展了EJTAG部件的目標(biāo)機(jī)MIPS CPU中的測試訪問端口即Test Access Port簡稱TAP接口的由IEEE技術(shù)委員會聯(lián)合測試行動(dòng)小組Joint Test Action Group簡稱JTAG制定的IEEEE1149.1工業(yè)標(biāo)準(zhǔn)中的下述5個(gè)JTAG信號通過信號線與宿主機(jī)PC的并行I/O端口相連TCK即測試時(shí)鐘Test Clock信號,方向從宿主PC機(jī)到目標(biāo)機(jī)MIPS CPU;TMS即測試方式選擇Test Mode Select信號,方向從宿主PC機(jī)到目標(biāo)機(jī)MIPS CPU;TDI即測試數(shù)據(jù)輸入Test Data Input信號,方向從宿主PC機(jī)到目標(biāo)機(jī)MIPS CPU;TDO即測試數(shù)據(jù)輸出Test Data Output信號,方向從目標(biāo)機(jī)MIPS CPU到宿主PC機(jī);TRST*即測試復(fù)位Test Reset Input*信號,它是可選信號。
(2)在宿主PC機(jī)的存儲器上建立以下模塊對于運(yùn)行在Windows系統(tǒng)下的匯編級調(diào)試器,它建有以下模塊a.人機(jī)界面模塊,采用圖形用戶接口GUI界面,被調(diào)試目標(biāo)代碼的顯示格式使用反匯編代碼,它通過以下函數(shù)來提供操作界面OnOpenDocument()把反匯編顯示格式的代碼讀入內(nèi)存,并設(shè)定以下變量之值存儲每行代碼的長度,存儲代碼,
當(dāng)前行特征位flag,1表示為當(dāng)前行,0表示非當(dāng)前行,斷點(diǎn)表,存儲斷點(diǎn)信息,0表示無斷點(diǎn),非0表示有斷點(diǎn),相應(yīng)數(shù)字即斷點(diǎn)類型代碼行特征位flag,1表示為代碼行,0表示非代碼行(注釋等)OnDownload()下載Motorola的S-記錄即S-Record格式的代碼到目標(biāo)機(jī)指定地址開始的存儲區(qū)域;OnDraw()以不同顏色顯示代碼;OnEditBrk()添加斷點(diǎn),向接口發(fā)出斷點(diǎn)指令;OnEditMem();得到并顯示指定地址內(nèi)存的內(nèi)容;OnEditReg();得到并顯示所有寄存器的值;OnRestart();發(fā)送重啟指令,重啟CPU;OnSingleStep();發(fā)送單步操作命令,并獲得單步操作后寄存器的值;OnRemoveBreakPoint();移除斷點(diǎn);Pack()根據(jù)RSP協(xié)議,為包的內(nèi)容添置包頭包尾,b.調(diào)試請求處理模塊,它是上層的人機(jī)界面模塊和下層的EJTAG/JTAG信號轉(zhuǎn)換及處理模塊的應(yīng)用程序API,它把人機(jī)界面的調(diào)試請求轉(zhuǎn)換成為符合Remote Serial Protocol協(xié)議的數(shù)據(jù)包,發(fā)送給EJTAG/JTAG信號轉(zhuǎn)換及處理模塊,再接収其響應(yīng),后者設(shè)有以下9類調(diào)試命令Callg()讀所有的寄存器,簡稱g,CallG()寫入所有的寄存器,簡稱G,Callm()讀存儲器,簡稱m,CallM()寫存儲器,簡稱M,CallR()復(fù)位,發(fā)出CPU中斷后執(zhí)行的起始地址,簡稱R,Callc()繼續(xù),發(fā)出清除單步標(biāo)志后繼續(xù)執(zhí)行的起始地址,簡稱c,Calls()單步操作,發(fā)出開始單步執(zhí)行的起始地址,簡稱s,
Callz()插入斷點(diǎn),設(shè)定某一地址范圍為斷點(diǎn),簡稱z,CallZ()移除斷點(diǎn),取消某一地址范圍的斷點(diǎn),簡稱Z;相應(yīng)地,調(diào)試請求處理模塊設(shè)定以下各個(gè)調(diào)試請求所用到的函數(shù)CallAPI()通過EJTAG TAP接口執(zhí)行從人機(jī)界面?zhèn)鱽淼恼{(diào)試命令,據(jù)此調(diào)試命令分別調(diào)用由下層的EJTAG/JTAG信號轉(zhuǎn)換及處理模塊給出的以上9類調(diào)試命令,再返回調(diào)試結(jié)果,VerifyCommand()驗(yàn)證指令包是否合法,并從中提取有用部分,GetFirstChar()提取指令的第一個(gè)字符,StrFreeCpy()拷貝一個(gè)串;c.EJTAG信號轉(zhuǎn)換及處理模塊,它把RSP格式的調(diào)試命令請求轉(zhuǎn)換為JTAG信號,使得與目標(biāo)機(jī)CPU的處理過程同步,并返回響應(yīng)信息,相應(yīng)于上述需要處理的調(diào)試命令,它對應(yīng)地設(shè)有以下接口函數(shù)CallR()執(zhí)行R指令,返回結(jié)果,Callg()執(zhí)行g(shù)指令,返回結(jié)果,CallG()執(zhí)行G指令,返回結(jié)果,Callm()執(zhí)行m指令,返回結(jié)果,CallM()執(zhí)行M指令,返回結(jié)果,Callc()執(zhí)行c指令,返回結(jié)果,Calls()執(zhí)行s指令,返回結(jié)果,Callz()執(zhí)行z指令,返回結(jié)果,CallZ()執(zhí)行Z指令,返回結(jié)果。
這些接口函數(shù)的實(shí)現(xiàn)用到了如下函數(shù)Pack()根據(jù)RSP協(xié)議,為包的內(nèi)容添置包頭包尾,SetWord()通過EJTAG TAP設(shè)置一個(gè)32位EJTAG寄存器的值,返回值為0;GetWord()通過EJTAG TAP接口取得一個(gè)32位EJTAG寄存器的值,返回寄存器的值,IsDigit()判斷一個(gè)字符是否代表一個(gè)十六進(jìn)制數(shù)字,是則返回值1,非則返回值,SendSignal()通過并口將信號發(fā)送到EJTAG TAP接口并接受反饋;對于運(yùn)行在Linux系統(tǒng)下的高級語言級即原碼級調(diào)試器,它的前端采用GDB,后端通過下述的EJTAG驅(qū)動(dòng)程序模塊與上述EJTAG/JTAG信號轉(zhuǎn)換及處理模塊接口d.EJTAG驅(qū)動(dòng)程序模塊,實(shí)現(xiàn)了開始調(diào)試、結(jié)束調(diào)試、發(fā)送調(diào)試請求、讀取調(diào)試響應(yīng)四項(xiàng)功能;它與上述EJTAG/JTAG信號轉(zhuǎn)換及處理模之間進(jìn)行的調(diào)試命令的交換自然也是采用GDB的RSP協(xié)議格式,這使得匯編級調(diào)試器和原碼級調(diào)試器共享EJTAG/JTAG信號轉(zhuǎn)換及處理模塊;該EJTAG驅(qū)動(dòng)程序采用可裝載的內(nèi)核模塊的方式用insmod命令裝入該模塊,用rmmod命令卸載該模塊;在EJTAG模塊裝入Linux系統(tǒng)以后,建立了一個(gè)設(shè)備/dev/ejtag,以符合GDB的串口調(diào)試的要求;(3)運(yùn)行于Windows系統(tǒng)下的匯編級調(diào)試器的執(zhí)行過程a.通過函數(shù)OnOpenDocument()將反匯編格式的被調(diào)試目標(biāo)代碼裝入內(nèi)存,b.通過函數(shù)OnDraw()以不同顏色顯示代碼,c.若需要,通過函數(shù)OnDownload()將代碼下載到目標(biāo)機(jī),d.根據(jù)需要,通過函數(shù)OnEditBrk(),OnEditMem(),OnEditReg(),OnRestart(),OnSingleStep(),OnRemoveBreakPoint()實(shí)現(xiàn)添加斷點(diǎn),得到并顯示指定地址內(nèi)存的內(nèi)容,得到并顯示所有寄存器的值,重啟CPU,發(fā)送單步操作命令并獲得單步操作后寄存器的值,移除斷點(diǎn)的操作,e.通過GUI重復(fù)以上過程,或退出調(diào)試器;(4)運(yùn)行于Linux系統(tǒng)下的高級語言級調(diào)試器的執(zhí)行過程a.用insmod命令裝入EJTAG驅(qū)動(dòng)程序模塊,b.通過GDB命令實(shí)現(xiàn)需要完成的調(diào)試操作,c.重復(fù)步驟b,或退出GDB,d.用rmmod命令卸載EJTAG驅(qū)動(dòng)程序模塊;
(5)對于運(yùn)行于Windows系統(tǒng)下的匯編級調(diào)試器,調(diào)試請求處理模塊的主函數(shù)CallAPI()對步驟(3)中遇到的調(diào)試命令的參數(shù)及調(diào)試操作構(gòu)成的數(shù)據(jù)包,利用函數(shù)VerifyCommand()和GetFirstChar()對包進(jìn)行校驗(yàn)及合法性檢驗(yàn),然后再根據(jù)GetFirstChar()的返回值分別調(diào)用Callxxx()所代表的EJTAG/JTAG信號轉(zhuǎn)換及處理模塊給出的CallR(),Callg(),CallG(),Callm(),CallM(),Callc(),Calls(),Callz(),CallZ()等函數(shù),再返回調(diào)試結(jié)果;(6)類似地,對于運(yùn)行于Linux系統(tǒng)下的高級語言級調(diào)試器,連接GDB的EJTAG驅(qū)動(dòng)程序模塊使GDB發(fā)出的調(diào)試命令分別調(diào)用EJTAG/JTAG信號轉(zhuǎn)換及處理模塊給出的CallR(),Callg(),CallG(),Callm(),CallM(),Callc(),Calls(),Callz(),CallZ()等函數(shù),再返回調(diào)試結(jié)果;(7)對于運(yùn)行于Windows系統(tǒng)下的匯編級調(diào)試器以及運(yùn)行于Linux系統(tǒng)下的高級語言級調(diào)試器,二者共用的EJTAG/JTAG信號轉(zhuǎn)換及處理模塊給出CallR(),Callg(),CallG(),Callm(),CallM(),Callc(),Calls(),Callz(),CallZ()等函數(shù)的實(shí)現(xiàn),實(shí)現(xiàn)過程用到上述包括Pack(),SetWord(),GetWord(),IsDigit(),SendSignal()的函數(shù);(8)函數(shù)CallR()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.將EJTAG控制寄存器即ECR寄存器中的復(fù)位標(biāo)志位Rocc置0,以及EJTAG中斷請求位EjtabBrk,虛擬內(nèi)存段dseg(debug segment)有效位ProbEn,和調(diào)試?yán)庀蛄康刂房刂莆籔robTrap皆置1;c.設(shè)置調(diào)試?yán)獬绦蛴?jì)數(shù)器(DEBUG Exception Program Counter)DEPC的值;d.如b,c執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;e.返回“”;(9)函數(shù)Callg()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.通過Store指令得到32個(gè)通用寄存器的數(shù)值;c.通過MFC0,Store指令得到27個(gè)cp0寄存器的數(shù)值;
d.如b,c執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;e.返回通用寄存器和cp0寄存器的內(nèi)容;(10)函數(shù)CallG()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.通過Load,MTC0指令設(shè)置27個(gè)cp0寄存器的數(shù)值;c.通過Load指令設(shè)置32個(gè)通用寄存器的數(shù)值;d.如b,c執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;e.返回“OK”;(11)函數(shù)Callm()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.將內(nèi)存內(nèi)容Load到通用寄存器;c.通過Store指令得到通用寄存器的數(shù)值;d.如b,c執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;e.返回內(nèi)存內(nèi)容;(12)函數(shù)CallM()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.通過Load指令得到通用寄存器的數(shù)值;c.將通用寄存器數(shù)值Store到內(nèi)存中去;d.如b,c執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;e.返回“OK”;
(13)函數(shù)Callc()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.清除Debug寄存器中的SSt位;c.設(shè)置調(diào)試?yán)獬绦蛴?jì)數(shù)器DEPC的值;d.填入DERET指令;e.調(diào)用Callg()得到寄存器內(nèi)容;f.如b,c,d,e執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;g.返回結(jié)果;(14)函數(shù)Calls()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.清除Debug寄存器中的SSt位;c.設(shè)置調(diào)試?yán)獬绦蛴?jì)數(shù)器DEPC的值;d.填入DERET指令;e.調(diào)用Callg()得到寄存器內(nèi)容;f.如b,c,d,e執(zhí)行過程出錯(cuò)(Roee被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;g.返回結(jié)果;(15)函數(shù)Callz()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.斷點(diǎn)對應(yīng)的指令斷點(diǎn)狀態(tài)寄存器中的IBC域中的標(biāo)志位ASIDuse置為0,BE置為1,若為數(shù)據(jù)斷點(diǎn),還需設(shè)置數(shù)據(jù)斷點(diǎn)狀態(tài)寄存器DBC域中的標(biāo)志位BAL置為0,BLM置為1;c.設(shè)置斷點(diǎn)對應(yīng)的指令斷點(diǎn)狀態(tài)寄存器中的IBA域;d.設(shè)置斷點(diǎn)對應(yīng)的指令斷點(diǎn)狀態(tài)寄存器中的IBM域;
e.如b,c,d執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;g.返回“OK”;(16)函數(shù)CallZ()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.斷點(diǎn)對應(yīng)的指令斷點(diǎn)狀態(tài)寄存器中的IBC域中的標(biāo)志位BE置為0;c.如b執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;d.返回“OK”;(17)上述(8)到(16)所述的EJTAG/JTAG信號轉(zhuǎn)換及處理過程把相應(yīng)的調(diào)試請求轉(zhuǎn)換成為一個(gè)機(jī)器指令的序列,然后通過TAP接口一條一條地送給CPU執(zhí)行,并取回結(jié)果內(nèi)容,進(jìn)行打包后返回;根據(jù)TAP的控制流程,在調(diào)試器命令的處理過程中,TAP寄存器的讀寫是在Shift-DR/Shift-IR狀態(tài)進(jìn)行的,數(shù)據(jù)在TCK時(shí)鐘下降沿串行從TDO移出,在上升沿串行從TDI移入;在寫TAP寄存器時(shí),忽略從TDO移出的數(shù)據(jù),新數(shù)據(jù)從TDI移入;讀TAP寄存器時(shí)保存從TDO移出的數(shù)據(jù),以供返回,同時(shí)將其再從TDI移入;(18)調(diào)試命令的完成需要與目標(biāo)機(jī)CPU進(jìn)行配合,其基本工作過程為a.調(diào)試器循環(huán)檢測ECR寄存器的PrAcc位,若為0,繼續(xù)檢測;若為1,表示處理器已經(jīng)完成請求的操作而暫停,轉(zhuǎn)b;b.調(diào)試器根據(jù)運(yùn)行的狀態(tài),決定下一步動(dòng)作·如果是等待CPU中斷,表示CPU已進(jìn)入調(diào)試?yán)馓幚?,等待例外處理的代碼;那么把特定指令放入TAP的DATA寄存器;·如果是剛讓CPU執(zhí)行了load/store指令,并且操作數(shù)地址位于dseg段,那么需要提供操作數(shù)(load指令,往TAP的DATA寄存器寫),或者讀出數(shù)據(jù)(store指令,從TAP的DATA寄存器讀);c.調(diào)試器把ECR的PrAcc位置為0,表示調(diào)試器就緒,CPU可以繼續(xù);d.轉(zhuǎn)a;(19)上述(8)到(16)返回結(jié)果最終會反映到用戶界面,之后調(diào)試器的運(yùn)行過程如(3)、(4)所述。
本發(fā)明的特點(diǎn)與效果(1)國內(nèi)未見有關(guān)基于EJTAG/JTAG調(diào)試器設(shè)計(jì)工作的報(bào)道片上調(diào)試技術(shù)(主要有JTAG和BDM兩類規(guī)范)的實(shí)現(xiàn)與CPU或其它處理器芯片的設(shè)計(jì)是不可分割的,自行研制片上調(diào)試器的工作在國內(nèi)未見報(bào)道。進(jìn)一步,基于EJTAG的片上調(diào)試技術(shù)只適用于MIPS系列體系結(jié)構(gòu)的微處理器,然而在國內(nèi)開展此類體系結(jié)構(gòu)的微處理器研究工作只有清華大學(xué)的THUMP系列和中科院計(jì)算所的龍芯系列,我們研制的基于EJTAG交叉調(diào)試器是專為前者配套完成的,在CPU、開發(fā)板及系統(tǒng)軟件的調(diào)試中發(fā)揮了很大作用。
(2)調(diào)試命令的處理與EJTAG信號相互轉(zhuǎn)換部分運(yùn)行于宿主機(jī)本發(fā)明提出的利用軟件有效控制和使用目標(biāo)機(jī)上的EJTAG部件的方案體現(xiàn)在調(diào)試器命令的處理過程全部運(yùn)行于宿主機(jī)。
國外已有的基于EJTAG調(diào)試器的產(chǎn)品,需要在CPU和宿主機(jī)之間增加一個(gè)硬件實(shí)現(xiàn)的仿真器。圖17是Abatron公司的BDI系列EJTAG調(diào)試器示意圖。其中調(diào)試命令的處理與EJTAG信號相互轉(zhuǎn)換部分是一個(gè)硬件實(shí)現(xiàn)的仿真設(shè)備BDI2000,它位于宿主機(jī)調(diào)試器和目標(biāo)機(jī)之間,實(shí)現(xiàn)的功能是調(diào)試協(xié)議的轉(zhuǎn)換,也就是把宿主機(jī)的調(diào)試請求轉(zhuǎn)換成BDM/EJTAG格式,發(fā)送給目標(biāo)機(jī);然后接收目標(biāo)機(jī)的相應(yīng)信息,轉(zhuǎn)換成宿主機(jī)調(diào)試器要求的格式返回給宿主機(jī)的調(diào)試器。該產(chǎn)品它在國內(nèi)的售價(jià)為3萬多人民幣。相比較,在我們設(shè)計(jì)的EJTAG調(diào)試器中,調(diào)試命令的處理與EJTAG信號相互轉(zhuǎn)換部分也是在宿主機(jī)完成的,這對于用戶來說在性能/價(jià)格比、適應(yīng)性及可移植性方面是完全不同的選擇。
(3)良好的適應(yīng)性根據(jù)該方案,宿主機(jī)與目標(biāo)機(jī)之間通過并口鏈接,只需要4~5根信號線。在開發(fā)板上只需引線插口,無需實(shí)現(xiàn)任何附加邏輯,因此具有良好的適應(yīng)性,同時(shí)降低了成本。
相比較,在Abatron公司的方案中,宿主機(jī)與目標(biāo)機(jī)之間增加了設(shè)備BDI2000。宿主機(jī)通過串口或以太網(wǎng)連接到BDI2000;而它在連接到目標(biāo)機(jī)時(shí),對于開發(fā)板的要求除了實(shí)現(xiàn)特定的EJTAG引線邏輯外,還需提供對電源供給的支持。
(4)良好的可移植性根據(jù)該方案,調(diào)試協(xié)議的轉(zhuǎn)換工作全部在宿主機(jī)端完成,支持不同的目標(biāo)機(jī)系統(tǒng)只需要修改少量的代碼,在可移植性方面明顯優(yōu)于現(xiàn)有的基于硬件仿真器的方法。
相比較,Abatron公司的BDI2000在向不同的目標(biāo)系統(tǒng)移植時(shí),需要更新固件,同時(shí)驅(qū)動(dòng)程序和配置文件也少不了會改動(dòng),可移植性不夠理想。在調(diào)研該產(chǎn)品時(shí),發(fā)現(xiàn)其要滿足我們自己的CPU研制,需要Abatron公司本部的密切配合才有可能,其在國內(nèi)代理無法做到這一步。正因?yàn)榇?,我們才下決心開展了自主研發(fā)基于EJTAG調(diào)試器的工作。


圖1.帶有EJTAG功能的CPU。
圖2.調(diào)試器的體系結(jié)構(gòu)。
圖3.TAP狀態(tài)轉(zhuǎn)換圖。
圖4.匯編級調(diào)試用例圖。
圖5.調(diào)試請求處理流程圖。
圖6.EJTAG/JTAG信號轉(zhuǎn)換及處理。
圖7.R指令的處理。
圖8.g指令的處理。
圖9.G指令的處理。
圖10.m指令的處理。
圖11.M指令的處理。
圖12.c指令的處理。
圖13.s指令的處理。
圖14.z指令的處理。
圖15.Z指令的處理。
圖16.源碼級調(diào)試器的驅(qū)動(dòng)程序體系結(jié)構(gòu)。
圖17.Abatron公司的BDI系列EJTAG調(diào)試器示意圖。
圖18本發(fā)明所述方案的各主要模塊之間的調(diào)用關(guān)系(左為Windows環(huán)境下匯編級調(diào)試過程,右為Linux環(huán)境下源級調(diào)試)。
圖19.圖18中人機(jī)界面模塊的程序流程。
圖20.圖19中OnOpenDocument()函數(shù)的處理流程。
圖21.圖19中OnDownload()函數(shù)的處理流程。
圖22.圖19中OnDraw()函數(shù)的處理流程。
圖23.圖19中OnEditBrk()函數(shù)的處理流程。
圖24.圖19中OnEditMem()函數(shù)的處理流程。
圖25.圖19中OnEditReg()函數(shù)的處理流程。
圖26.圖19中OnRestart()函數(shù)的處理流程。
圖27.圖19中OnSingleStep()函數(shù)的處理流程。
圖28.圖19中OnRemoveBreakPoint()函數(shù)的處理流程。
圖29調(diào)試請求處理模塊中使用的模塊(函數(shù))之間的調(diào)用關(guān)系。
圖30圖29中CallAPI()函數(shù)的處理流程。
圖31圖29中VerifyCommand()函數(shù)的處理流程。
圖32 EJTAG模塊的裝載和卸載流程圖a.裝載b.卸載。
具體實(shí)施例方式
根據(jù)本發(fā)明實(shí)現(xiàn)的基于EJTAG的交叉調(diào)試器的體系結(jié)構(gòu)如圖2所示,其中實(shí)線方框部分表示自行實(shí)現(xiàn)的主要功能模塊匯編級調(diào)試器包括三個(gè)人機(jī)界面模塊、調(diào)試請求處理模塊和EJTAG/JTAG信號轉(zhuǎn)換及處理模塊;高級語言級調(diào)試器包括兩個(gè)連接GDB的EJTAG驅(qū)動(dòng)程序模塊和EJTAG/JTAG信號轉(zhuǎn)換及處理模塊;其中,EJTAG/JTAG信號轉(zhuǎn)換及處理模塊為二者共用。
各模塊之間的調(diào)用關(guān)系如圖18所示。
各模塊的主要功能、工作原理和過程分別介紹如下(1)匯編級調(diào)試器人機(jī)界面模塊。
匯編級調(diào)試在Windows環(huán)境實(shí)現(xiàn),采用GUI界面,操作容易、直觀。它提供如下的操作界面(菜單、或者快捷按鈕)開始調(diào)試/復(fù)位CPU、下載代碼到目標(biāo)機(jī)、裝入源代碼;設(shè)置斷點(diǎn)、刪除斷點(diǎn)、查看斷點(diǎn);單步執(zhí)行、繼續(xù)執(zhí)行;查看寄存器、修改寄存器;查看內(nèi)存、修改內(nèi)存等。其用例圖如圖4所示。
反匯編代碼中有指令的地址,因此可以根據(jù)指令計(jì)數(shù)器PC(Program Counter)值定位當(dāng)前行,將其顯示在界面上。這也是我們使用反匯編代碼而不是匯編源代碼進(jìn)行調(diào)試的緣故,因?yàn)閰R編源代碼里面沒有地址信息。
(2)調(diào)試請求處理模塊。
調(diào)試請求處理模塊的功能通過調(diào)用下層的EJTAG/JTAG信號轉(zhuǎn)換及處理模塊,給人機(jī)界面提供斷點(diǎn)管理、寄存器和內(nèi)存查詢修改等應(yīng)用程序接口API函數(shù)。它把人機(jī)界面的調(diào)試請求轉(zhuǎn)換成為符合Remote Serial Protocol協(xié)議的數(shù)據(jù)包,發(fā)送給EJTAG/JTAG信號轉(zhuǎn)換及處理模塊,然后接収其響應(yīng),從而完成相應(yīng)的功能。其各個(gè)功能的處理流程都類似,如圖5所示。
(3)EJTAG/JTAG信號轉(zhuǎn)換及處理模塊。
如圖6的虛線以下部分所示,該模塊的主要功能包括讀寫CPU寄存器、讀寫目標(biāo)機(jī)內(nèi)存和讀寫TAP寄存器。
人機(jī)界面和調(diào)試功能處理模塊向EJATAG信號轉(zhuǎn)換及處理模塊傳遞的調(diào)試命令格式如表2所示。利用EJTAGTAP接口實(shí)現(xiàn)調(diào)試器的9條命令(R,g,G,m,M,c,s,z,Z)的處理流程分別見圖7,圖8,圖9,圖10,圖11,圖12,圖13,圖14,圖15;分別對應(yīng)9個(gè)函數(shù)模塊CallR,Callg,CallG,Callm,CallM,Callc,Calls,Callz和CallZ;出錯(cuò)代號E02表示執(zhí)行過程中出錯(cuò),出錯(cuò)代號E03表示指令格式錯(cuò)誤。
(4)連接GDB的EJTAG驅(qū)動(dòng)程序模塊。高級語言級調(diào)試器的前端采用GDB,后端通過驅(qū)動(dòng)程序和EJTAG/JTAG信號轉(zhuǎn)換及處理模塊接口。EJTAG驅(qū)動(dòng)程序采用可裝載的內(nèi)核模塊(loadable kernel module)的方式。當(dāng)需要EJTAG調(diào)試的時(shí)候,用insmod命令裝入該模塊,不需要以后,可用rmmod命令卸載該模塊,節(jié)約系統(tǒng)資源。EJTAG模塊裝入Linux系統(tǒng)以后,建立一個(gè)設(shè)備/dev/ejtag,它符合GDB的串口調(diào)試的要求。實(shí)現(xiàn)對接的主要工作包括(1)驅(qū)動(dòng)程序和操作系統(tǒng)的接口;和(2)符合GDB遠(yuǎn)程調(diào)試要求的接口。其驅(qū)動(dòng)程序的體系結(jié)構(gòu)如圖16所示。
表2向EJATAG信號轉(zhuǎn)換及處理模塊傳遞的調(diào)試命令格式


各模塊的結(jié)構(gòu)及詳細(xì)設(shè)計(jì)如下(1)匯編級調(diào)試器人機(jī)界面圖19中描述了程序執(zhí)行流程,首先由BOOL CdebuggerDoc∷OnOpenDocument(LPCTSTR lpszPathName)讀取匯編源碼,再由void CDebuggerView∷OnDraw(CDC*pDC)將源碼按一定格式顯示出來,然后由其他函數(shù)實(shí)現(xiàn)各種調(diào)試功能。各模塊(函數(shù))分別說明如下模塊(函數(shù))說明BOOL CDebuggerDoc∷OnOpenDocument(LPCTSTR lpszPathName)功能描述 將匯編源碼讀入內(nèi)存,做一定處理,并設(shè)定以下變量之值int m_LineCount;∥存儲每行代碼的長度char*m_charbuffer[MAXLINE];∥存儲代碼int m_currentLine[MAXLINE];∥當(dāng)前行flag,1表示為當(dāng)前∥行,0表示非當(dāng)前行int m_breakPoint[MAXLINE];∥斷點(diǎn)表,存儲斷點(diǎn)信息,0表∥示無斷點(diǎn),非0表示有斷點(diǎn),相應(yīng)數(shù)字即為斷點(diǎn)類型
int m_codeLine[MAXLINE];?!未a行flag,1表示為代碼行,∥0表示非代碼行(注釋等)參數(shù)表LPCTSTR lpszPathName指向匯編文件的指針返回值正常結(jié)束時(shí)返回TRUE,否則返回FALSE處理流程見圖20錯(cuò)誤信息 TRUE---讀取文件成功 FALSE----讀取文件失敗模塊(函數(shù))名 void CDebuggerView∷OnDownload()功能描述 得到指定地址內(nèi)存的內(nèi)容,并將其顯示處理流程見圖21模塊(函數(shù))說明void CDebuggerView∷OnDraw(CDC*pDC)功能描述 顯示代碼,并根據(jù)是否當(dāng)前行,是否注釋,是否斷點(diǎn)等條件顯示不同的顏色參數(shù)表CDC*pDC指向當(dāng)前view類的指針處理流程見圖22模塊(函數(shù))說明void CDebuggerView∷OnEditBrk()功能描述 添加斷點(diǎn),向接口發(fā)出斷點(diǎn)指令處理流程 見圖23模塊(函數(shù))名 void CDebuggerView∷OnEditMem()功能描述 得到指定地址內(nèi)存的內(nèi)容,并將其顯示處理流程 見圖24模塊(函數(shù))名 void CDebuggerView∷OnEditReg()功能描述 得到所有寄存器的值,并將其顯示處理流程見圖25模塊(函數(shù))名 void CDebuggerView∷OnRestart()功能描述 發(fā)送重啟指令,重啟CPU處理流程見圖26模塊(函數(shù))名 void CDebuggerView∷OnSingleStep()功能描述 單步操作,發(fā)送單步命令,并獲得單步操作后寄存器的值。
處理流程見圖27備注此函數(shù)流程比較復(fù)雜,是由目標(biāo)機(jī)的硬件特性所導(dǎo)致。在EJTAG標(biāo)準(zhǔn)中,如果當(dāng)前行有斷點(diǎn),在不將斷點(diǎn)移除的條件下,所有繼續(xù)程序的指令(包括single step,continue等)都無法運(yùn)行,所以進(jìn)行單步前,要增加移除斷點(diǎn)的步驟。而在正常使用程序的習(xí)慣中,斷點(diǎn)運(yùn)行過以后應(yīng)該仍然存在,而不是消失,所以在單步后又在原處將斷點(diǎn)添加,以符合人們的使用習(xí)慣。
模塊(函數(shù))名 void CDebuggerView∷OnRemoveBreakPoint()功能描述 移除斷點(diǎn)處理流程見圖28(2)調(diào)試請求處理模塊。
圖29為調(diào)試請求處理模塊中使用的模塊(函數(shù))之間的調(diào)用關(guān)系。其中Callxxx()代表CallR(),Callg(),CallG(),Callm(),CallM(),Callc(),Calls(),Callz(),CallZ()9個(gè)函數(shù),因其執(zhí)行過程大致相仿,調(diào)用函數(shù)相同(參見EJTAG/JTAG信號轉(zhuǎn)換及處理模塊),故寫作Callxxx()便于表達(dá)。Callxxx()的處理流程在EJTAG/JTAG信號轉(zhuǎn)換及處理模塊中說明。其它的模塊(函數(shù)),包括Callxxx()用到的模塊(函數(shù))分別說明如下模塊(C函數(shù))名 char*CallAPI(char*command)功能描述 通過EJTAG TAP接口執(zhí)行從人機(jī)界面?zhèn)鱽淼恼{(diào)試命令,把執(zhí)行結(jié)果返回給人機(jī)界面參數(shù)表command從人機(jī)界面接受的調(diào)試命令返回值返回給人機(jī)界面的調(diào)試結(jié)果處理流程見圖30錯(cuò)誤信息 E00----指令包破損E01----無法識別的指令模塊(C函數(shù))名 int VerifyCommand(char*&command)功能描述 驗(yàn)證指令包是否合法,并從指令包中提取有用部分參數(shù)表command指令包,VerifyCommand()結(jié)束后,包頭包尾被去掉(如,指令包$Rbfc00000#?經(jīng)VerifyCommand()后變?yōu)镽bfc00000)返回值0處理流程見圖31處理流程錯(cuò)誤信息 -1表示指令包不合法模塊(C函數(shù))名 char GetFirstChar(char*&command)功能描述 取出指令的第一個(gè)字符參數(shù)表command指令,GetFirstChar()結(jié)束后,第一個(gè)字符被去掉(如,指令Rbfc00000經(jīng)GetFirstChar()后變?yōu)閎fc00000)返回值command的第一個(gè)字符模塊(C函數(shù))名 char*StrFreeCpy(char*s,int first,int length)功能描述 復(fù)制串s從first開始長度為length的一個(gè)子串,并返回參數(shù)表s字符串,first整數(shù),length整數(shù)返回值串s從first開始長度為length的一個(gè)子串模塊(C函數(shù))名 int IsDigit(char c)功能描述判斷一個(gè)字符是否代表一個(gè)十六進(jìn)制數(shù)字參數(shù)表c待判斷的字符返回值1錯(cuò)誤信息 0----該字符不代表十六進(jìn)制數(shù)字模塊(C函數(shù))名 char*pack(char*content)功能描述 打包函數(shù),為包的內(nèi)容添置包頭包尾,包的格式遵從Remote Serial Protocol;(在CdebuggerView類的生成Command功能時(shí)也用到)參數(shù)表content包的內(nèi)容返回值打包后的內(nèi)容模塊(C函數(shù))名 int GetWord(int IR)功能描述 通過EJTAGTAP接口取得一個(gè)32位EJTAG寄存器的值參數(shù)表IREJTAG寄存器對應(yīng)的IR返回值寄存器的值處理流程 設(shè)置信號格式存放于字符數(shù)組中,通過SendSignal()函數(shù)從并口發(fā)送到EJTAGTAP接口模塊(C函數(shù))名 int SetWord(int IR)功能描述 通過EJTAG TAP接口取得一個(gè)32位EJTAG寄存器的值參數(shù)表IREJTAG寄存器對應(yīng)的IR返回值0處理流程 設(shè)置信號格式存放于字符數(shù)組中,通過SendSignal()函數(shù)從并口發(fā)送到EJTAGTAP接口模塊(C函數(shù))名 int SendSignal(int lenOfSignal,char*signal)功能描述 通過并口將信號發(fā)送到EJTAG TAP接口并接受反饋參數(shù)表IREJTAG寄存器對應(yīng)的IR返回值0處理流程 EJTAGTAP接口反饋值注指令執(zhí)行結(jié)果及出錯(cuò)信息的返回值在返回人機(jī)界面前均經(jīng)pack()函數(shù)打包(3)EJTAG/JTAG信號轉(zhuǎn)換及處理模塊。
需處理的9條命令(R,g,G,m,M,c,s,z,Z)的處理流程分別見圖7,圖8,圖9,圖10,圖11,圖12,圖13,圖14,圖15;分別對應(yīng)9個(gè)函數(shù)模塊CallR,Callg,CallG, Callm,CallM,Callc,Calls,Callz和CallZ;對應(yīng)的函數(shù)接口定義分別為模塊(C函數(shù))名 char*CallR(char*command)功能描述 執(zhí)行R指令,返回結(jié)果參數(shù)表command指令(不包括第一個(gè)字符)返回值執(zhí)行成功----返回“”處理流程見圖7錯(cuò)誤信息 E02----執(zhí)行過程中出錯(cuò)E03----指令格式錯(cuò)誤模塊(C函數(shù))名 char*Callg(char*command)功能描述 執(zhí)行g(shù)指令,返回結(jié)果參數(shù)表command指令(不包括第一個(gè)字符)返回值寄存器內(nèi)容(通用寄存器和cp0)處理流程 見圖8錯(cuò)誤信息 E02----執(zhí)行過程中出錯(cuò)E03----指令格式錯(cuò)誤模塊(C函數(shù))名 char*CallG(char*command)功能描述 執(zhí)行G指令,返回結(jié)果參數(shù)表command指令(不包括第一個(gè)字符)返回值OK處理流程 見圖9錯(cuò)誤信息 E02----執(zhí)行過程中出錯(cuò)E03----指令格式錯(cuò)誤模塊(C函數(shù))名 char*Callm(char*command)功能描述 執(zhí)行m指令,返回結(jié)果參數(shù)表command指令(不包括第一個(gè)字符)返回值OK處理流程見圖10錯(cuò)誤信息 E02----執(zhí)行過程中出錯(cuò)E03----指令格式錯(cuò)誤模塊(C函數(shù))名 char*CallM(char*command)功能描述 執(zhí)行M指令,返回結(jié)果參數(shù)表command指令(不包括第一個(gè)字符)返回值OK處理流程見圖11錯(cuò)誤信息 E02----執(zhí)行過程中出錯(cuò)E03----指令格式錯(cuò)誤模塊(C函數(shù))名 char*Callc(char*command)功能描述 執(zhí)行c指令,返回結(jié)果參數(shù)表command指令(不包括第一個(gè)字符)返回值參見表2處理流程見圖12錯(cuò)誤信息 E02----執(zhí)行過程中出錯(cuò)E03----指令格式錯(cuò)誤模塊(C函數(shù))名 char*Calls(char*command)功能描述 執(zhí)行s指令,返回結(jié)果參數(shù)表command指令(不包括第一個(gè)字符)返回值參見表2處理流程見圖13錯(cuò)誤信息 E02----執(zhí)行過程中出錯(cuò)E03----指令格式錯(cuò)誤模塊(C函數(shù))名 char*Callz(char*command)功能描述 執(zhí)行z指令,返回結(jié)果參數(shù)表command指令(不包括第一個(gè)字符)返回值OK處理流程見圖14錯(cuò)誤信息 E02----執(zhí)行過程中出錯(cuò)E03----指令格式錯(cuò)誤模塊(C函數(shù))名 char*CallZ(char*command)
功能描述 執(zhí)行Z指令,返回結(jié)果參數(shù)表command指令(不包括第一個(gè)字符)返回值OK處理流程見圖15錯(cuò)誤信息 E02----執(zhí)行過程中出錯(cuò)E03----指令格式錯(cuò)誤(4)連接GDB的EJTAG驅(qū)動(dòng)程序模塊。
驅(qū)動(dòng)程序?qū)崿F(xiàn)了開始調(diào)試、結(jié)束調(diào)試、發(fā)送調(diào)試請求、讀取調(diào)試響應(yīng)四項(xiàng)功能,其處理過程如下(a)開始調(diào)試向Linux Kernel申請I/O地址范圍復(fù)位目標(biāo)機(jī)讀取CPU實(shí)現(xiàn)的硬件斷點(diǎn)、軟件斷點(diǎn)數(shù)量(b)結(jié)束調(diào)試釋放I/O地址范圍(c)發(fā)出調(diào)試請求校驗(yàn)、分析調(diào)試請求處理調(diào)試請求處理的結(jié)果放入結(jié)果緩沖區(qū)(d)讀取調(diào)試響應(yīng)循環(huán)測試是否已有結(jié)果if(已有結(jié)果)從結(jié)果緩沖區(qū)讀取處理結(jié)果驅(qū)動(dòng)程序和操作系統(tǒng)的接口就是EJTAG模塊的裝載和卸載,如圖32所示。
權(quán)利要求
1.基于目標(biāo)機(jī)上的EJTAG部件的交叉調(diào)試器實(shí)現(xiàn)方法,其特征在于調(diào)試命令的處理過程是全部在宿主PC機(jī)上運(yùn)行的,它包含以下步驟(1)使擴(kuò)展了EJTAG部件的目標(biāo)機(jī)MIPS CPU中的測試訪問端口即Test Access Port簡稱TAP接口的由IEEE技術(shù)委員會聯(lián)合測試行動(dòng)小組Joint Test Action Group簡稱JTAG制定的IEEEE1149.1工業(yè)標(biāo)準(zhǔn)中的下述5個(gè)JTAG信號通過信號線與宿主機(jī)PC的并行I/O端口相連TCK即測試時(shí)鐘Test Clock信號,方向從宿主PC機(jī)到目標(biāo)機(jī)MIPS CPU;TMS即測試方式選擇Test Mode Select信號,方向從宿主PC機(jī)到目標(biāo)機(jī)MIPS CPU;TDI即測試數(shù)據(jù)輸入Test Data Input信號,方向從宿主PC機(jī)到目標(biāo)機(jī)MIPS CPU;TDO即測試數(shù)據(jù)輸出Test Data Output信號,方向從目標(biāo)機(jī)MIPS CPU到宿主PC機(jī);TRST*即測試復(fù)位Test Reset Input*信號,它是可選信號;(2)在宿主PC機(jī)的存儲器上建立以下模塊對于運(yùn)行在Windows系統(tǒng)下的匯編級調(diào)試器,它建有以下模塊a.人機(jī)界面模塊,采用圖形用戶接口GUI界面,被調(diào)試目標(biāo)代碼的顯示格式使用反匯編代碼,它通過以下函數(shù)來提供操作界面OnOpenDocument()把反匯編顯示格式的代碼讀入內(nèi)存,并設(shè)定以下變量之值存儲每行代碼的長度,存儲代碼,當(dāng)前行特征位flag,1表示為當(dāng)前行,0表示非當(dāng)前行,斷點(diǎn)表,存儲斷點(diǎn)信息,0表示無斷點(diǎn),非0表示有斷點(diǎn),相應(yīng)數(shù)字即斷點(diǎn)類型,代碼行特征位flag,1表示為代碼行,0表示非代碼行(注釋等);OnDownload()下載Motorola的S-記錄即S-Record格式的代碼到目標(biāo)機(jī)指定地址開始的存儲區(qū)域;OnDraw()以不同顏色顯示代碼;OnEditBrk()添加斷點(diǎn),向接口發(fā)出斷點(diǎn)指令;OnEditMem();得到并顯示指定地址內(nèi)存的內(nèi)容;OnEditReg();得到并顯示所有寄存器的值;OnRestart();發(fā)送重啟指令,重啟CPU;OnSingleStep();發(fā)送單步操作命令,并獲得單步操作后寄存器的值;OnRemoveBreakPoint();移除斷點(diǎn);Pack()根據(jù)RSP協(xié)議,為包的內(nèi)容添置包頭包尾,b.調(diào)試請求處理模塊,它是上層的人機(jī)界面模塊和下層的EJTAG/JTAG信號轉(zhuǎn)換及處理模塊的應(yīng)用程序API,它把人機(jī)界面的調(diào)試請求轉(zhuǎn)換成為符合Remote Serial Protocol協(xié)議的數(shù)據(jù)包,發(fā)送給EJTAG/JTAG信號轉(zhuǎn)換及處理模塊,再接収其響應(yīng),后者設(shè)有以下9類調(diào)試命令Callg()讀所有的寄存器,簡稱g,CallG()寫入所有的寄存器,簡稱G,Callm()讀存儲器,簡稱m,CallM()寫存儲器,簡稱M,CallR()復(fù)位,發(fā)出CPU中斷后執(zhí)行的起始地址,簡稱R,Callc()繼續(xù),發(fā)出清除單步標(biāo)志后繼續(xù)執(zhí)行的起始地址,簡稱c,Calls()單步操作,發(fā)出開始單步執(zhí)行的起始地址,簡稱s,Callz()插入斷點(diǎn),設(shè)定某一地址范圍為斷點(diǎn),簡稱z,CallZ()移除斷點(diǎn),取消某一地址范圍的斷點(diǎn),簡稱Z;相應(yīng)地,調(diào)試請求處理模塊設(shè)定以下各個(gè)調(diào)試請求所用到的函數(shù)CallAPI()通過EJTAG TAP接口執(zhí)行從人機(jī)界面?zhèn)鱽淼恼{(diào)試命令,據(jù)此調(diào)試命令分別調(diào)用由下層的EJTAG/JTAG信號轉(zhuǎn)換及處理模塊給出的以上9類調(diào)試命令,再返回調(diào)試結(jié)果,VerifyCommand()驗(yàn)證指令包是否合法,并從中提取有用部分,GetFirstChar()提取指令的第一個(gè)字符,StrFreeCpy()拷貝一個(gè)串;c.EJTAG信號轉(zhuǎn)換及處理模塊,它把RSP格式的調(diào)試命令請求轉(zhuǎn)換為JTAG信號,使得與目標(biāo)機(jī)CPU的處理過程同步,并返回響應(yīng)信息,相應(yīng)于上述需要處理的調(diào)試命令,它對應(yīng)地設(shè)有以下接口函數(shù)CallR()執(zhí)行R指令,返回結(jié)果,Callg()執(zhí)行g(shù)指令,返回結(jié)果,CallG()執(zhí)行G指令,返回結(jié)果,Callm()執(zhí)行m指令,返回結(jié)果,CallM()執(zhí)行M指令,返回結(jié)果,Callc()執(zhí)行c指令,返回結(jié)果,Calls()執(zhí)行s指令,返回結(jié)果,Callz()執(zhí)行z指令,返回結(jié)果,CallZ()執(zhí)行Z指令,返回結(jié)果;這些接口函數(shù)的實(shí)現(xiàn)用到了如下函數(shù)Pack()根據(jù)RSP協(xié)議,為包的內(nèi)容添置包頭包尾,SetWord()通過EJTAG TAP設(shè)置一個(gè)32位EJTAG寄存器的值,返回值為0;GetWord()通過EJTAG TAP接口取得一個(gè)32位EJTAG寄存器的值,返回寄存器的值,IsDigit()判斷一個(gè)字符是否代表一個(gè)十六進(jìn)制數(shù)字,是則返回值1,非則返回值,SendSignal()通過并口將信號發(fā)送到EJTAG TAP接口并接受反饋;對于運(yùn)行在Linux系統(tǒng)下的高級語言級即原碼級調(diào)試器,它的前端采用GDB,后端通過下述的EJTAG驅(qū)動(dòng)程序模塊與上述EJTAG/JTAG信號轉(zhuǎn)換及處理模塊接口d.EJTAG驅(qū)動(dòng)程序模塊,實(shí)現(xiàn)了開始調(diào)試、結(jié)束調(diào)試、發(fā)送調(diào)試請求、讀取調(diào)試響應(yīng)四項(xiàng)功能;它與上述EJTAG/JTAG信號轉(zhuǎn)換及處理模之間進(jìn)行的調(diào)試命令的交換自然也是采用GDB的RSP協(xié)議格式,這使得匯編級調(diào)試器和原碼級調(diào)試器共享EJTAG/JTAG信號轉(zhuǎn)換及處理模塊;該EJTAG驅(qū)動(dòng)程序采用可裝載的內(nèi)核模塊的方式用insmod命令裝入該模塊,用rmmod命令卸載該模塊;在EJTAG模塊裝入Linux系統(tǒng)以后,建立了一個(gè)設(shè)備/dev/ejtag,以符合GDB的串口調(diào)試的要求;(3)運(yùn)行于Windows系統(tǒng)下的匯編級調(diào)試器的執(zhí)行過程a.通過函數(shù)OnOpenDocument()將反匯編格式的被調(diào)試目標(biāo)代碼裝入內(nèi)存,b.通過函數(shù)OnDraw()以不同顏色顯示代碼,c.若需要,通過函數(shù)OnDownload()將代碼下載到目標(biāo)機(jī),d.根據(jù)需要,通過函數(shù)OnEditBrk(),OnEditMem(),OnEditReg(),OnRestart(),OnSingleStep(),OnRemoveBreakPoint()實(shí)現(xiàn)添加斷點(diǎn),得到并顯示指定地址內(nèi)存的內(nèi)容,得到并顯示所有寄存器的值,重啟CPU,發(fā)送單步操作命令并獲得單步操作后寄存器的值,移除斷點(diǎn)的操作,e.通過GUI重復(fù)以上過程,或退出調(diào)試器;(4)運(yùn)行于Linux系統(tǒng)下的高級語言級調(diào)試器的執(zhí)行過程a.用insmod命令裝入EJTAG驅(qū)動(dòng)程序模塊,b.通過GDB命令實(shí)現(xiàn)需要完成的調(diào)試操作,c.重復(fù)步驟b,或退出GDB,d.用rmmod命令卸載EJTAG驅(qū)動(dòng)程序模塊;(5)對于運(yùn)行于Windows系統(tǒng)下的匯編級調(diào)試器,調(diào)試請求處理模塊的主函數(shù)CallAPI()對步驟(3)中遇到的調(diào)試命令的參數(shù)及調(diào)試操作構(gòu)成的數(shù)據(jù)包,利用函數(shù)VerifyCommand()和GetFirstChar()對包進(jìn)行校驗(yàn)及合法性檢驗(yàn),然后再根據(jù)GetFirstChar()的返回值分別調(diào)用Callxxx()所代表的EJTAG/JTAG信號轉(zhuǎn)換及處理模塊給出的CallR(),Callg(),CallG(),Callm(),CallM(),Callc(),Calls(),Callz(),CallZ()等函數(shù),再返回調(diào)試結(jié)果;(6)類似地,對于運(yùn)行于Linux系統(tǒng)下的高級語言級調(diào)試器,連接GDB的EJTAG驅(qū)動(dòng)程序模塊使GDB發(fā)出的調(diào)試命令分別調(diào)用EJTAG/JTAG信號轉(zhuǎn)換及處理模塊給出的CallR(),Callg(),CallG(),Callm(),CallM(),Callc(),Calls(),Callz(),CallZ()等函數(shù),再返回調(diào)試結(jié)果;(7)對于運(yùn)行于Windows系統(tǒng)下的匯編級調(diào)試器以及運(yùn)行于Linux系統(tǒng)下的高級語言級調(diào)試器,二者共用的EJTAG/JTAG信號轉(zhuǎn)換及處理模塊給出CallR(),Callg(),CallG(),Callm(),CallM(),Callc(),Calls(),Callz(),CallZ()等函數(shù)的實(shí)現(xiàn),實(shí)現(xiàn)過程用到上述包括Pack(),SetWord(),GetWord(),IsDigit(),SendSignal()的函數(shù);(8)函數(shù)CallR()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.將EJTAG控制寄存器即ECR寄存器中的復(fù)位標(biāo)志位Rocc置0,以及EJTAG中斷請求位EjtabBrk,虛擬內(nèi)存段dseg(debug segment)有效位ProbEn,和調(diào)試?yán)庀蛄康刂房刂莆籔robTrap皆置1;c.設(shè)置調(diào)試?yán)獬绦蛴?jì)數(shù)器(DEBUG Exception Program Counter)DEPC的值;d.如b,c執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;e.返回“”;(9)函數(shù)Callg()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.通過Store指令得到32個(gè)通用寄存器的數(shù)值;c.通過MFC0,Store指令得到27個(gè)cp0寄存器的數(shù)值;d.如b,c執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;e.返回通用寄存器和cp0寄存器的內(nèi)容;(10)函數(shù)CallG()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.通過Load,MTC0指令設(shè)置27個(gè)cp0寄存器的數(shù)值;c.通過Load指令設(shè)置32個(gè)通用寄存器的數(shù)值;d.如b,c執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;e.返回“OK”;(11)函數(shù)Callm()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.將內(nèi)存內(nèi)容Load到通用寄存器;c.通過Store指令得到通用寄存器的數(shù)值;d.如b,c執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;e.返回內(nèi)存內(nèi)容;(12)函數(shù)CallM()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.通過Load指令得到通用寄存器的數(shù)值;c.將通用寄存器數(shù)值Store到內(nèi)存中去;d.如b,c執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;e.返回“OK”;(13)函數(shù)Callc()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.清除Debug寄存器中的SSt位;c.設(shè)置調(diào)試?yán)獬绦蛴?jì)數(shù)器DEPC的值;d.填入DERET指令;e.調(diào)用Callg()得到寄存器內(nèi)容;f.如b,c,d,e執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;g.返回結(jié)果;(14)函數(shù)Calls()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.清除Debug寄存器中的SSt位;c.設(shè)置調(diào)試?yán)獬绦蛴?jì)數(shù)器DEPC的值;d.填入DERET指令;e.調(diào)用Callg()得到寄存器內(nèi)容;f.如b,c,d,e執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;g.返回結(jié)果;(15)函數(shù)Callz()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.斷點(diǎn)對應(yīng)的指令斷點(diǎn)狀態(tài)寄存器中的IBC域中的標(biāo)志位ASIDuse置為0,BE置為1,若為數(shù)據(jù)斷點(diǎn),還需設(shè)置數(shù)據(jù)斷點(diǎn)狀態(tài)寄存器DBC域中的標(biāo)志位BAL置為0,BLM置為1;c.設(shè)置斷點(diǎn)對應(yīng)的指令斷點(diǎn)狀態(tài)寄存器中的IBA域;d.設(shè)置斷點(diǎn)對應(yīng)的指令斷點(diǎn)狀態(tài)寄存器中的IBM域;e.如b,c,d執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;f.返回“OK”;(16)函數(shù)CallZ()的處理過程a.檢查指令格式是否正確,若不正確則返回,并置出錯(cuò)標(biāo)志;b.斷點(diǎn)對應(yīng)的指令斷點(diǎn)狀態(tài)寄存器中的IBC域中的標(biāo)志位BE置為0;c.如b執(zhí)行過程出錯(cuò)(Rocc被置為1,處理器未處于預(yù)期的暫停狀態(tài)),則返回,并置出錯(cuò)標(biāo)志;d.返回“OK”;(17)上述(8)到(16)所述的EJTAG/JTAG信號轉(zhuǎn)換及處理過程把相應(yīng)的調(diào)試請求轉(zhuǎn)換成為一個(gè)機(jī)器指令的序列,然后通過TAP接口一條一條地送給CPU執(zhí)行,并取回結(jié)果內(nèi)容,進(jìn)行打包后返回;根據(jù)TAP的控制流程,在調(diào)試器命令的處理過程中,TAP寄存器的讀寫是在Shift-DR/Shift-IR狀態(tài)進(jìn)行的,數(shù)據(jù)在TCK時(shí)鐘下降沿串行從TDO移出,在上升沿串行從TDI移入;在寫TAP寄存器時(shí),忽略從TDO移出的數(shù)據(jù),新數(shù)據(jù)從TDI移入;讀TAP寄存器時(shí)保存從TDO移出的數(shù)據(jù),以供返回,同時(shí)將其再從TDI移入;(18)調(diào)試命令的完成需要與目標(biāo)機(jī)CPU進(jìn)行配合,其基本工作過程為a.調(diào)試器循環(huán)檢測ECR寄存器的PrAcc位,若為0,繼續(xù)檢測;若為1,表示處理器已經(jīng)完成請求的操作而暫停,轉(zhuǎn)b;b.調(diào)試器根據(jù)運(yùn)行的狀態(tài),決定下一步動(dòng)作·如果是等待CPU中斷,表示CPU已進(jìn)入調(diào)試?yán)馓幚恚却馓幚淼拇a;那么把特定指令放入TAP的DATA寄存器;·如果是剛讓CPU執(zhí)行了load/store指令,并且操作數(shù)地址位于dseg段,那么需要提供操作數(shù)(load指令,往TAP的DATA寄存器寫),或者讀出數(shù)據(jù)(store指令,從TAP的DATA寄存器讀);c.調(diào)試器把ECR的PrAcc位置為0,表示調(diào)試器就緒,CPU可以繼續(xù);d.轉(zhuǎn)a;(19)上述(8)到(16)返回結(jié)果最終會反映到用戶界面,之后調(diào)試器的運(yùn)行過程如(3)、(4)所述。
全文摘要
本發(fā)明提出了一種利用軟件有效控制和使用目標(biāo)機(jī)上的EJTAG部件的方案,據(jù)此完成了基于EJTAG的交叉調(diào)試器的設(shè)計(jì)與實(shí)現(xiàn)。該方案的特征在于調(diào)試器命令的處理過程全部運(yùn)行于宿主機(jī),宿主機(jī)與目標(biāo)機(jī)之間只需要4~5根信號線,不需要任何額外的硬件設(shè)備。調(diào)試器以高的性能/價(jià)格比實(shí)現(xiàn)了運(yùn)行在宿主機(jī)上的匯編級和源碼級的調(diào)試功能,并且具有良好的適應(yīng)性與可移植性。
文檔編號G06F11/36GK1564136SQ20041000900
公開日2005年1月12日 申請日期2004年4月2日 優(yōu)先權(quán)日2004年4月2日
發(fā)明者田金蘭, 蘇宏謀, 王生原 申請人:清華大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1