Un ICE (In-Circuit Emulator) reemplaza el chip objetivo. Actúa como el chip real para el resto del circuito, pero tiene todo tipo de ganchos en su interior, por lo que puede ver lo que está sucediendo, establecer puntos de ruptura, cargar código nuevo, capturar rastros, etc. El hardware de depuración especial agregado al chip de destino para ese propósito e intenta brindarle una capacidad similar a la de 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. El Realce de Microchip es un ejemplo particularmente notorio de esto. Es real, pero lo único que no es un ICE.
Un ICE real (no el RealIce) es el mejor entorno de depuración en el circuito. Desafortunadamente, estos prácticamente han desaparecido debido al alto costo de fabricar una versión especial en bondo del chip objetivo para su uso en el ICE, y el hecho de que las velocidades han llegado a ser tan altas que sacar algo del chip es problemático. Otro problema es que un ICE requiere que el chip de destino esté en un zócalo, o requiere un adaptador especial montado en lugar del chip de destino para que el ICE pueda conectarse a sus líneas.
Así que hoy estamos atrapados con ICD. Afortunadamente, hacen la mayoría de las cosas que querrías hacer con un ICE. Incluso tienen una ventaja en que el código se ejecuta en el chip objetivo real, no algo que intenta ser como el chip objetivo. El inconveniente 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 las líneas de depuración, que a menudo pueden tener múltiples roles. No puedes usar esos pines en otros roles mientras depuras. La cantidad de circuitos de depuración incorporados en cada pieza 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 comprometerse. 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 a menudo, pero cuando lo hacía, otros medios habrían sido significativamente más costosos. A veces tienes un error donde una variable de repente tiene un valor incorrecto. Pasas a través del código y todo está bien y la rutina que manipula la variable parece hacer todo bien, pero cuando lo ejecutas, finalmente, las cosas cagan y encuentras esa variable destruida. La causa es algún otro código con un puntero defectuoso, un desbordamiento del búfer, una falta de coincidencia de la pila o similar. Con un ICE puede establecer un punto de interrupción en la variable que se está cambiando, luego mirar hacia atrás en el búfer de rastreo para ver cómo llegó el código allí y cómo se complicaron las cosas.
La mayoría de las veces, un ICD estará bien. Especialmente con los chips grandes, los dos pines dedicados a la depuración no son un gran problema. Hoy en día uso principalmente RealIce para la depuración. Es mucho más estable y menos escamoso que el ICD2. Aprendes a vivir con ello.