王 品,于 瑩,苗政民,賀紅衛(wèi)
(1.中國兵器科學研究院,北京 100089;2.中國航天科工集團第二研究院706所,北京 100039)
數(shù)字信號處理器(digital signal processor,DSP)具有靈活、穩(wěn)定、重復性好、可大規(guī)模集成和易于實時實現(xiàn)等優(yōu)點,被廣泛應(yīng)用于語音、通信、圖像處理、聲納、生物醫(yī)學儀器等諸多領(lǐng)域,在防空反導、機動突擊、火力打擊、光電偵察、指揮控制等各類武器裝備中也發(fā)揮著重要作用[1]。
多核技術(shù)是提升處理器計算能力的重要途徑, 隨
著武器裝備嵌入式系統(tǒng)向自主化、智能化、小型化、低功耗方向發(fā)展,對高精度、高性能和安全可控計算需求不斷提高,自主多核處理器在裝備研制中得到越來越廣泛的應(yīng)用。
目前,國內(nèi)在核心電子器件領(lǐng)域的技術(shù)水平有了長足進步,已經(jīng)研制出多款多核處理器,對相應(yīng)的軟件開發(fā)調(diào)試環(huán)境提出了迫切需求。提供包括仿真器在內(nèi)的、與處理器相配套的軟件調(diào)試環(huán)境,是自主多核處理器能夠推廣應(yīng)用與深入發(fā)展的前提[2]。
相對于通用計算機,嵌入式系統(tǒng)的軟硬件資源有限,通常無法完成本地自主調(diào)試,需要借助軟硬件資源豐富的通用計算機,使用遠程調(diào)試的方式進行軟件調(diào)試[3]。
一個典型的嵌入式軟件遠程調(diào)試系統(tǒng)包括三個部分:調(diào)試主機、仿真器(調(diào)試協(xié)議轉(zhuǎn)換器)和目標平臺。調(diào)試主機一般為通用計算機,通過某種接口(如USB接口、網(wǎng)口、并口)與仿真器相連,仿真器通過JTAG接口連接目標平臺,以此達到調(diào)試主機與目標平臺進行調(diào)試信息交互的目的。調(diào)試主機運行調(diào)試器(如GDB)和調(diào)試代理軟件,并為開發(fā)調(diào)試人員提供圖形化操作和觀察界面[4]。
遠程調(diào)試系統(tǒng)組成如圖1所示。
圖1 遠程調(diào)試系統(tǒng)組成
與本地調(diào)試相比,遠程調(diào)試具有以下特點[5]:
(1)調(diào)試環(huán)境和被調(diào)試程序運行在不同的計算機上,通過某種通信方式將調(diào)試主機和目標平臺相連,避開了目標平臺上軟硬件資源不足的限制,為用戶提供強大的調(diào)試功能。
(2)目標平臺無需操作系統(tǒng)支持。目標平臺上即使運行操作系統(tǒng),也主要是用于嵌入式應(yīng)用的支撐,而不是用于目標平臺的軟件開發(fā)調(diào)試環(huán)境。
(3)本地調(diào)試只能調(diào)試相同指令集的程序,而遠程調(diào)試可以調(diào)試與主機不同指令集的程序,這一特點也被稱為交叉調(diào)試。
(4)由于調(diào)試環(huán)境和被調(diào)試程序的分離,不可避免地引入通信開銷,對調(diào)試效率產(chǎn)生一定影響。
GDB是GNU開源組織發(fā)布的源碼級調(diào)試器,支持多種處理器架構(gòu)和編程語言,在調(diào)試代理的配合下,實現(xiàn)斷點、單步執(zhí)行、查看變量、查看寄存器、查看內(nèi)存、查看堆棧等遠程調(diào)試功能[6]。
GDB與調(diào)試代理通過遠程串行協(xié)議(remote serial protocol,RSP)實現(xiàn)調(diào)試信息交互。RSP是一種基于ASCII碼字符的通信協(xié)議,包括客戶端(RSP client)和服務(wù)器端(RSP server),通常以GDB作為客戶端,以調(diào)試代理作為服務(wù)器端,兩者可以位于相同或不同的計算機上,通過網(wǎng)絡(luò)Socket或RS232串口等方式通信。
RSP以數(shù)據(jù)包的形式傳輸數(shù)據(jù),一個數(shù)據(jù)包包含數(shù)據(jù)信息和校驗碼兩個部分。數(shù)據(jù)信息是一串ASCII碼字符,以“$”字符作為起始標志,以“#”字符作為結(jié)束標志;數(shù)據(jù)信息后面跟隨長度為16位的校驗碼,該校驗碼的值是數(shù)據(jù)信息中所有字符的ASCII碼數(shù)值相加后除以256的余數(shù),用2個十六進制字符表示。
接收方接收到完整的數(shù)據(jù)包后,使用校驗碼對數(shù)據(jù)信息進行校驗,如果接收到的數(shù)據(jù)信息校驗計算無誤,返回“+”字符通知發(fā)送方數(shù)據(jù)包接收完成;如果校驗出錯,則返回“-”字符,通知發(fā)送方重新發(fā)送。發(fā)送方通過接收方返回的響應(yīng)字符判斷數(shù)據(jù)包發(fā)送是否成功。
如果調(diào)試代理暫不支持某個RSP調(diào)試指令,可以返回字符串“$#00”通知GDB,GDB會嘗試使用其他RSP調(diào)試指令來代替不支持的調(diào)試指令完成同樣的功能。然而,要實現(xiàn)GDB的調(diào)試功能,調(diào)試代理必須支持讀寄存器的值(g)、修改寄存器的值(G)、讀內(nèi)存的值(m)、修改內(nèi)存的值(M)、恢復運行(c)、單步執(zhí)行(s)等RSP調(diào)試指令[7]。
IEEE 1149.1標準由聯(lián)合測試行動組(joint test action group,JTAG)提出,因此也被稱為JTAG標準。JTAG標準最初用于芯片測試,現(xiàn)在也常用于對芯片上的軟件進行調(diào)試。
JTAG標準中提出了邊界掃描(boundary-scan)概念,其基本思想是在芯片的輸入輸出管腳上放置一個移位寄存器,稱為邊界掃描寄存器單元(boundary-scan register cell)。芯片正常運行時,這些邊界掃描寄存器單元對芯片來說是透明的,不產(chǎn)生任何影響;當芯片處于測試狀態(tài)時,邊界掃描寄存器單元將芯片和外圍的輸入輸出隔離,芯片的輸入管腳可以通過與之相連的邊界掃描寄存器單元把數(shù)據(jù)加載到該管腳中去,輸出管腳可以通過與之相連的邊界掃描寄存器單元“捕獲(capture)”該管腳上的輸出信號。
此外,通過邊界掃描寄存器單元的相互連接,在芯片的周圍形成一條邊界掃描鏈(boundary-scan chain),在適當?shù)臅r鐘信號和控制信號驅(qū)動下,測試數(shù)據(jù)可以在邊界掃描鏈上串行輸入和輸出。通過邊界掃描寄存器單元和邊界掃描鏈,能夠?qū)π酒妮斎胼敵鲂盘栠M行觀察和控制,實現(xiàn)芯片測試和軟件調(diào)試功能。一種芯片可以同時提供幾條獨立的邊界掃描鏈,以滿足不同的測試要求。
在JTAG標準中,定義了兩類寄存器:數(shù)據(jù)寄存器(data register,DR)和指令寄存器(instruction register,IR)。邊界掃描鏈即是一種重要的數(shù)據(jù)寄存器,用于控制和觀察芯片的輸入輸出;IR用來實現(xiàn)對DR的控制,例如在芯片可供選擇的全部邊界掃描鏈中,通過IR指定一條邊界掃描鏈作為訪問對象[8]。
JTAG設(shè)備內(nèi)部定義了一個狀態(tài)機,稱為TAP控制器。TAP控制器的狀態(tài)通過TCK和TMS兩個輸入引腳進行控制,通過TAP控制器的狀態(tài)變化,完成JTAG指令寄存器的輸入和數(shù)據(jù)寄存器的輸入輸出,從而對芯片內(nèi)部的處理器和外設(shè)進行控制和狀態(tài)獲取,在調(diào)試主機和仿真器軟件的配合下,實現(xiàn)調(diào)試功能。標準的JTAG接口必須至少具有TCK、TDI、TDO和TMS四個引腳,其中TCK為TAP控制器提供時鐘信號驅(qū)動,TMS控制TAP控制器的狀態(tài)轉(zhuǎn)換,TDI為數(shù)據(jù)輸入引腳,TDO為數(shù)據(jù)輸出引腳。此外,還有一個可選引腳RST,用于JTAG設(shè)備的狀態(tài)復位[9]。
調(diào)試環(huán)境的目標平臺為“核高基”國家科技重大專項支持的自主同構(gòu)8核DSP。為了節(jié)約片上資源,將8個DSP內(nèi)核中的JTAG控制器用菊花鏈(daisy chain)的方式連接起來,通過一個JTAG接口進行控制,如圖2所示。
圖2 目標平臺JTAG連接
為了對這一設(shè)計進行支持,每個DSP內(nèi)核的JTAG控制器都支持bypass指令。當某個DSP內(nèi)核不是要調(diào)試的目標內(nèi)核時,通過bypass指令,將位數(shù)為1的bypass寄存器連接在數(shù)據(jù)移入接口TDI和數(shù)據(jù)移出接口TDO之間,為數(shù)據(jù)移入移出提供一條長度最短的通過路徑,以便調(diào)試數(shù)據(jù)快速地通過該DSP內(nèi)核,到達目標DSP內(nèi)核或調(diào)試主機[10]。
目標平臺設(shè)計了自主的調(diào)試協(xié)議,無法使用現(xiàn)有的任何一種軟件開發(fā)環(huán)境進行軟件調(diào)試。該文針對目標平臺的特點和調(diào)試協(xié)議,提出了一種調(diào)試環(huán)境設(shè)計方案。調(diào)試環(huán)境交互界面選擇安裝CDT插件的ECLIPSE平臺,主要功能是提供友好的開發(fā)調(diào)試界面,接收用戶調(diào)試命令輸入,并顯示調(diào)試結(jié)果,如目標機寄存器內(nèi)容、內(nèi)存內(nèi)容、堆棧內(nèi)容及斷點信息等;采用GDB作為調(diào)試器,ECLIPSE平臺集成針對DSP編譯形成的GDB,ECLIPSE平臺與GDB通過標準的Machine Interface(MI)協(xié)議通訊[11];調(diào)試主機駐留唯一的調(diào)試代理軟件,調(diào)試代理通過8個線程使用8個端口分別與8個調(diào)試器建立連接,利用信號量解決通過單一JTAG接口訪問8核DSP的互斥問題;調(diào)試代理利用調(diào)試主機的USB接口和仿真器進行通信。仿真器駐留8核DSP調(diào)試協(xié)議解析程序,該程序作為宿主機調(diào)試代理和被調(diào)試程序之間的媒介存在[12]。
用戶通過ECLIPSE平臺輸入調(diào)試命令,ECLIPSE平臺根據(jù)當前處于活動狀態(tài)的工程,區(qū)分輸入命令的目標平臺,將命令轉(zhuǎn)換為若干MI協(xié)議指令,發(fā)送給相應(yīng)GDB,GDB將MI協(xié)議指令轉(zhuǎn)換為若干RSP指令,通過Socket連接發(fā)送給調(diào)試代理,調(diào)試代理根據(jù)接收到指令的線程區(qū)分指令的目標內(nèi)核,將目標內(nèi)核信息添加到指令中,封裝成為多核調(diào)試協(xié)議指令,通過USB接口發(fā)送給仿真器軟件;仿真器軟件接收多核調(diào)試指令,根據(jù)指令中的目標內(nèi)核信息,區(qū)分指令對應(yīng)的內(nèi)核,將指令解析為指定DSP內(nèi)核的調(diào)試指令+其余7個DSP內(nèi)核的bypass指令,按照JTAG狀態(tài)機的時序要求,通過GPIO端口將解析后的指令數(shù)據(jù)掃描到目標平臺中,同時以移位方式獲取返回結(jié)果;最后仿真器將調(diào)試結(jié)果通過USB接口發(fā)送給調(diào)試主機,經(jīng)ECLIPSE解析后以圖形化方式呈現(xiàn)給用戶[13]。整個遠程調(diào)試系統(tǒng)結(jié)構(gòu)如圖3所示。
圖3 多核DSP遠程調(diào)試系統(tǒng)結(jié)構(gòu)
根據(jù)多核DSP調(diào)試環(huán)境設(shè)計方案,調(diào)試代理創(chuàng)建并啟動8個線程,使用8個端口分別與面向每個DSP內(nèi)核的GDB建立Socket連接。其中一個連接接收到完整的RSP調(diào)試指令后,將其轉(zhuǎn)換為相應(yīng)的多核調(diào)試協(xié)議指令。為避免與其余內(nèi)核的調(diào)試相沖突,需申請全局信號量,獲取到全局信號量后,通過USB接口向仿真器發(fā)送多核調(diào)試協(xié)議指令,等待仿真器軟件返回執(zhí)行結(jié)果;接收到執(zhí)行結(jié)果后,將結(jié)果封裝為RSP數(shù)據(jù)包,通過Socket連接返回給相應(yīng)的GDB;最后釋放全局信號量,一條RSP指令執(zhí)行完畢,等待接收下一條GDB發(fā)送的RSP指令。
DSP內(nèi)核可能由于斷點、異常等原因,由運行狀態(tài)轉(zhuǎn)變?yōu)閽炱馉顟B(tài)。調(diào)試代理軟件通過內(nèi)部變量記錄每個內(nèi)核的狀態(tài),如果一個連接沒有接收到RSP指令,還應(yīng)判斷相應(yīng)內(nèi)核是否處于運行狀態(tài),如果內(nèi)核處于運行狀態(tài),則需獲取全局信號量,通過USB接口向仿真器發(fā)送內(nèi)核狀態(tài)查詢指令,如果該內(nèi)核已經(jīng)轉(zhuǎn)變?yōu)閽炱馉顟B(tài),調(diào)試代理主動向GDB發(fā)送內(nèi)核已掛起信號,最后釋放全局信號量。
其執(zhí)行流程如圖4所示。
圖4 調(diào)試代理執(zhí)行流程
選用ARM架構(gòu)AT91SAM7X512處理器作為仿真器的主控芯片,利用其內(nèi)部集成的USB 2.0全速設(shè)備端口作為與調(diào)試主機連接的USB接口。主控芯片引出5個GPIO引腳,與IEEE1149.1標準中的TDI、TDO、TMS、TCK、RST五個接口信號相對應(yīng),通過緩沖處理芯片HC244SJ與目標平臺對外引出的標準JTAG接口連接??刂菩酒饨?個LED指示燈,分別與TDI、TDO及RST接口對應(yīng)的GPIO引腳串聯(lián),當JTAG接口有信號傳輸時,相應(yīng)的LED燈就會閃爍,起到指示作用,以便實時觀察調(diào)試過程中仿真器與目標平臺之間的通信過程。仿真器硬件設(shè)計如圖5所示。
圖5 仿真器的硬件設(shè)計
仿真器軟件經(jīng)燒寫后存儲在FLASH中。為了提高仿真器的調(diào)試速度,將仿真器軟件搬移到SRAM中運行,設(shè)計了單獨的啟動引導程序(BootLoader)。BootLoader同樣燒寫在FLASH中,是仿真器加電后執(zhí)行的第一段代碼,在完成CPU和相關(guān)硬件的初始化之后,再將仿真器軟件所在的FLASH地址的內(nèi)容,復制到SRAM中,然后跳轉(zhuǎn)到仿真器軟件程序的入口點地址,將仿真器控制權(quán)交給仿真器軟件[14]。
仿真器軟件主要包括USB端點中斷處理和調(diào)試協(xié)議解析處理兩個功能模塊。
USB端點中斷處理模塊通過對端點中斷的處理,將發(fā)送緩沖區(qū)的數(shù)據(jù)發(fā)送到調(diào)試主機,將從調(diào)試主機收到的數(shù)據(jù)寫入接收緩沖區(qū);調(diào)試協(xié)議解析處理模塊完成多核調(diào)試指令的接收、解析和處理,JTAG狀態(tài)機的驅(qū)動,以及DSP調(diào)試協(xié)議的實現(xiàn)等仿真器的核心功能。
5.2.1 USB端點中斷處理
仿真器作為USB設(shè)備端,與調(diào)試主機通過USB接口連接,遵循USB主從通信協(xié)議。每一個USB設(shè)備在正常工作前必須完成主機對它的配置過程,即總線枚舉。USB設(shè)備在總線上共有六種狀態(tài):接入態(tài)、加電態(tài)、默認態(tài)、地址態(tài)、配置態(tài)和掛起態(tài)。當調(diào)試主機與仿真器連接后,開始通過端點中斷進行設(shè)備的總線枚舉過程,仿真器完成總線枚舉后,從配置態(tài)進入掛起態(tài),等待來自調(diào)試主機的多核調(diào)試協(xié)議指令。
在USB設(shè)備端存在以下幾類中斷:幀起始中斷、設(shè)備恢復中斷、設(shè)備掛起中斷和端點中斷,來自調(diào)試主機的指令引起的中斷是端點中斷。端點是USB主機和設(shè)備的數(shù)據(jù)流終點,每個端點僅支持單一方向的數(shù)據(jù)流,按照數(shù)據(jù)流方向分為輸入端點和輸出端點,來自主機的數(shù)據(jù)流止于設(shè)備上的輸出端點,發(fā)往主機的數(shù)據(jù)流則始于設(shè)備上的輸入端點[15-16]。
圖6為端點中斷處理流程。
圖6 仿真器端點中斷處理流程
根據(jù)引起中斷的原因,端點中斷又分為數(shù)據(jù)包接收中斷、數(shù)據(jù)包發(fā)送完成中斷和SETUP命令包接收中斷,通過USB設(shè)備控制器的控制狀態(tài)寄存器來區(qū)分中斷類型。如果中斷類型為數(shù)據(jù)包接收中斷,說明從調(diào)試主機收到了一個數(shù)據(jù)包,此時應(yīng)將數(shù)據(jù)包放入接收緩沖區(qū),判斷是否還有要接收的數(shù)據(jù),如果已接收數(shù)據(jù)的數(shù)量不小于預(yù)期接收數(shù)據(jù)數(shù)量,說明本次數(shù)據(jù)接收任務(wù)已完成,將輸出端點中斷禁用,設(shè)置數(shù)據(jù)接收完成標識變量,通知主程序數(shù)據(jù)接收完成。如果中斷類型為數(shù)據(jù)包發(fā)送中斷,說明上一個數(shù)據(jù)包發(fā)送已完成,此時應(yīng)判斷發(fā)送緩沖區(qū)中是否還有數(shù)據(jù)需要發(fā)送,如果有,則將數(shù)據(jù)加入到發(fā)送隊列;如果沒有數(shù)據(jù)要發(fā)送,說明本次數(shù)據(jù)發(fā)送任務(wù)已完成,將輸入端點中斷禁用,設(shè)置數(shù)據(jù)發(fā)送完成標識變量,通知主程序數(shù)據(jù)發(fā)送完成。如果中斷類型為SETUP命令包接收中斷,說明接收到主機的SETUP命令,SETUP命令主要用于USB主機對設(shè)備進行配置和控制,例如總線枚舉等,不涉及仿真器核心功能的實現(xiàn)。
5.2.2 調(diào)試協(xié)議解析處理
調(diào)試協(xié)議解析處理模塊是仿真器軟件的主程序,其處理流程如圖7所示。在完成USB和GPIO等設(shè)備初始化與總線枚舉后,仿真器與調(diào)試代理進行通信,等待接收并執(zhí)行多核調(diào)試協(xié)議指令。調(diào)試代理先發(fā)送2個字節(jié)的指令長度,然后發(fā)送指令的內(nèi)容。仿真器通過端點中斷接收到指令長度后開始等待接收此長度的指令內(nèi)容。接收完畢后對指令進行解析,識別指令的目標內(nèi)核,將多核調(diào)試協(xié)議指令轉(zhuǎn)化為目標DSP內(nèi)核調(diào)試指令,與其余內(nèi)核的bypass指令進行組合,通過TDI引腳按照TAP狀態(tài)機的時序要求移入內(nèi)核執(zhí)行。DSP內(nèi)核調(diào)試指令執(zhí)行完成后,仿真器將從TDO引腳移出的處理結(jié)果返回給調(diào)試代理,一條多核調(diào)試協(xié)議指令執(zhí)行完畢,等待接收下一條調(diào)試代理發(fā)送的指令。
圖7 仿真器軟件流程
該文提出的面向自主8核DSP調(diào)試環(huán)境的設(shè)計方案,解決了目標平臺缺乏配套軟件調(diào)試手段的實際問題。方案采用自主研發(fā)的軟硬件和開源軟件,具有功能完備、性能良好、安全可控、靈活易擴展等優(yōu)點。該方案能夠集成GCC等編譯鏈接工具,結(jié)合ECLIPSE平臺自身的功能,即可構(gòu)成一個圖形化的軟件集成開發(fā)環(huán)境,實現(xiàn)一體化的工程管理、編譯鏈接和遠程調(diào)試功能,對其他自主同構(gòu)或異構(gòu)多核處理器軟件開發(fā)環(huán)境的設(shè)計具有一定的參考價值。