Un ICE (emulador en circuito) reemplaza el chip objetivo. Actúa como el chip real para el resto del circuito, pero tiene todo tipo de ganchos en el interior para que pueda ver lo que está sucediendo, establecer puntos de interrupción, cargar código nuevo, capturar rastros, etc. Utiliza un ICD (depurador en circuito) hardware de depuración especial agregado al chip de destino para ese propósito e intenta darle una capacidad similar a ICE. Desafortunadamente, la gente de marketing se ha involucrado y ha tratado de redefinir estos términos de larga data en su intento de engañarlo para que piense que su producto es mejor que el siguiente. Microchip's RealIce es un ejemplo particularmente atroz de esto. Es real, pero lo único que no es es un ICE.
Un ICE real (no el RealIce) es el mejor entorno de depuración en circuito. Desafortunadamente, estos han desaparecido debido al alto costo de hacer una versión especial del chip de destino para usar en el ICE, y el hecho de que las velocidades se han vuelto tan altas que sacar algo del chip es problemático. Otro problema es que un ICE requiere que el chip objetivo esté en un zócalo, o requiere un adaptador especial montado en lugar del chip objetivo para que el ICE pueda conectarse a sus líneas.
Así que hoy estamos atrapados con los ICD. Afortunadamente, hacen la mayoría de las cosas que le gustaría hacer con un ICE. Incluso tienen una ventaja en que el código se ejecuta en el chip de destino real, no en algo que intenta ser como el chip de destino. La desventaja es que requieren recursos en el chip, por lo que no son completamente transparentes para su código y hardware como lo es un ICE. El ICD necesita acceso a líneas de depuración, que a menudo pueden tener múltiples roles. No puede usar esos pines en otros roles durante la depuración. La cantidad de circuitos de depuración integrados en cada parte debe mantenerse en una pequeña fracción del total; de lo contrario, el costo sería demasiado alto, por lo que las características deben verse comprometidas. Una buena característica que sería demasiado costosa para agregar en cada chip es la verdadera capacidad de rastreo, ya que requiere un gran búfer de RAM.
Cada problema puede resolverse con una variedad de herramientas. No es si puedes resolverlo, sino cuánto tiempo y cuánto esfuerzo lleva. Cuando usaba regularmente ICE (Microchip ICE-2000 e ICE-4000), no usaba la función de rastreo con frecuencia, pero cuando lo hacía, otros medios habrían sido significativamente más costosos. A veces tienes un error en el que una variable de repente tiene un valor incorrecto. Pasas por el código y todo está bien y la rutina que manipula la variable parece hacer todo bien, pero cuando lo ejecutas eventualmente las cosas se estropean y encuentras que esa variable está en la basura. La causa es algún otro código con un puntero incorrecto, desbordamiento de búfer, falta de coincidencia de pila o similar. Con un ICE puede establecer un punto de interrupción en la variable que se cambia,
La mayoría de las veces, un ICD funcionará lo suficientemente bien. Especialmente con chips grandes, el par de pines dedicados a la depuración no es un gran problema. Hoy en día uso principalmente RealIce para depurar. Es mucho más estable y menos escamoso que el ICD2. Aprendes a vivir con ello.