zslhutu的个人空间 https://blog.eetop.cn/305546 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

基于JTAG的嵌入式调试技术的研究

已有 2773 次阅读| 2010-7-30 10:26

1 JTAG简介
JTAG(Joint Test Action Group)是IEEEll49.1标准。JTAG的建立使得集成电路固定在PCB上,只通过边界扫描便可以被测试。这使得复杂的嵌入式处理器的板级调试成为可能。比如:在ARM处理器中,可以通过ⅡAG直接控制ARM的内部总线,IO口等信息,从而达到调试的目的。JTAG标准主要分为两个层面:JTAG的通讯接口标准;J-I'AG的状态机标准。JTAG的通讯接口实质上是一个带有控制信号的同步串行接口。主要的JTAG信号及功能如表l所示。

JTAG标准定义了如图l所示的TAP状态机,状态机分成16种状态。每一个状态都有其相应的功能。通过JTAG的通讯接口可以控制TAP的状态,从而实现数据的捕获与传递。不管JrI'AG状态机处于哪个状态,当TMS信号等于逻辑l的时候,连续5个时钟信号以后,JTAG状态机必然回到Test—logic Reset状态。这也是JTAG状态
机的复位时的状态。

     2.  ARM的JTAG调试接口
ARM的JTAG调试接口主要包括程序断点的设置和对RAM空间的读写。本文以ARM7TDMI内核为例来描述JTAG的调试过程,其他版本的ARM或者其他类型的嵌入式处理器的JTAG调试接口的工作原理也是类似的。
     2.1  ARM7TDMI内核的JTAG扫描链的组成如图2所示的是ARM7TDMI内核的JTAG扫描链结构。主要包括了如下3条扫描链:
     扫描链0:有113个扫描单元,包括ARM核的所有的IO、地址数据总线和输入输出控制信号。这条链上的信号复杂,不易控制,但是,包含的信息丰富,可以通过这条链,得到ARM7TDMI内核输人输出的所有信息。
    扫描链1:有33个扫描单元,包括ARM核的数据总线和一个断点控制信号。这是一条很有用的链,通过控制这条链,可以控制ARM内核执行指定的指令,从而实现对ARM的内部寄存器、协处理器以及外部存储器的读写操作。
     扫描链2:有38个扫描单元,通过控制EmbeddedICE宏单元,实现对ARM执行指令的断点、观察点的控制。      

  

     2.2ARM中的Embedded ICE
Embedded ICE(In Circuit Emulator)是集成在ARM内核中的嵌入式ICE仿真器。通过对EmbeddedICE的控制,对Embedded IcE中寄存器的读取,可以获得ARM内核的状态,为程序设置断点以及读取Debug通讯通道寄存器。Embedded ICE的一个主要作用就是可以在ARM的程序中设置软件或者硬件的断点。在EmbeddedICE中,集成了一个比较器,比较器负责把ARM处理器取指的地址A[31:O]、数据D[31:0]以及一些控制信号与Embedded IcE中watchpoint寄存器中设置的
数值相比较,比较的结果用来确定输出一个ARM的断点(Breakpoint)信号。
       2.3硬件断点和软件断点
在ARM处理器的内核中,有两种断点的设置方式:软件断点和硬件断点。
      硬件断点:通过设置Embedded ICE中Watchpoint
的地址相关寄存器,来实现断点。通过这种方式设置断点,断点数目受Embedded IcE中Watchpoint数目的限制(在ARM7TDMI处理器的内核中,只有两组
watchpoint寄存器,最多只能设置两个硬件断点);但是,硬件断点可以在任何地方设置,不受存储器类型的限制。
        软件断点:软件断点的实现比较复杂,需要如下几个步骤:
(1)通过设置Embedded IcE中watchpoint寄存器的数据相关寄存器(data value和data mask value)为一个特殊的32位数字——ARM的未定义指令,比如:0x6000010。
(2)替换RAM中的指令为上面所设置的那个未定的指令(比如:0x6000010),作为一个标志。这样,当系统运行到RAM中所设定的时候,那个事先设置的标志数字将作为一个指令被读入处理器的内核。这时,系统所读人的指令的数据刚好和data
value中的数字相吻合,系统就进入了Debug模式。由此可见,软件断点的数目不受Embedded ICE中watchpoint数目的限制,不管系统设置多少个软件断点,仅仅使用了ARM内核的一个watchpoint资源。但是,软件断点是通过替换系统断点地址的指令实现的,所以,软件断点只能在可写存储器(RAM)的地址中设置,而不能在只读存储器(比如:Flash ROM)中设置。总之,在有两个watchpoint资源的ARM7的内核中,断点可以有如下情况:
◆2个硬件断点,没有软件断点;

 ◆1个硬件断点,任意多个软件断点;

◆任意多个软件断点。
      2.4 ARM中通过JTAG对外设的访问JTAG通过对ARM的内核进行控制,从而实现对外围设备的读写(如:下载程序到RAM或者Flash空间)。通常,在ARM7处理器中,JTAG对ARM外围设备的访问是通过对JrI'AG扫描链1的控制实现的。RM7TDMI中JTAG扫描链1有33位移位寄存器。其中前32位和ARM总线上的数据相连,第33位
是ARM内核的一个控制信号。当第33位是0的时候,表示ARM内核执行下一条指令是在调试(Debug)模式下运行;当第33位是1的时候,表示ARM内核执行下一条指令是在系统(System)模式下运行。在调试模式下,ARM内核的时钟是依靠JTAG状态机产生的DCLK信号;在系统模式下,ARM内核的时钟是依靠
系统的主时钟信号MCLK。因为,系统外设的工作频率是和系统的主时钟(MCLK)一致的。所以,在调试模式下,只能执行和处理器内核相关的指令,而所有对外设的访问的指令都不能有效地执行。若要对外部设备(比如,系统的RAM空间)进行访问和操作,必须要让ARM的内核工作在系统模式下。而在系统模式下,ARM内核的时钟是不受JTAG控制的,要想让ARM的内核重新受控,必须要配合Embedded ICE,让ARM内核执行完访问外设相关的指令以后,从系统模式重新回到调试模式下。下面给出了一个可以工作的例子,是一段利用JTAG扫描链l,写入系统的RAM空间的代码:

//选择JTAG链1,长度33bit(for ARM7)

Jtag_SelectScanN(1,TRUE);

//设置TAP状态机的状态

Jtag_ShiftIR(ARMJTAG_INTEST,UpdateIR);

/* 装载写入的地址到寄存器R0;装载写入的数据到R1*/

/*执行指令LDMIA r0, {r0, r1},机器码为0xe8900003*/

Jtag_SetInstruction(0xe8900003,
FALSE,FALSE);

Jtag_SetInstruction(ARM_INSTR_NOP,
FALSE,FALSE);    //NOP

Jtag_SetInstruction(ARM_INSTR_NOP,
FALSE,FALSE);    //NOP

/*这时,指令LDMIA r0, {r0, r1}开始执行*/

Jtag_SetInstruction(address,FALSE,TRUE);

Jtag_SetInstruction(data,FALSE,TRUE);

Jtag_SetInstruction(ARM_INSTR_NOP,
FALSE,FALSE);    //NOP

Jtag_SetInstruction(ARM_INSTR_NOP,
FALSE,FALSE);    //NOP

//设置下一条指令以系统时钟运行

Jtag_SetInstruction(ARM_INSTR_NOP,
TRUE,FALSE);

/*以系统时钟执行指令STR r1, [r0],机器码0xe4801000*/

Jtag_SetInstruction(0xe4801000,
FALSE,FALSE);

Jtag_ShiftIR(ARMJTAG_RESTART,RunTest);

/*等待指令执行结束*/

Sleep(1);

/*此时,处理器将在此停止在DEBUG状态*/

//选择JTAG链1,长度33bit(for ARM7)

Jtag_SelectScanN(1,TRUE);

//两条空指令,清空流水线

Jtag_ShiftIR(ARMJTAG_INTEST,UpdateIR);

Jtag_SetInstruction(ARM_INSTR_NOP,
FALSE,FALSE);    //NOP

Jtag_SetInstruction(ARM_INSTR_NOP,
FALSE,FALSE);    //NOP

在ARM7系统中,使用JTAG扫描链l访问外部RAM空间是一个比较复杂的过程,需要对ARM系统结构和ARM指令执行的特点都要有相当的了解。比如,ARM7内置的三级流水线,引起的指令超前读取的特点。因为ARM7是指令和数据统一编址,在什么时候是取指,什么时候是传送数据都要相当的清楚。仿照上面的例子的思路,可以推出读取RAM的流程,读取不同模式下寄存器的流程等。

       2.5 JTAG下载程序的效率
     由上一节中的例子可以看出,通过JTAG下载程序到RAM空间中,实际上是控制ARM内核执行指令的过程。上面的代码中,通过1l条ARM指令(或者数据)的传递,向RAM写入4个字节数据;每次更新一个33bit的ARM Scan chain 1还需要额外5个JTAG的时钟周期。也就是说,如果利用上面的代码下载程序,每32bit需要通过JTAG传输11*(33+5)=418bit的数据,即,JTAG通讯中的有效数据V(下载到
RAM空间的数据)大概为7.66%。
      如果按照JTAG的时钟速率为11Mbps计算,使用上述代码,理论上的程序下载速度不会超过11M*7.66%/8=105KB/s。当然,此估算方法还不包括代码
中等待的ARM运行程序的时间(上述程序中Sleep(1)的时间),整个代码在处理上执行的时间等等,实际工作的效率还要有折扣。(笔者)通过在60MHz的ARM7TDMI和“C/OS—II组成的嵌入式平台、830kHz的JTAG通讯模式下运行上述代码,实际测得的下载程序的速度为4.547KB/8,效率仅为4.488%。要想提高JTAG下载程序的速度就需要解决两个方面的问题:
       (1)程序代码中有效代码的效率问题
        当下载大量数据到RAM空间的时候,Ro保存下载程序的地址,使用指令:
       STMIA  r0!,{rl—r14}
        可以一次写入14个32bit的数据(存储在ARM寄存器的R1一R14)到RAM空间中,并且R0寄存器所保存的地址数值自动增长,这同时也省去了在顺序
写入程序的时候,下一次对于目的地址传递。
       (2)等待ARM指令全速运行的方法
      通过读取Embedded ICE中的ARM状态寄存器可以测试到目标板处理器是否处于Debug状态,从而得知以系统速度运行的指令是否已经执行结束。用这种
实时监控的方法来代替上述代码中SleeP(1)的盲目等待的方式,可以提高系统运行的效率。因此,对于大量程序的连续写入的情况,给出如下代码:

/*LDMIA r0, {r1-r14}*/

Jtag_SetInstruction(0xe8907ffe, FALSE,FALSE);

Jtag_SetInstruction(ARM_INSTR_NOP, FALSE,FALSE);    //NOP

Jtag_SetInstruction(ARM_INSTR_NOP,FALSE,FALSE);    //NOP

//传递数据到r0-r14中

for(i=0;i<14;i++)

{

   Jtag_SetInstruction(data[i], FALSE, TRUE);

}

Jtag_SetInstruction(ARM_INSTR_NOP, FALSE,FALSE);    //NOP

Jtag_SetInstruction(ARM_INSTR_NOP, FALSE,FALSE);    //NOP

Jtag_SetInstruction(ARM_INSTR_NOP, TRUE,FALSE); //以系统时钟运行下一条指令

/*STMIA R0!,    {R1-R14} */

Jtag_SetInstruction(0xe8a07ffe, FALSE,FALSE);

Jtag_ShiftIR(ARMJTAG_RESTART,RunTest);

WaitForBreak(); //查询等待写入结束

   上述的代码中,R0寄存器事先保存目的地址,每次向RAM空间写入数据以后,地址自动增长,所以,对于顺序数据,此代码可以反复使用。

    此代码通过21ARM指令(或者数据)向RAM空间写入56个字节,再加上每次更新一个33bitARM Scan chain 1额外需要的5JTAG的时钟周期。利用上面代码下载程序,每448bit需要通过JTAG传输21*(33+5)=798 bit的数据,即,JTAG通讯中的有效数据V大概为56.14%。从而使得通过JTAG的程序下载速度理论上提高到了11M*56.14%/8=790KB/s。而上述算法中的WaitForBreak()函数的等待时间是由目标板处理器的主频决定的,对于通常可以达到60MHz主频的ARM7TDMI的内核来说,这个时间几乎可以忽略不计。

    在60MHzARM7TDMIuC/OS-II组成的嵌入式平台上,830KHzJTAG时钟通讯模式下,对上述算法进行了验证,实际测得的下载程序的速度为35KB/S,效率为33.82%,第二种算法, 效率的提高是显著的。若在改进的硬件平台上,把JTAG时钟的效率提高到11MHz,完全可以让实际的数据下载速度超过450KB/s。

 

这边文章是在万方上下载的

作者:彭德刚,周慧玲,刘淼(北京邮电大学自动化学院,北京100876)

我将原文加载到附件里了,可以下载下来看。


点赞

发表评论 评论 (1 个评论)

回复 子虚 2010-12-12 13:29
:handshake 好东西

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 7

    评论
  • 387

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-22 10:09 , Processed in 0.026296 second(s), 14 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部