Category Archives: 谈点技术

ICD vs ICE

^^^^^^^^请尊重本人劳动成果,转载请务必注明,谢谢合作!^^^^^^^^ 最近为解决公司ETM9的问题,频繁和TRACE32打交道,趁此机会把嵌入式硬件仿真调试的一些基本概念又认真学习了一番,略有体会,记录下来,以备日后参考。 进行嵌入式系统开发的过程中,经常会用到ICD和ICE。从字面上来讲,ICD的全称是In Circuit Debugger,ICE是In Circuit Emulator,中文可以分别翻译为在线调试器和在线仿真器。笼统的说,二者都可用于硬件调试和软硬件联调,市面上常见的产品包括ARM公司的Multi-ICE,WindRiver公司的visionICE和visionProbe,以及Lauterbach公司的Trace32-ICD和Trace32-ICE。   那么二者之间究竟有什么区别和联系呢?回答这个问题这要从嵌入式系统调试手段的演进说起。   在早期的嵌入式开发中,尤其是8位机和16位机占主流的时代,ICE是最为常用的调试设备,它的核心思想是完全模拟CPU工作,通过外围电路捕获CPU的各种状态信息,输送到PC端,也就是说它相当于CPU+调试电路,可以从物理上完全替代CPU。所以最早的ICE在使用时需要将CPU从插口上拔下来,再将ICE的电缆插进去。   ICE的出现,给嵌入式开发人员带来了极大的便捷。但随着芯片制造技术的飞速发展,ICE也逐渐显露出一些无法回避的缺陷。首先,ICE必须比被调试CPU运转更快,这样才能在模拟CPU的同时向外输送调试信息,而CPU主频的不断提高使得实现这一点越来越难;其次,日渐复杂的封装技术导致ICE替换CPU的难度不断增大;再次,ICE的先天特性决定它总是落后于CPU发布;最后,ICE的价格通常非常昂贵。这些缺陷给ICE的发展带来了一定的阻碍,在这种情况下,EmbeddedICE就应运而生了。   EmbeddedICE是ARM公司提出的一种面向系统的解决方案,其关键技术是在处理器芯片内部加入一个EmbeddedICE单元,提供传统ICE的诸多功能,例如实时寻址、断点、单步以及对CPU核的控制,使用边界扫描链和JTAG接口与PC交互信息,从而实现硬件调试。EmbeddedICE解决了传统ICE的种种难题,从而得到了广泛的应用。ARM7TDMI系列就是基于该方案的典型产品,其名称中的字母I即指示EmbeddedICE。   有了EmbeddedICE,相应的也就出现了新的调试工具ICD。与复杂的ICE不同,ICD的核心硬件只包括一个EmbeddedICE接口盒,用于在PC和处理器芯片的JTAG接口之间搭起一座桥梁,实现PC端调试器指令与JTAG协议的转换,例如将PC端的一次鼠标点击转换成JTAG指令和数据序列,并最终通过EmbeddedICE实现对CPU核的控制。   说到这里,ICE和ICD的区别就不言自明了:ICE通过自身仿真CPU进行调试,而ICD则是利用芯片内部的EmbeddedICE单元对CPU进行调试。特别需要指出的是,上面的讨论都集中在硬件部分,实际上,不管是ICE还是ICD,都离不开一个优秀的集成开发环境;只有通过开发环境对二进制机器码的翻译,开发人员才能够轻松地查看寄存器,查看地址空间,设置断点,将机器指令转换为汇编指令甚至对应到高级代码、实现源码级调试。   弄清楚了二者的区别,现在回到第一段,给市面上的产品归归类。虽然名字看起来都像是ICE,其实未必。ARM公司的Multi-ICE实际上是ICD,对应的开发环境是ARM SDT或者ADS;WindRiver的visionICE和visionProbe也是ICD,开发环境是visionClick;Lauterbach的ICD和ICE倒是都货真价实,开发环境统一叫TRACE32,Lauterbach另外还有一款产品叫Trace32-FIRE,同属ICE范畴。目前国内不少公司也陆续开发了一些针对ARM芯片的JTAG仿真器,不过功能都比较简单,还不能称之为ICD。   Reference:[1] http://www.ganssle.com/articles/BegincornerICE.htm%5B2%5D http://www.ashling.com/technicalarticles/ARMDebugv10.pdf%5B3%5D http://www.embedded.com/showArticle.jhtml?articleID=23901694

Posted in 谈点技术 | 8 Comments