• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      Arm和T-kernel系統(tǒng)的遠(yuǎn)程調(diào)試工具設(shè)計(jì)

      2018-05-16 09:29:13
      關(guān)鍵詞:宿主機(jī)斷點(diǎn)寄存器

      (大連醫(yī)科大學(xué)附屬第二醫(yī)院 信息中心,大連 116021)

      引 言

      嵌入式系統(tǒng)遠(yuǎn)程調(diào)試工具在嵌入式開發(fā)過程中起著至關(guān)重要的作用,它直接影響開發(fā)效率。國(guó)外在嵌入式調(diào)試器方面一直領(lǐng)先,國(guó)內(nèi)普遍采用國(guó)外的工具,價(jià)格比較昂貴,而適配自主可控的國(guó)產(chǎn)芯片的調(diào)試系統(tǒng)相對(duì)缺乏,這就對(duì)嵌入式開發(fā)環(huán)境提出了新的要求[1]。嵌入式軟件開發(fā)中的遠(yuǎn)程調(diào)試主要有硬件調(diào)試和軟件調(diào)試兩大類,硬件調(diào)試雖然實(shí)時(shí)性強(qiáng),但價(jià)格高昂,通用性差,操作復(fù)雜,這給開發(fā)者應(yīng)用開發(fā)過程帶來(lái)極大不便; 軟件調(diào)試由于其成本低,通用性強(qiáng),因而得到廣泛的應(yīng)用[2]。這種方式通常需要在目標(biāo)系統(tǒng)中駐留代理軟件,宿主機(jī)調(diào)試器與目標(biāo)機(jī)代理軟件通信,調(diào)試代理實(shí)現(xiàn)對(duì)被調(diào)試程序的控制[3]。

      本文硬件選擇了Arm架構(gòu)平臺(tái),設(shè)計(jì)并實(shí)現(xiàn)了一款基于搶占式實(shí)時(shí)操作系統(tǒng)T-kernel的軟件遠(yuǎn)程調(diào)試工具,T-kernel是構(gòu)筑于T-Engine之上的標(biāo)準(zhǔn)化開源實(shí)時(shí)操作系統(tǒng)內(nèi)核,由TRON(the real-time operating nucleus) 發(fā)展而來(lái)[4],而TRON是日本東京大學(xué)坂村健博士于1984年提出的計(jì)算機(jī)操作系統(tǒng)規(guī)范,T-kernel由于其實(shí)時(shí)性及開源性,已經(jīng)被安裝到了全球約40億臺(tái)家用電子產(chǎn)品當(dāng)中,占全球微處理器操作系統(tǒng)市場(chǎng)約60%[5]的份額。同時(shí)Arm架構(gòu)的微處理器更是占據(jù)了當(dāng)今移動(dòng)終端核心的半壁江山。因此基于兩者結(jié)合的遠(yuǎn)程調(diào)試工具的設(shè)計(jì)顯得更具有通用性的意義。

      1 整體結(jié)構(gòu)設(shè)計(jì)概述

      宿主機(jī)方面采用Linux系統(tǒng),使用Arm-elf-gdb打開經(jīng)過Arm交叉編譯器編譯出來(lái)的帶有調(diào)試信息的T-kernel系統(tǒng)應(yīng)用程序文件。宿主機(jī)端作為請(qǐng)求方,通過通用串行接口UART與目標(biāo)機(jī)相連,向目標(biāo)機(jī)遠(yuǎn)程發(fā)送調(diào)試命令,并接收相應(yīng)的反饋,實(shí)現(xiàn)交互。整體結(jié)構(gòu)概要設(shè)計(jì)如圖1所示。

      圖1 整體結(jié)構(gòu)概要設(shè)計(jì)

      目標(biāo)機(jī)中T-kernel系統(tǒng)下建立調(diào)試命令服務(wù)端監(jiān)聽任務(wù),實(shí)時(shí)監(jiān)聽來(lái)自宿主機(jī)通過串口發(fā)送來(lái)的調(diào)試命令,一旦接收到調(diào)試請(qǐng)求命令,監(jiān)聽任務(wù)即陷入Arm exception系統(tǒng)狀態(tài),通過T-monitor中事先注冊(cè)好的異常處理程序接管系統(tǒng)執(zhí)行,進(jìn)行相應(yīng)任務(wù)的解析及具體調(diào)試命令的執(zhí)行,最后將結(jié)果通過串口反饋給宿主機(jī),完成整體調(diào)試通信。

      2 目標(biāo)機(jī)執(zhí)行流程

      目標(biāo)機(jī)中T-kernel系統(tǒng)在啟動(dòng)之初,需要將Arm exception注冊(cè)進(jìn)T-monitor中,T-monitor是T-kernel的啟動(dòng)部分,啟動(dòng)系統(tǒng)并創(chuàng)建調(diào)試監(jiān)聽任務(wù),這里需要注意的是要將該監(jiān)聽任務(wù)的優(yōu)先級(jí)適當(dāng)調(diào)高,以便使遠(yuǎn)程調(diào)試命令及時(shí)得到服務(wù)。任務(wù)創(chuàng)建成功后即可實(shí)時(shí)監(jiān)聽串口發(fā)來(lái)的數(shù)據(jù)字符,根據(jù)RSP(Remote Serial Protocol)協(xié)議規(guī)則進(jìn)行字符解析,當(dāng)解析出完整的“$#”結(jié)構(gòu)字符串即表示接收到了完整的遠(yuǎn)程調(diào)試命令[6]。目標(biāo)機(jī)執(zhí)行流程如圖2所示。

      圖2 目標(biāo)機(jī)執(zhí)行流程

      本文設(shè)計(jì)的監(jiān)聽任務(wù)只負(fù)責(zé)解析一個(gè)遠(yuǎn)程調(diào)試啟動(dòng)命令。當(dāng)宿主機(jī)由串口虛擬終端ttyS1發(fā)送啟動(dòng)調(diào)試命令“target remote/dev/ttyS1”時(shí),監(jiān)聽任務(wù)可以接收到“$qSupported:qRelocInsn+#9a”字符信息,即表示遠(yuǎn)程調(diào)試已由宿主機(jī)發(fā)起,此時(shí)目標(biāo)機(jī)應(yīng)該進(jìn)入調(diào)試模式。這里利用Arm處理器的未定義指令異常模式,在監(jiān)聽任務(wù)中通過內(nèi)嵌預(yù)設(shè)好的Arm未定義異常指令,使系統(tǒng)陷入啟動(dòng)之初注冊(cè)入T-monitor中的undefined exception程序。至此系統(tǒng)進(jìn)入異常處理模式,并在此模式下通過串口與上位機(jī)進(jìn)行通信,接收并進(jìn)一步解析開發(fā)者的調(diào)試命令,將不同的命令信息反饋給上位機(jī),完成對(duì)特定內(nèi)存、特定寄存器的存取察看工作,完成斷點(diǎn)插入和刪除等一系列工作以達(dá)到開發(fā)調(diào)試的目的。

      3 關(guān)鍵結(jié)構(gòu)解析

      3.1 Debug task結(jié)構(gòu)設(shè)計(jì)

      圖3 Debug task結(jié)構(gòu)設(shè)計(jì)

      調(diào)試入口的Debug task主要完成兩個(gè)工作:一是負(fù)責(zé)利用串口與宿主機(jī)進(jìn)行通信,二是接收到調(diào)試啟動(dòng)命令后跳轉(zhuǎn)到未定義異常入口。因?yàn)門-kernel是搶占式內(nèi)核,任務(wù)調(diào)度由優(yōu)先級(jí)決定,高優(yōu)先級(jí)任務(wù)具有絕對(duì)優(yōu)勢(shì),因此,為了使啟動(dòng)調(diào)試命令能夠及時(shí)得到響應(yīng),Debug task的優(yōu)先級(jí)被設(shè)計(jì)成高于一般業(yè)務(wù)task,T-kernel系統(tǒng)優(yōu)先級(jí)數(shù)值越小級(jí)別越高,這里設(shè)置為2,因?yàn)橥ㄐ艛?shù)據(jù)量小,故??臻g設(shè)置為4 096。在操作系統(tǒng)啟動(dòng)之初,Debug task就得到CPU使用權(quán),并開始監(jiān)聽串口,如果串口沒有數(shù)據(jù),則會(huì)因?yàn)榈却Y源而被系統(tǒng)掛起并讓出CPU使用權(quán),當(dāng)宿主機(jī)啟動(dòng)調(diào)試,數(shù)據(jù)發(fā)送到下位機(jī)串口會(huì)引起中斷而喚醒該任務(wù),從而解析命令并順利產(chǎn)生異常,進(jìn)入T-monitor中預(yù)先注冊(cè)好的異常處理程序中。Debug task結(jié)構(gòu)設(shè)計(jì)如圖3所示。

      3.2 異常處理程序流程

      該注冊(cè)函數(shù)處于T-kernel系統(tǒng)的T-monitor中,異常入口處首先將寄存器r8~r11全部入棧,這些寄存器后續(xù)需要使用,因此先入棧保存,然后將PC寄存器地址減8字節(jié),并將內(nèi)容取出進(jìn)行判斷,即為發(fā)生異常時(shí)的地址內(nèi)容。此處注意,本文使用的Arm處理器采用了五級(jí)流水線機(jī)制,當(dāng)?shù)谌A段PC寄存器值取指時(shí),第一階段的指令執(zhí)行,所以PC值為當(dāng)前執(zhí)行指令地址值加8個(gè)字節(jié),也就是說(shuō),對(duì)Arm指令集來(lái)說(shuō),PC指向當(dāng)前指令的下兩條指令的地址,因此想要得到異常發(fā)生時(shí)的地址內(nèi)容,必須要PC地址減去8個(gè)字節(jié),此處具體還要看使用的是芯片的哪種設(shè)計(jì)方式,注意其差異。

      圖4 Bootloader中注冊(cè)程序流程

      同時(shí),這里還可以采用另外一種方案,即取出R14寄存器減4字節(jié)的地址內(nèi)容,因?yàn)樵贏rm體系結(jié)構(gòu)中,R14即為鏈接寄存器,就是用來(lái)存儲(chǔ)子程序的返回地址,因此它之前的地址內(nèi)容即為產(chǎn)生異常的指令。取出該值后進(jìn)行判斷,來(lái)區(qū)分產(chǎn)生異常的指令是否為預(yù)設(shè)的異常指令或是其它的未定義指令異常情況,以進(jìn)入不同的處理分支。如果是預(yù)設(shè)的異常指令,則繼續(xù)將r0~r7通用寄存器內(nèi)容保存到預(yù)設(shè)好的全局變量中,然后取出spsr,spsr寄存器用于保存cpsr的狀態(tài),根據(jù)此寄存器的最低5位可以判定出發(fā)生異常前的系統(tǒng)模式,因?yàn)锳rm處理的不同工作模式下,寄存器R8~R14是與模式相關(guān)的,具有非通用性,所以在保存它們之前需要判斷出發(fā)生異常時(shí)的工作模式,并切換到該模式下,將R8~R14這些寄存器內(nèi)容取出并保存到預(yù)設(shè)的全局變量結(jié)構(gòu)體中,以便異常返回后恢復(fù)異常發(fā)生時(shí)的處理器工作狀態(tài)。Bootloader中注冊(cè)程序流程如圖4所示。

      3.3 調(diào)試命令實(shí)現(xiàn)方法

      調(diào)試命令實(shí)現(xiàn)流程如圖5所示。

      圖5 調(diào)試命令實(shí)現(xiàn)流程

      進(jìn)入異常結(jié)構(gòu)后,對(duì)于上位機(jī)的諸多調(diào)試命令,最終經(jīng)過RSP協(xié)議均被解析為圖5中的一系列命令?!甮’命令讀取寄存器,將r0~R15包括fps和cpsr均打包發(fā)送回主機(jī)端?!瓽’命令將接收到的將要修改的數(shù)據(jù)回寫到相應(yīng)寄存器中;‘m/M’分別對(duì)指定內(nèi)存地址進(jìn)行讀/寫操作;‘c’命令用于使停止在某異常處理狀態(tài)的程序繼續(xù)執(zhí)行;‘s’命令用于系統(tǒng)進(jìn)行單步執(zhí)行操作。單步執(zhí)行的處理,實(shí)際上就是向下一地址插入斷點(diǎn)命令的過程,即插入一條未定義指令,該指令就是Debug task中啟動(dòng)調(diào)試時(shí)預(yù)設(shè)的內(nèi)嵌指令。程序維護(hù)一個(gè)數(shù)據(jù)結(jié)構(gòu),分別用于存儲(chǔ)斷點(diǎn)地址、斷點(diǎn)內(nèi)容以及斷點(diǎn)標(biāo)志。每次進(jìn)入exception handler之后,首先判斷之前是否存在已經(jīng)運(yùn)行過的斷點(diǎn),如果有,則將其地址中的內(nèi)容恢復(fù),然后再根據(jù)異常發(fā)生時(shí)保存的PC寄存器內(nèi)容判斷程序?qū)⒁\(yùn)行的下一個(gè)地址,并將其地址及內(nèi)容取出保存,替換為異常指令,最后返回程序繼續(xù)運(yùn)行,這樣程序運(yùn)行到下一地址時(shí)即再次陷入異常,從而達(dá)到單步調(diào)試的目的。因此,不管在宿主機(jī)端一次插入多少個(gè)斷點(diǎn),實(shí)際在目標(biāo)機(jī)端都是一次只恢復(fù)一個(gè)斷點(diǎn),再插入下一個(gè),直到程序運(yùn)行結(jié)束。宿主機(jī)只是維護(hù)了一個(gè)斷點(diǎn)集合,只要這個(gè)斷點(diǎn)集合不被刪除,程序就會(huì)循環(huán)不斷地進(jìn)入異常,完成開發(fā)者的調(diào)試工作。

      3.4 分支預(yù)測(cè)功能解析

      對(duì)于單步執(zhí)行的斷點(diǎn)插入工作,比較復(fù)雜的問題是下一地址的獲取方法,Arm指令的一般編碼格式如下:

      3128272524 212019 1615 12 110CondOpcodeSRnRdShifter_operand

      其中:Cond: 指令執(zhí)行的條件編碼; Opcode: 指令操作編符碼;S: 決定指令的操作是否影響CPSR值;Rn: 包含第一個(gè)操作數(shù)的寄存器編碼;Rd: 目標(biāo)寄存器編碼;Shifter_operand: 表示第二個(gè)操作數(shù)[7]。

      Arm指令大致格式如此,但不同的指令有其差別,經(jīng)過對(duì)與跳轉(zhuǎn)有關(guān)指令尋址方式進(jìn)行分析,當(dāng)程序進(jìn)入異常時(shí),可以通過取出 PC寄存器內(nèi)容的bit[27:25]三位進(jìn)行過濾,并根據(jù)其差異對(duì)照Arm指令集中與跳轉(zhuǎn)有關(guān)的指令編碼結(jié)構(gòu),可以判斷出指令集中可能產(chǎn)生跳轉(zhuǎn)的命令,再由特定的指令字段中找到目標(biāo)地址寄存器,從而定位實(shí)際地址,或由Rd、Rn、Shifter_operand中的一個(gè)或幾個(gè)組合而生成,具體取決于不同指令的編碼。另外還需要額外對(duì)條件域進(jìn)行判斷,Cond域中的條件編碼數(shù)據(jù)決定指令的跳轉(zhuǎn)邏輯。BX/B/BL/BLX均為跳轉(zhuǎn)地址。B/BL跳轉(zhuǎn)指令結(jié)構(gòu)如下:

      31 28 27262524230Cond1 0 1LSigned_immed_24

      在判斷Cond域的前提下,該指令的目標(biāo)跳轉(zhuǎn)地址是將指令中的24位帶符號(hào)的立即數(shù)擴(kuò)展為32位,注意是帶符號(hào)位進(jìn)行擴(kuò)展,然后將這個(gè)32位立即左移兩位,將得到的值再加到PC寄存器中即可。

      BLX指令有兩種結(jié)構(gòu),其一如下所示:

      31 28 2726252423011111 0 1HSigned_immed_24

      該指令的目標(biāo)地址同樣需要擴(kuò)展并左移兩位,但結(jié)果需要再加上H位值左移一位后的數(shù)值,再加到PC寄存器中。值得注意的是需要對(duì)該指令的最高4位進(jìn)行二次確認(rèn)是否為全1,以此來(lái)區(qū)分B/BL指令。

      對(duì)于BLX的第二種指令結(jié)構(gòu),如下所示:

      31 28 27 2019 8 7 4 30Cond00010010應(yīng)為00011Rm

      該指令的Rm為寄存器號(hào),在這個(gè)寄存器中即保存著跳轉(zhuǎn)的目標(biāo)地址。在此之前除對(duì)bit[27:25]確認(rèn)為全0后,還需要進(jìn)一步確認(rèn)bit[24:20],以確定是否為該指令。

      BX的指令格式與BLX2類似,如下所示:

      31 2827 2019 8 7 4 3 0Cond00010010應(yīng)為00001Rm

      需要對(duì)bit[5]進(jìn)行判斷以進(jìn)行區(qū)分,Rm寄存器中保存著跳轉(zhuǎn)的目標(biāo)地址。

      對(duì)于內(nèi)存讀取指令LDR、LDM,當(dāng)PC寄存器作為其目標(biāo)地址時(shí),指令從內(nèi)存中讀取的字?jǐn)?shù)據(jù)將被當(dāng)作目標(biāo)地址值,指令執(zhí)行后程序?qū)哪繕?biāo)地址處開始執(zhí)行,也起到了跳轉(zhuǎn)程序的作用。LDR指令格式如下所示:

      31 28272625 24232221 201916 15 12110Cond00IPU0W1RnRdAddress

      對(duì)于第一操作數(shù),當(dāng)PC作為基址寄存器Rn時(shí),內(nèi)存基地址為當(dāng)前指令地址加8字節(jié)的偏移量。對(duì)于第二操作數(shù),首先需要判斷bit[25]即I位,如果為1,Address則由索引寄存器Rm,即bit[3:0]與其它移位值共同組合而成;I位如果為0,Address整體則為Rn的偏移值offset_12。無(wú)論對(duì)于索引寄存器Rm中存儲(chǔ)的值,還是直接偏移值offset_12,Rn對(duì)其偏移的方向都由bit[23]決定,當(dāng)U位為1時(shí),加上偏移量,當(dāng)U位為0時(shí),則要減去偏移量,同時(shí)偏移量的生成也有需要Rm經(jīng)過移位操作后得到的結(jié)果。

      LDR指對(duì)單個(gè)內(nèi)存單元向單個(gè)寄存器傳送數(shù)據(jù),而LDM則可以完成批量?jī)?nèi)存數(shù)據(jù)到一組寄存器的數(shù)據(jù)傳輸工作。LDM指令格式如下所示:

      31 2827 2524 23 22 21 2019 1615 0Cond100PUSWLRnRegisterlist

      Register list分別對(duì)應(yīng)r0~r15寄存器,其中編號(hào)低的寄存器對(duì)應(yīng)內(nèi)存區(qū)域的低地址,編號(hào)高的對(duì)應(yīng)高地址。Rn中存放連續(xù)內(nèi)存區(qū)域的最低地址值。與LDR類似,也有向上偏移和向下偏移之分。這里不再贅述。

      最后一類為數(shù)據(jù)處理指令,第一操作數(shù)Rn的獲取方式與LDR指令獲取方式相同,第二操作數(shù)需要首先判斷bit[25],如果為1,那么指令的操作數(shù)為直接的立即數(shù);如果為0,則需要索引寄存器Rm參與,即偏移值由Rm寄存器中存儲(chǔ)的指定操作數(shù)經(jīng)過相應(yīng)的移位操作獲得。

      結(jié) 語(yǔ)

      本文介紹了關(guān)于搶占式實(shí)時(shí)嵌入式系統(tǒng)的遠(yuǎn)程調(diào)試功能的設(shè)計(jì)思想,并解析了實(shí)現(xiàn)過程,詳述了調(diào)試任務(wù)的設(shè)計(jì)及調(diào)試功能的實(shí)現(xiàn)方式。宿主機(jī)采用了安裝在VMware8.0上的centOS 7.0操作系統(tǒng)以及Arm_elf_gdb工具共同完成,目標(biāo)機(jī)Arm芯片采用CXD3175。圖6、圖7為部分已經(jīng)驗(yàn)證過的可支持的命令以及節(jié)選的調(diào)試日志。由于內(nèi)容較多,故不全部列舉。

      圖6 可支持的調(diào)試命令節(jié)選

      圖7 驗(yàn)證日志節(jié)選

      參考文獻(xiàn)

      [1] 余梓奇,章建雄,馬鵬,等.基于OpenOCD和DAP的嵌入式遠(yuǎn)程調(diào)試系統(tǒng)研究與設(shè)計(jì)[J].電子設(shè)計(jì)工程,2017,25(11):149-153.

      [2] 趙俊濤,詹瑾瑜.嵌入式內(nèi)核遠(yuǎn)程調(diào)試系統(tǒng)的研究與應(yīng)用[J].計(jì)算機(jī)應(yīng)用與軟件, 2015,32(8):211-214.

      [3] 殷紹劍,雷航,詹瑾瑜.嵌入式遠(yuǎn)程調(diào)試原理研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2014(6):240-241.

      [4] 坂村健.源碼開放的嵌入式實(shí)時(shí)操作系統(tǒng)T-Kernel[M].北京:北京航空航天大學(xué)出版社,2005.

      [5] 李傳煌,王偉明.T-Kernel任務(wù)調(diào)度的實(shí)時(shí)性分析[J].計(jì)算機(jī)工程,2006,32(16):58.

      [6] Bill Gatliff.Embedding with GNU:the gdb Remote serial Protocol[J].Embedded System Programming,1999(11):108-113.

      [7] 杜春雷.ARM體系結(jié)構(gòu)與編程[M].北京:清華大學(xué)出版社,2003.

      [8] 蔣龍.基于GDB的嵌入式多任務(wù)調(diào)試器的設(shè)計(jì)實(shí)現(xiàn)與集成[D].杭州:浙江大學(xué),2014.

      [9] 殷紹劍.嵌入式多線程遠(yuǎn)程調(diào)試器研究與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2013.

      任玉帥(工程師),主要研究方向?yàn)榍度胧杰浖绦蛟O(shè)計(jì)。

      猜你喜歡
      宿主機(jī)斷點(diǎn)寄存器
      Lite寄存器模型的設(shè)計(jì)與實(shí)現(xiàn)
      一類無(wú)限可能問題的解法
      虛擬網(wǎng)絡(luò)實(shí)驗(yàn)室在農(nóng)村職校計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)教學(xué)中的應(yīng)用研究
      嵌入式計(jì)算機(jī)軟件測(cè)試關(guān)鍵技術(shù)的思考
      分簇結(jié)構(gòu)向量寄存器分配策略研究*
      主導(dǎo)電回路發(fā)生斷點(diǎn)故障判斷方法探討
      嵌入式計(jì)算機(jī)軟件測(cè)試關(guān)鍵技術(shù)研究
      在不連接網(wǎng)線的情況下Windows與VM之間如何ping通
      高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
      TKScope仿真調(diào)試Cortex-M3內(nèi)核的高級(jí)手段
      临泉县| 霍城县| 象州县| 冕宁县| 临邑县| 西安市| 浮山县| 太保市| 凤庆县| 沾化县| 白河县| 子洲县| 昌黎县| 突泉县| 蛟河市| 南开区| 公主岭市| 日土县| 武邑县| 博白县| 金溪县| 呈贡县| 龙泉市| 图木舒克市| 乌拉特后旗| 广州市| 合江县| 乡宁县| 西贡区| 怀远县| 兴山县| 东阿县| 普安县| 栾城县| 寿阳县| 嘉义县| 隆子县| 昌乐县| 灵山县| 鄯善县| 马公市|