ICE(在线仿真器)替换目标芯片。它在电路的其余部分就像真正的芯片一样工作,但是内部具有各种挂钩,因此您可以查看正在发生的事情,设置断点,加载新代码,抓取轨迹等。ICD(在线调试器)使用为此目的,在目标芯片上添加了特殊的调试硬件,并尝试为您提供类似于ICE的功能。不幸的是,市场营销人员开始投入精力,并试图重新定义这些长期的术语,以欺骗您,使您认为他们的产品比下一个更好。Microchip的RealIce就是一个特别出色的例子。它是真实的,但它不是ICE。
真正的ICE(不是RealIce)是最好的在线调试环境。不幸的是,由于制造用于ICE的目标芯片专用键合版本的高昂成本,以及速度变得如此之高以至于无法取出任何芯片的事实,这些技术已经几乎消失了。另一个问题是,ICE要求目标芯片位于插槽中,或者需要安装专用适配器代替目标芯片,以便ICE可以连接至其线路。
因此,今天我们受困于ICD。幸运的是,它们完成了您想要使用ICE进行的大多数操作。它们甚至具有一个优势,即代码在真实的目标芯片上运行,而不是像目标芯片那样运行。缺点是它们需要片上资源,因此与ICE一样,它们对您的代码和硬件也不是完全透明的。ICD需要访问调试行,调试行通常可以具有多个角色。调试时,不能将这些引脚用作其他角色。内置在每个部分中的调试电路的数量必须保持在总数的一小部分,否则成本将太高,因此必须牺牲功能。真正的跟踪功能是在每个芯片上增加的一项过于昂贵的好功能,因为这需要较大的RAM缓冲区。
每个问题最终都可以使用各种工具解决。这不是您是否可以解决它,而是需要花费多长时间和多少努力。当我定期使用ICE(Microchip ICE-2000和ICE-4000)时,我并不经常使用跟踪功能,但是当我使用其他方法时,成本会大大增加。有时您会遇到一个错误,其中变量突然具有错误的值。您单步执行代码,一切都很好,并且操纵该变量的例程似乎可以正确执行所有操作,但是当您运行该例程时,最终情况就荡然无存,您发现该变量已被废弃。原因是其他一些指针错误,缓冲区溢出,堆栈不匹配等的代码。使用ICE,您可以在要更改的变量上设置断点,
大多数情况下,ICD会做得很好。尤其是对于大型芯片,专用于调试的一对引脚并不是什么大问题。如今,我主要使用RealIce进行调试。它比ICD2稳定得多,而且片状少。您将学习与之共存。