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 更稳定、更不易碎。你学会忍受它。