<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > CISC處理器調試系統的設計實(shí)現,詳細軟硬件架構、流程、代碼

CISC處理器調試系統的設計實(shí)現,詳細軟硬件架構、流程、代碼

作者: 時(shí)間:2017-06-04 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/201706/348714.htm
  1. 前言

隨著(zhù)嵌入式的不斷發(fā)展,在各個(gè)領(lǐng)域的應用越來(lái)越廣泛,由于嵌入式系統的專(zhuān)用性很強,所以針對不同的應用的嵌入式軟件的開(kāi)發(fā)在嵌入式系統開(kāi)發(fā)中所占的比重越來(lái)越大。嵌入式系統的開(kāi)發(fā)主要包括兩個(gè)部分硬件設計和軟件設計。軟件設計的步驟主要有源碼編輯、源碼編譯、嵌入式操作系統的配置、程序下載和調試。由于嵌入式系統的資源有限不可能在嵌入式系統的硬件平臺上集成自身的軟件開(kāi)發(fā)環(huán)境,所以嵌入式的軟件開(kāi)發(fā)的通常采用交叉編譯和調試的方式。調試是保證程序質(zhì)量的重要手段之一,可以驗證程序是否滿(mǎn)足預期的要求和檢查程序存在的bug。交叉的開(kāi)發(fā)方式采用宿主機和目標機的結構。宿主機一般采用PC機,將嵌入式系統的軟件開(kāi)發(fā)環(huán)境配置在PC機上。宿主機和目標機之間通過(guò)串口、并口和網(wǎng)線(xiàn)等建立連接,不僅僅是物理連接還有邏輯連接。在交叉開(kāi)發(fā)過(guò)程中宿主機和目標機通過(guò)這種連接進(jìn)行交互,完成目標程序的編譯下載和調試。

嵌入式系統的開(kāi)發(fā)主要針對硬件系統中的微處理器的嵌入式軟件的開(kāi)發(fā),嵌入式系統的軟件調試也是針對微處理器的調試?,F在微電子技術(shù)飛速發(fā)展,處理器生產(chǎn)工藝也不斷提高,微處理器芯片的集成度更高、運行頻率更高,所以對調試的要求更高。單單采用PC機上的軟件調試器和軟件調試代理已經(jīng)很難適應這些新的變化,將調試功能轉移到硬件部分為嵌入式軟件的開(kāi)發(fā)提供更好的保障和支持,實(shí)現成本也比較低。微處理器芯片中集成支持調試的硬件邏輯已經(jīng)逐漸成為趨勢。

在板級的測試和調試領(lǐng)域,為了更好的支持對電路物理節點(diǎn)的訪(fǎng)問(wèn),JTAG標準已經(jīng)被很多芯片生產(chǎn)廠(chǎng)商所采用。JTAG標準最早的提出是為了檢測印刷電路板的元件焊接問(wèn)題,通過(guò)在電路中引入邊界掃描單元所組成的邊界掃描鏈來(lái)完成對電路節點(diǎn)的訪(fǎng)問(wèn)?,F在JTAG標準也被應用于嵌入式軟件的調試過(guò)程中,用于與硬件調試邏輯交互提供通用的調試接口。

  1. 總體方案設計

圖1 系統結構框圖

整個(gè)分為四部分PC機上層控制臺,USB-JTAG,OCD(On Chip Debugger)以及調試的目標處理器CPU。

  1. 系統硬件

  1. USB傳輸

USB是以串行傳輸的方式傳輸數據,首先使用FTDI公司的USB串并轉換芯片FT245R將USB串行數據轉換為并行數據,然后USB-JTAG根據接收到的數據按照JTAG協(xié)議輸出TAP信號。USB-JTAG的結構如圖1所示。

圖 1 協(xié)議轉換器的結構

USB-JTAG協(xié)議轉換器與FT245R之間除了有8位的數據Data[7:0]的傳輸,還有四個(gè)握手信號,分別是nRXF、nTXE、nRD和WR,如圖1所示。nRXF是讀FIFO_TX允許信號,nTXE是寫(xiě)FIFO_RX允許信號,還有讀FIFO_TX信號nRD和寫(xiě)FIFO_RX信號WR。當nRXF為低電平時(shí)說(shuō)明FIFO_TX不為空,USB-JTAG協(xié)議轉換器可以從中讀出數據,此時(shí)USB-JTAG協(xié)議轉換器可以通過(guò)發(fā)送nRD信號從FIFO_TX讀取數據;同樣當nTXE信號有效的時(shí)候表明FIFO_RX還有空間,此時(shí)USB-JTAG協(xié)議轉換器可以使WR信號有效往FIFO_RX中寫(xiě)入數據。USB-JTAG協(xié)議轉換器對FIFO_TX和FIFO_RX的讀寫(xiě)操作都是以字節為單位。

FT245R內部有兩個(gè)FIFO分別為FIFO TX Buffer和FIFO RX Buffer,FIFO TX Buffer負責存放接收從PC機發(fā)送來(lái)的數據,FIFO RX Buffer負責接收從USB-JTAG協(xié)議轉換器發(fā)送來(lái)的數據,為了區分稱(chēng)之為FIFO_TX和FIFO_RX。FT245R芯片的內部結構如圖2所示。

圖2 FT245R芯片的內部結構

  1. SPARTAN-3E開(kāi)發(fā)板

采用xilinx的SPARTAN-3E開(kāi)發(fā)板,將目標處理器與的硬件邏輯還有協(xié)議轉換器中的JTAG信號的生成功能都集成到該開(kāi)發(fā)板的FPGA上。系統如圖3所示。

圖3

  1. 結構

圖4 片上調試器結構

TAP控制器掌管JTAG協(xié)議的狀態(tài)機,控制OCD與USB-JTAG協(xié)議轉換器之間的數據和指令的移入移出。TAP(Test Access Port)包含四個(gè)引腳用來(lái)控制指定的操作。這四個(gè)引腳分別為T(mén)MS,TCK,TDI,TDO。TAP控制器內部采用標準的JTAG協(xié)議狀態(tài)機來(lái)控制TAP的數據通路,包括指令寄存器掃描鏈和數據寄存器掃描鏈的選擇以及掃描鏈數據的傳輸。

寄存器包括邊界掃描寄存器、BYPASS寄存器、斷點(diǎn)寄存器和指令寄存器。邊界掃描寄存器在此處是為讀取處理器輸入輸出引腳預留的擴展寄存器;BYPASS寄存器是位寬為1的寄存器,當在多個(gè)器件或模塊串聯(lián)的時(shí)候用該寄存器來(lái)旁路當前器件或模塊;指令寄存器主要用來(lái)存放對CPU進(jìn)行調試的相應調試指令。

掃描鏈包括寫(xiě)PC掃描鏈和自定義數據掃描鏈。寫(xiě)PC掃描鏈是為了寫(xiě)入PC值而設計的掃描鏈,而通過(guò)自定義數據掃描鏈可以讀出處理器內部的狀態(tài)和數據。

處理器運行控制模塊是片上調試器的核心部件,負責調試指令的譯碼以及讀CPU寄存器、復位、斷點(diǎn)設置檢測和處理器運行控制,還有寫(xiě)CPU內部程序計數器PC等調試功能的實(shí)現。

  1. 處理器運行控制模塊

處理器運行控制模塊是片上調試器的核心部件,負責指令譯碼和根據當前指令和CPU的運行狀態(tài)進(jìn)行機器指令或者微指令的單步和斷點(diǎn)的判定,并且根據判定結果控制CPU的運行。指令譯碼就是根據PC上層平臺發(fā)送到指令寄存器中的指令來(lái)產(chǎn)生相應的控制信號,直接通過(guò)這些控制信號控制CPU的運行、停止和復位等。設計了9條指令,分別為:

1)SREAD:CPU停止,并且此時(shí)選通CPU內部掃描寄存器數據鏈讀出CPU內部主要寄存器的值。

2)STEP:微指令的單步,CPU運行一條微指令然后停下來(lái)。

3)MSTP:機器指令的單步,CPU運行一條機器指令然后停下來(lái)。

4)BPSET:斷點(diǎn)設置,該指令只負責產(chǎn)生斷點(diǎn)設置所需要的相應控制信號,并不負責斷點(diǎn)數據的寫(xiě)入。實(shí)際的斷點(diǎn)數據是用戶(hù)通過(guò)PC機的上層工具設置以后,再進(jìn)行一個(gè)BPR的數據寫(xiě)入來(lái)完成的。

5)RUN:CPU運行指令。

6)BRUN:斷點(diǎn)運行,在斷點(diǎn)設置完成以后,發(fā)送該指令來(lái)使CPU運行。

7)RESET:復位指令,使CPU復位。

8)WPC:寫(xiě)PC指令,為用戶(hù)提供對CPU內部程序計數器PC值進(jìn)行寫(xiě)入的功能,以滿(mǎn)足某些用戶(hù)的特殊需求。

9)STOP:CPU停止指令。

上面所描述的9條指令, 其中BPSET和BPRUN指令是兩條相互依賴(lài)的調試指令,兩條指令聯(lián)合完成斷點(diǎn)調試功能。其他的指令都是一條指令完成相應的調試功能。

  1. 斷點(diǎn)設置和檢測

首先要通過(guò)外部來(lái)設置斷點(diǎn)值,硬件部分要設計一個(gè)斷點(diǎn)寄存器BPR用來(lái)存放用戶(hù)設置的機器指令斷點(diǎn)或者微指令斷點(diǎn)值,該寄存器位寬為24,其中低18位為有效數據位,高6位作為預留的擴展位。通過(guò)邊界掃描的方式將斷點(diǎn)值串行的移入到斷點(diǎn)寄存器BPR中。

BPR[17:16]兩位為標志位用來(lái)進(jìn)行斷點(diǎn)類(lèi)型的區分,當BPR[17:16]=00時(shí)表明要寫(xiě)入的是微指令斷點(diǎn),此時(shí)BPR[8:0]為要寫(xiě)入的微指令的斷點(diǎn)值即斷點(diǎn)微地址;當BPR[17:16]=01時(shí)表示要寫(xiě)入的是機器指令斷點(diǎn),此時(shí)BPR[15:0]為要寫(xiě)入的機器指令的斷點(diǎn)值即內存機器指令的地址。

斷點(diǎn)的檢測首先根據標志位來(lái)區分斷點(diǎn)類(lèi)型,是微指令斷點(diǎn)還是機器指令斷點(diǎn)。當標志位為00時(shí),將斷點(diǎn)值與微指令地址進(jìn)行比較,其值一致時(shí)產(chǎn)生斷點(diǎn)觸發(fā)信號;當標志位為01時(shí),將斷點(diǎn)值與PC寄存器中的機器指令地址進(jìn)行比較,如果一致同樣產(chǎn)生斷點(diǎn)觸發(fā)信號。

  1. PC值的寫(xiě)入

處理器調試的過(guò)程中,為了能夠隨時(shí)控制處理器所要執行的指令,需要設置PC(程序計數器)值即所要執行的指令的地址。采用邊界掃描技術(shù)來(lái)實(shí)現該功能,設計一條掃描鏈通過(guò)該掃描鏈將要設置的PC值寫(xiě)入到PC寄存器中,掃描鏈的結構如圖5所示。

圖5 寫(xiě)PC掃描鏈

由于內部的寄存器在寫(xiě)入和讀出時(shí)都有相應的使能信號,所以在寫(xiě)入PC值的時(shí)候需要使PC的使能信號PCce有效,而這些寄存器的使能信號的產(chǎn)生是由微指令譯碼得來(lái)的,如果要修改微指令會(huì )影響到其他寄存器的使能控制存在一定的風(fēng)險。

為了解決這個(gè)問(wèn)題可以有兩種方法可供選擇:

1、將uIR數據讀出,PC寫(xiě)操作完成以后再寫(xiě)回

該方法是先將uIR內部的內容讀出保存好,然后寫(xiě)入帶有PC寄存器使能控制信號微指令,當PC值正確寫(xiě)入以后再將原來(lái)保存的uIR的值還原到uIR寄存器中。

2、引入偽微指令寄存器用來(lái)在寫(xiě)入PC值取代uIR輸出微指令

該方法是在微指令寄存器uIR到微指令譯碼模塊uIR_Decoder之間加入一個(gè)掃描寄存器BSC_uIR,稱(chēng)之為偽微指令寄存器,這個(gè)寄存器在保證不影響uIR的前提下產(chǎn)生PCce信號。當寫(xiě)入PC值時(shí)首先選中該掃描鏈,然后將要寫(xiě)入PC的數據移入BSC_PC_A中,PCce有效則將BSC_PC_A中數據更新到PC中,完成PC的寫(xiě)操作。

第一種方法操作起來(lái)比較繁瑣并且對軟件的設計要求也比較高,在PC機和硬件平臺指令就會(huì )存在反復傳送數據的局面增加了數據出錯的幾率。而第二種方法實(shí)施起來(lái)比較簡(jiǎn)單,并且只要將需要的微指令和要寫(xiě)入的PC值一起進(jìn)行一次寫(xiě)操作就可以完成,還保證了uIR寄存器中原有的微指令保持不變。因此本文采用了第二種方法。

  1. 處理器內部狀態(tài)讀出

處理器內部寄存器反映處理器內部運行的狀態(tài)和當前一些主要數據,在調試過(guò)程中必須能夠將這些數據讀回給用戶(hù)。這樣就需要在處理器內部構建一條自定義數據掃描鏈,當執行處理器內部數據讀出調試功能時(shí)先選中該掃描鏈,然后將該掃描鏈內部數據讀回到PC機上層控制臺。處理器內部自定義數據掃描鏈的結構如圖6所示。

圖 6 自定義數據掃描鏈

構建數據掃描鏈可以考慮在在寄存器的輸入或者輸出線(xiàn)上加邊界掃描單元的方法來(lái)捕獲數據,而不直接對寄存器本身進(jìn)行操作,這樣就將片上調試器對CPU的侵入性降到最低,保證了CPU內部數據通路的獨立性。

由于在處理器內部寄存器的值的更新都有嚴格的時(shí)序控制,所以將掃描寄存器加在寄存器的輸入線(xiàn)和輸出線(xiàn)上是有區別的。這些寄存器輸入線(xiàn)上的數據要存入到寄存器中在下一個(gè)時(shí)鐘周期輸出才會(huì )生效,例如IR中指令輸出到微控制部件去譯碼才會(huì )起作用。所以為了要了解當前正在起作用的這些寄存器的值,另外輸入線(xiàn)上的值隨時(shí)都可能變化,由于這兩個(gè)原因在輸入線(xiàn)上引入邊界掃描寄存器才可以真實(shí)的反映處理器當前的狀態(tài)和寄存器的值。

  1. 系統軟件設計

不僅需要底層硬件的良好支持,還需要有一個(gè)便于用戶(hù)使用的PC機上層的控制臺。該控制臺主要功能是發(fā)送數據到串并轉換芯片FT245R,數據經(jīng)過(guò)FT245R轉換以后變?yōu)椴⑿械?bit數據送入到USB-JTAG協(xié)議轉換器,協(xié)議轉換器將數據進(jìn)行解析來(lái)相應的產(chǎn)生TAP信號。

PC機通過(guò)USB電纜與FT245R相連,所以PC機只要將數據發(fā)送到FT245R任務(wù)就完成了,其他的都由下面的硬件來(lái)實(shí)現。采用C++builer6.0為PC機控制臺的開(kāi)發(fā)平臺,添加FT245R廠(chǎng)商提供的動(dòng)態(tài)鏈接庫,使用FT245R的廠(chǎng)商提供的API函數進(jìn)行編程實(shí)現。

  1. 系統調試和測試

  1. 各調試功能的驗證

  1. 測試程序

當OCD、USB-JTAG協(xié)議轉換器和PC機控制臺這三個(gè)片上的組成部分都設計好以后,下一步的工作就是來(lái)編寫(xiě)一段匯編程序作為目標測試程序,因為目標處理器是一款CSIC處理器,所以還必須設計好一段可用的微程序存放到處理器內部控制存儲器中來(lái)完成整個(gè)處理器控制信號的產(chǎn)生。

由于處理器內存地址0000~002F作為堆棧使用,所以?xún)却嬷写娣诺臋C器指令必須從地址0030開(kāi)始存放,本文在xilinx的SPARTAN-3E開(kāi)發(fā)板上實(shí)現處理器以及片上調試器,所以同時(shí)也將編寫(xiě)好的測試程序生成存儲器初始化文件,然后采用xilinx的RAM核將編輯好的存儲器文件初始化到該RAM核中。在處理器上電時(shí)的程序入口地址設置為測試程序的入口即可。

現在編寫(xiě)一段測試程序如下:

0030:0761 0100; MOV #100H,R1

0032:043A 0002; MOV R1,0002H

0034:2b68 0001; TEST #0001H, R0

0036:019a 000B; JZ 000BH

左邊是在機器指令以及其在內存中的位置,右邊是其對應的匯編程序。其中共有四條指令,包括對通用寄存器、內存等資源的訪(fǎng)問(wèn),跳轉指令是程序的跳躍執行,由于在此處關(guān)注的是處理器的內部狀態(tài),所采用的測試程序只要能夠覆蓋整個(gè)處理器的數據通路即可。

  1. 復位功能驗證

復位功能是指當系統出現異?;蛘咛幱诘臓顟B(tài)用戶(hù)不能確定時(shí),可以使用該功能使處理器回到初始狀態(tài)。由于處理器內部與處理器初始運行有關(guān)的寄存器初始值都是確定的值,所以要驗證復位調試功能,只需將復位調試指令發(fā)送到OCD,然后讀出處理器內部寄存器的值與寄存器的初始值是否相同來(lái)確定復位調試功能是否正確執行。

首先來(lái)看一下處理器內部一些寄存器的初始值,在處理器內部堆棧指針SP、程序計數器PC和中斷允許寄存器MASK有特別的初始值,其他寄存器都為0值,SP初始值為0030H,PC值也為0030H,因為在處理器運行時(shí)SP從0030H往小地址減而PC值則是往大地址執行。而MASK初始值為5AA5,設置這樣的初始值主要是為了容易檢測數據在讀出時(shí)是否出現錯位的現象。

執行處理器復位調試功能,然后讀出內部寄存器的值,看是否回到初始狀態(tài),PC機控制臺顯示出讀出的寄存器值如圖1,可以看出所有的寄存器都回到了初始狀態(tài),表示復位調試功能實(shí)現正確。

圖 1 復位功能驗證

  1. 微指令單步

微指令單步主要是在執行一條機器指令過(guò)程中,為了能更清楚詳細的處理器內部具體操作涉及到具體的控制信號起作用以及某些寄存器的操作。本文的測試程序的第一條機器指0761 0100(MOV #100H,R1),是將立即數十六進(jìn)制的100移動(dòng)到通用寄存器R0中。根據第三章介紹的微程序的設計和微指令的轉移方式,寫(xiě)出該機器指令所對應的微指令地址和微指令。

000:20080001;

001:00069002;

002:CC000003;

003:00000404;

004:00000A08;

00B:2008000F;

00F:00069C10;

014:C0080015;

015:00061016;

016:D0000006;

在單步調試過(guò)程中將數據讀回與以上的分析相比較,將指令0761 0100的單步調試過(guò)程每一個(gè)單步的數據都讀回,其中將微指令單步中的主要界面截圖如圖2、圖3、圖4和圖5。

圖2第一條微指令

圖3 第二條微指令

圖4 讀數據微指令

圖5 結果寫(xiě)入R1

通過(guò)觀(guān)察UAR、DR、IR、R1、PC和AR六個(gè)寄存器值的變化,可知系統正常按照預期運行,并且單步調試功能正確實(shí)現。

  1. 微指令斷點(diǎn)

微指令斷點(diǎn)調試時(shí),首先通過(guò)斷點(diǎn)設置將微指令斷點(diǎn)值寫(xiě)入到斷點(diǎn)寄存器。其中斷點(diǎn)寄存器BPR中為顯示正是通過(guò)PC機控制臺寫(xiě)入到BPR寄存器中值,說(shuō)明斷點(diǎn)值已經(jīng)正確的寫(xiě)入。然后運行處理器,由于當處理器運行停止時(shí)讀取處理器內部寄存器狀態(tài),結果返回如圖6。其中UAR顯示現在處理器停止的微指令的位置,讀出的其他寄存器值也是運行到當前微指令斷點(diǎn)的值。

圖6 微指令斷點(diǎn)返回結果

  1. 連續運行和停止

連續運行是處理器運行在正常情況下,此時(shí)并不需要片上調試器的干涉,至于停止運行則是讓處理器運行完當前機器指令則停止。由于在內存中存儲的程序很短,而處理器的運行速度很快,所以在發(fā)送完連續運行調試指令,可以馬上執行停止運行調試指令內存中的測試指令已執行完成了,所以在停止運行指令之后再通過(guò)PC機控制臺來(lái)讀取處理器內部寄存器的值就不會(huì )改變了。如7、8兩張截圖是停止運行指令之后兩次讀取數據的結果,可以看出結果不再變化,證明停止調試指令正確實(shí)現。

圖7 第一次讀結果

圖8 第二次讀結果

  1. 總結

在嵌入式系統的開(kāi)發(fā)過(guò)程中,調試是不可或缺的一環(huán)。一個(gè)好的調試器可以大大的提高系統開(kāi)發(fā)的效率,縮短推出產(chǎn)品的時(shí)間,同時(shí)也提高了系統的可靠性。

本文設計了一個(gè)基于JTAG協(xié)議的片上調試器,該片上調試器實(shí)現了微指令和機器指令的單步、斷點(diǎn)以及讀取處理器內部寄存器和寫(xiě)入PC、處理器復位等常用調試功能。構建掃描鏈時(shí)采用獨立的掃描通路不對處理器本身寄存器做任何修改,這樣在保證實(shí)現調試功能的同時(shí)還最大程度的保護了處理器數據通路的獨立性,將對處理器的侵入性降到一個(gè)比較低的水平。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>