- 前语
跟着嵌入式的不断发展,在各个范畴的运用越来越广泛,因为嵌入式体系的专用性很强,所以针对不同的运用的嵌入式软件的开发在嵌入式体系开发中所占的比重越来越大。嵌入式体系的开发首要包含两个部分硬件规划和软件规划。软件规划的进程首要有源码修正、源码编译、嵌入式操作体系的装备、程序下载和调试。因为嵌入式体系的资源有限不行能在嵌入式体系的硬件渠道上集本钱身的软件开发环境,所以嵌入式的软件开发的一般选用穿插编译和调试的办法。调试是确保程序质量的重要手法之一,能够验证程序是否满意预期的要求和检查程序存在的bug。穿插的开发办法选用宿主机和方针机的结构。宿主机一般选用PC机,将嵌入式体系的软件开发环境装备在PC机上。宿主机和方针机之间经过串口、并口和网线等树立衔接,不只仅是物理衔接还有逻辑衔接。在穿插开发进程中宿主机和方针机经过这种衔接进行交互,完结方针程序的编译下载和调试。
嵌入式体系的开发首要针对硬件体系中的微处理器的嵌入式软件的开发,嵌入式体系的软件调试也是针对微处理器的调试。现在微电子技能飞速发展,处理器出产工艺也不断进步,微处理器芯片的集成度更高、运转频率更高,所以对调试的要求更高。单单选用PC机上的软件调试器和软件调试署理现已很难习惯这些新的改变,将调试功用搬运到硬件部分为嵌入式软件的开发供给更好的确保和支撑,完结本钱也比较低。微处理器芯片中集成支撑调试的硬件逻辑现已逐步成为趋势。
在板级的测验和调试范畴,为了更好的支撑对电路物理节点的拜访,JTAG规范现已被许多芯片出产厂商所选用。JTAG规范最早的提出是为了检测印刷电路板的元件焊接问题,经过在电路中引进鸿沟扫描单元所组成的鸿沟扫描链来完结对电路节点的拜访。现在JTAG规范也被运用于嵌入式软件的调试进程中,用于与硬件调试逻辑交互供给通用的调试接口。
- 整体方案规划
图1 体系结构框图
整个调试体系分为四部分PC机上层操控台,USB-JTAG协议转化器,片上调试器OCD(On Chip Debugger)以及调试的方针处理器CPU。
- 体系硬件
- USB传输
USB是以串行传输的办法传输数据,首要运用FTDI公司的USB串并转化芯片FT245R将USB串行数据转化为并行数据,然后USB-JTAG协议转化器依据接纳到的数据依照JTAG协议输出TAP信号。USB-JTAG协议转化器的结构如图1所示。
图 1 协议转化器的结构
USB-JTAG协议转化器与FT245R之间除了有8位的数据Data[7:0]的传输,还有四个握手信号,分别是nRXF、nTXE、nRD和WR,如图1所示。nRXF是读FIFO_TX答应信号,nTXE是写FIFO_RX答应信号,还有读FIFO_TX信号nRD和写FIFO_RX信号WR。当nRXF为低电平时阐明FIFO_TX不为空,USB-JTAG协议转化器能够从中读出数据,此刻USB-JTAG协议转化器能够经过发送nRD信号从FIFO_TX读取数据;相同当nTXE信号有用的时分标明FIFO_RX还有空间,此刻USB-JTAG协议转化器能够使WR信号有用往FIFO_RX中写入数据。USB-JTAG协议转化器对FIFO_TX和FIFO_RX的读写操作都是以字节为单位。
FT245R内部有两个FIFO分别为FIFO TX Buffer和FIFO RX Buffer,FIFO TX Buffer担任寄存接纳从PC机发送来的数据,FIFO RX Buffer担任接纳从USB-JTAG协议转化器发送来的数据,为了差异称之为FIFO_TX和FIFO_RX。FT245R芯片的内部结构如图2所示。
图2 FT245R芯片的内部结构
- SPARTAN-3E开发板
选用xilinx的SPARTAN-3E开发板,将方针处理器与片上调试器的硬件逻辑还有协议转化器中的JTAG信号的生成功用都集成到该开发板的FPGA上。体系如图3所示。
图3
- 片上调试器结构
图4 片上调试器结构
TAP操控器掌管JTAG协议的状况机,操控OCD与USB-JTAG协议转化器之间的数据和指令的移入移出。TAP(Test Access Port)包含四个引脚用来操控指定的操作。这四个引脚分别为TMS,TCK,TDI,TDO。TAP操控器内部选用规范的JTAG协议状况机来操控TAP的数据通路,包含指令寄存器扫描链和数据寄存器扫描链的挑选以及扫描链数据的传输。
寄存器包含鸿沟扫描寄存器、BYPASS寄存器、断点寄存器和指令寄存器。鸿沟扫描寄存器在此处是为读取处理器输入输出引脚预留的扩展寄存器;BYPASS寄存器是位宽为1的寄存器,当在多个器材或模块串联的时分用该寄存器来旁路当时器材或模块;指令寄存器首要用来寄存对CPU进行调试的相应调试指令。
扫描链包含写PC扫描链和自定义数据扫描链。写PC扫描链是为了写入PC值而规划的扫描链,而经过自定义数据扫描链能够读出处理器内部的状况和数据。
处理器运转操控模块是片上调试器的核心部件,担任调试指令的译码以及读CPU寄存器、复位、断点设置检测和处理器运转操控,还有写CPU内部程序计数器PC等调试功用的完结。
- 处理器运转操控模块
处理器运转操控模块是片上调试器的核心部件,担任指令译码和依据当时指令和CPU的运转状况进行机器指令或许微指令的单步和断点的断定,而且依据断定成果操控CPU的运转。指令译码便是依据PC上层渠道发送到指令寄存器中的指令来发生相应的操控信号,直接经过这些操控信号操控CPU的运转、中止和复位等。规划了9条指令,分别为:
1)SREAD:CPU中止,而且此刻选通CPU内部扫描寄存器数据链读出CPU内部首要寄存器的值。
2)STEP:微指令的单步,CPU运转一条微指令然后停下来。
3)MSTP:机器指令的单步,CPU运转一条机器指令然后停下来。
4)BPSET:断点设置,该指令只担任发生断点设置所需求的相应操控信号,并不担任断点数据的写入。实践的断点数据是用户经过PC机的上层东西设置今后,再进行一个BPR的数据写入来完结的。
5)RUN:CPU运转指令。
6)BRUN:断点运转,在断点设置完结今后,发送该指令来使CPU运转。
7)RESET:复位指令,使CPU复位。
8)WPC:写PC指令,为用户供给对CPU内部程序计数器PC值进行写入的功用,以满意某些用户的特别需求。
9)STOP:CPU中止指令。
上面所描绘的9条指令, 其间BPSET和BPRUN指令是两条相互依赖的调试指令,两条指令联合完结断点调试功用。其他的指令都是一条指令完结相应的调试功用。
- 断点设置和检测
首要要经过外部来设置断点值,硬件部分要规划一个断点寄存器BPR用来寄存用户设置的机器指令断点或许微指令断点值,该寄存器位宽为24,其间低18位为有用数据位,高6位作为预留的扩展位。经过鸿沟扫描的办法将断点值串行的移入到断点寄存器BPR中。
BPR[17:16]两位为标志位用来进行断点类型的差异,当BPR[17:16]=00时标明要写入的是微指令断点,此刻BPR[8:0]为要写入的微指令的断点值即断点微地址;当BPR[17:16]=01时表明要写入的是机器指令断点,此刻BPR[15:0]为要写入的机器指令的断点值即内存机器指令的地址。
断点的检测首要依据标志位来差异断点类型,是微指令断点仍是机器指令断点。当标志位为00时,将断点值与微指令地址进行比较,其值共一起发生断点触发信号;当标志位为01时,将断点值与PC寄存器中的机器指令地址进行比较,假如共同相同发生断点触发信号。
- PC值的写入
处理器调试的进程中,为了能够随时操控处理器所要履行的指令,需求设置PC(程序计数器)值即所要履行的指令的地址。选用鸿沟扫描技能来完结该功用,规划一条扫描链经过该扫描链即将设置的PC值写入到PC寄存器中,扫描链的结构如图5所示。
图5 写PC扫描链
因为CISC处理器内部的寄存器在写入和读出时都有相应的使能信号,所以在写入PC值的时分需求使PC的使能信号PCce有用,而这些寄存器的使能信号的发生是由微指令译码得来的,假如要修正微指令会影响到其他寄存器的使能操控存在必定的危险。
为了处理这个问题能够有两种办法可供挑选:
1、将uIR数据读出,PC写操作完结今后再写回
该办法是先将uIR内部的内容读出保存好,然后写入带有PC寄存器使能操控信号微指令,当PC值正确写入今后再将本来保存的uIR的值复原到uIR寄存器中。
2、引进伪微指令寄存器用来在写入PC值替代uIR输出微指令
该办法是在微指令寄存器uIR到微指令译码模块uIR_Decoder之间参加一个扫描寄存器BSC_uIR,称之为伪微指令寄存器,这个寄存器在确保不影响uIR的前提下发生PCce信号。当写入PC值时首要选中该扫描链,然后即将写入PC的数据移入BSC_PC_A中,PCce有用则将BSC_PC_A中数据更新到PC中,完结PC的写操作。
榜首种办法操作起来比较繁琐而且对软件的规划要求也比较高,在PC机和硬件渠道指令就会存在重复传送数据的局势增加了数据犯错的几率。而第二种办法施行起来比较简单,而且只需将需求的微指令和要写入的PC值一同进行一次写操作就能够完结,还确保了uIR寄存器华夏有的微指令坚持不变。因而本文选用了第二种办法。
- 处理器内部状况读出
处理器内部寄存器反映处理器内部运转的状况和当时一些首要数据,在调试进程中有必要能够将这些数据读回给用户。这样就需求在处理器内部构建一条自定义数据扫描链,当履行处理器内部数据读出调试功用时先选中该扫描链,然后将该扫描链内部数据读回到PC机上层操控台。处理器内部自定义数据扫描链的结构如图6所示。
图 6 自定义数据扫描链
构建数据扫描链能够考虑在在寄存器的输入或许输出线上加鸿沟扫描单元的办法来捕获数据,而不直接对寄存器自身进行操作,这样就将片上调试器对CPU的侵入性降到最低,确保了CPU内部数据通路的独立性。
因为在处理器内部寄存器的值的更新都有严厉的时序操控,所以将扫描寄存器加在寄存器的输入线和输出线上是有差异的。这些寄存器输入线上的数据要存入到寄存器中鄙人一个时钟周期输出才会收效,例如IR中指令输出到微操控部件去译码才会起作用。所以为了要了解当时正在起作用的这些寄存器的值,别的输入线上的值随时都可能改变,因为这两个原因在输入线上引进鸿沟扫描寄存器才能够实在的反映处理器当时的状况和寄存器的值。
- 体系软件规划
调试体系不只需求底层硬件的杰出支撑,还需求有一个便于用户运用的PC机上层的操控台。该操控台首要功用是发送数据到串并转化芯片FT245R,数据经过FT245R转化今后变为并行的8bit数据送入到USB-JTAG协议转化器,协议转化器将数据进行解析来相应的发生TAP信号。
PC机经过USB电缆与FT245R相连,所以PC机只需将数据发送到FT245R使命就完结了,其他的都由下面的硬件来完结。选用C++builer6.0为PC机操控台的开发渠道,增加FT245R厂商供给的动态链接库,运用FT245R的厂商供给的API函数进行编程完结。
- 体系调试和测验
- 各调试功用的验证
- 测验程序
当OCD、USB-JTAG协议转化器和PC机操控台这三个片上调试体系的组成部分都规划好今后,下一步的作业便是来编写一段汇编程序作为方针测验程序,因为方针处理器是一款CS%&&&&&%处理器,所以还有必要规划好一段可用的微程序寄存到处理器内部操控存储器中来完结整个处理器操控信号的发生。
因为处理器内存地址0000~002F作为仓库运用,所以内存中寄存的机器指令有必要从地址0030开端寄存,本文在xilinx的SPARTAN-3E开发板上完结处理器以及片上调试器,所以一起也将编写好的测验程序生成存储器初始化文件,然后选用xilinx的RAM核将修正好的存储器文件初始化到该RAM核中。在处理器上电时的程序进口地址设置为测验程序的进口即可。
现在编写一段测验程序如下:
0030:0761 0100; MOV #100H,R1
0032:043A 0002; MOV R1,0002H
0034:2b68 0001; TEST #0001H, R0
0036:019a 000B; JZ 000BH
左面是在机器指令以及其在内存中的方位,右边是其对应的汇编程序。其间共有四条指令,包含对通用寄存器、内存等资源的拜访,跳转指令是程序的跳动履行,因为在此处重视的是处理器的内部状况,所选用的测验程序只需能够掩盖整个处理器的数据通路即可。
- 复位功用验证
复位功用是指当体系呈现异常或许处于的状况用户不能确守时,能够运用该功用使处理器回到初始状况。因为处理器内部与处理器初始运转有关的寄存器初始值都是确认的值,所以要验证复位调试功用,只需将复位调试指令发送到OCD,然后读出处理器内部寄存器的值与寄存器的初始值是否相同来确认复位调试功用是否正确履行。
首要来看一下处理器内部一些寄存器的初始值,在处理器内部仓库指针SP、程序计数器PC和中止答应寄存器MASK有特别的初始值,其他寄存器都为0值,SP初始值为0030H,PC值也为0030H,因为在处理器运转时SP从0030H往小地址减而PC值则是往大地址履行。而MASK初始值为5AA5,设置这样的初始值首要是为了简单检测数据在读出时是否呈现错位的现象。
履行处理器复位调试功用,然后读出内部寄存器的值,看是否回到初始状况,PC机操控台显现出读出的寄存器值如图1,能够看出一切的寄存器都回到了初始状况,表明复位调试功用完结正确。
图 1 复位功用验证
- 微指令单步
微指令单步首要是在履行一条机器指令进程中,为了能更清楚详细的处理器内部详细操作涉及到详细的操控信号起作用以及某些寄存器的操作。本文的测验程序的榜首条机器指0761 0100(MOV #100H,R1),是将当即数十六进制的100移动到通用寄存器R0中。依据第三章介绍的微程序的规划和微指令的搬运办法,写出该机器指令所对应的微指令地址和微指令。
000:20080001;
001:00069002;
002:CC000003;
003:00000404;
004:00000A08;
00B:2008000F;
00F:00069C10;
014:C0080015;
015:00061016;
016:D0000006;
在单步调试进程中将数据读回与以上的剖析相比较,将指令0761 0100的单步调试进程每一个单步的数据都读回,其间将微指令单步中的首要界面截图如图2、图3、图4和图5。
图2榜首条微指令
图3 第二条微指令
图4 读数据微指令
图5 成果写入R1
经过调查UAR、DR、IR、R1、PC和AR六个寄存器值的改变,可知体系正常依照预期运转,而且单步调试功用正确完结。
- 微指令断点
微指令断点调试时,首要经过断点设置将微指令断点值写入到断点寄存器。其间断点寄存器BPR中为显现正是经过PC机操控台写入到BPR寄存器中值,阐明断点值现已正确的写入。然后运转处理器,因为当处理器运转中止时读取处理器内部寄存器状况,成果回来如图6。其间UAR显现现在处理器中止的微指令的方位,读出的其他寄存器值也是运转到当时微指令断点的值。
图6 微指令断点回来成果
- 接连运转和中止
接连运转是处理器运转在正常情况下,此刻并不需求片上调试器的干与,至于中止运转则是让处理器运转完当时机器指令则中止。因为在内存中存储的程序很短,而处理器的运转速度很快,所以在发送完接连运转调试指令,能够立刻履行中止运转调试指令内存中的测验指令已履行完结了,所以在中止运转指令之后再经过PC机操控台来读取处理器内部寄存器的值就不会改变了。如7、8两张截图是中止运转指令之后两次读取数据的成果,能够看出成果不再改变,证明中止调试指令正确完结。
图7 榜首次读成果
图8 第2次读成果
- 总结
在嵌入式体系的开发进程中,调试是不行或缺的一环。一个好的调试器能够大大的进步体系开发的功率,缩短推出产品的时刻,一起也进步了体系的可靠性。
本文规划了一个根据JTAG协议的片上调试器,该片上调试器完结了微指令和机器指令的单步、断点以及读取处理器内部寄存器和写入PC、处理器复位等常用调试功用。构建扫描链时选用独立的扫描通路不对处理器自身寄存器做任何修正,这样在确保完结调试功用的一起还最大程度的维护了处理器数据通路的独立性,将对处理器的侵入性降到一个比较低的水平。