Depuración de microprocesadores: 1980–2016 – Una historia completa
Desde los albores del diseño electrónico, los bugs han sido inevitables, y la depuración ha sido la disciplina esencial para lidiar con fallos y errores y determinar cuál prevalecerá —y con qué profundidad.
La tecnología de depuración ha evolucionado tan fascinantemente como los diseños que soporta. Desde enfoques simples de estímulo-respuesta-observación hasta las sofisticadas herramientas, equipos y metodologías de hoy, el campo ha crecido en tándem con sistemas cada vez más complejos. En 2017, una nueva era comenzó con la introducción de depuración sobre E/S funcional, prometiendo mayor eficiencia y capacidad.
Tras décadas de innovación global, he estado involucrado en depuración desde 1984. Para apreciar el cambio de paradigma que ahora experimentamos, es útil revisar los hitos que moldearon la industria.
1970s–1980s
El diseño de sistemas entonces difería marcadamente de hoy. Una placa típica comprendía una CPU, (EP)ROM, RAM y ICs periféricos como PICs, UARTs, controladores DMA, temporizadores y dispositivos I/O, cada uno implementado en chips separados.

Computadora de placa única (SBC) de los 80s
(Fuente: https://oldcomputers.net/ampro-little-board.html)
Los desarrolladores escribían código en ensamblador o C, compilaban, enlazaban y producían un archivo HEX para la imagen de ROM. El proceso implicaba borrar manualmente EPROMs con un borrador UV, programarlas mediante interfaz serie o paralela, y reinstalar los chips en la placa. Si el programa no se comportaba como se esperaba, varias técnicas de depuración estaban disponibles.
Inspección de código:
El enfoque más fundamental, aún usado por muchos, implica recorrer el código mentalmente o con un editor de texto, una habilidad que sigue siendo valiosa cuando las herramientas no están disponibles o son demasiado costosas.
LEDs:
Un método clásico usa LEDs u otros indicadores a bordo para señalar el estado del programa. Insertando toggles de LED en puntos clave, los desarrolladores pueden rastrear visualmente el flujo de ejecución. Cuando hay pines I/O adicionales y un analizador lógico disponibles, el rastreo de estado en tiempo real se vuelve posible.
Monitor en objetivo (On-target Monitor):
Placas con puerto serie y memoria suficiente podían alojar un pequeño programa monitor. Saltando a este monitor, un desarrollador podía recorrer ensamblador, inspeccionar registros y memoria vía comandos RS‑232 como s (step) o m 83C4,16 (mostrar memoria).
Emulador En Circuito (ICE):
Para quienes podían permitírselo, el ICE era el depurador definitivo. Reemplazaba la CPU con un circuito de emulación que podía observar y controlar señales internas. Aunque grande y caro —a menudo costando miles de dólares— los ICE proporcionaban breakpoints avanzados, traza y la capacidad de intercambiar EPROMs por RAM de emulación, eliminando la necesidad de borrar y reflashear durante el desarrollo.

Motorola Exorciser ICE
(Fuente: https://www.exorciser.net/personal/exorciser/Original%20Files/exorciser.jpg)

Intel MDS ICE
(Fuente: https://www.computinghistory.org.uk/userdata/images/large/PRODPIC-731.jpg)
1982–1990
Tres cambios clave surgieron para desarrolladores embebidos:
- ICs integrados: Las CPUs comenzaron a incluir periféricos —p. ej., Intel 80186/80188 (evolución del 8086/8088), Zilog Z180 (desde Z80), y familia CPU32 de Motorola (p. ej., 68302) desde el 68000.
- ICEs asequibles: Fabricantes produjeron ICEs de menor costo sin chips bond-out, reduciendo precio a menos de $10,000 para un ICE 80186.
- Desafíos de velocidad de reloj: El aumento de velocidades de CPU tensionó cableado y lógica de control de ICE. La solución fue circuitos de depuración en chip (OCD), proporcionando paso a paso, acceso a registros y breakpoints a plena velocidad de CPU, aunque las primeras implementaciones carecían de capacidad de traza completa.
El acceso OCD típicamente usaba interfaces propietarias como Background Debug Mode (BDM) o el más común JTAG, tradicionalmente usado para test de producción. Mientras algunas herramientas podían acceder a memoria mientras la CPU corría, otras no, llevando a variaciones entre implementaciones.
1990–2000
La traza externa se volvió impráctica debido a altas velocidades de reloj y caché interna. En su lugar, fabricantes introdujeron datos de traza de núcleo comprimidos —capturando solo cambios no secuenciales del program counter y comprimiéndolos para transporte fuera de chip. Esto permitía al depurador reconstruir rutas de ejecución usando conocimiento del programa en ejecución. Arquitecturas clave incluían PowerPC de IBM, ColdFire de Motorola, y núcleos ARM 7TDMI.
2000–2010
Los conjuntos de datos de traza comprimidos permitieron buffers de traza en chip como el Embedded Trace Buffer (ETB) de ARM, accesible vía JTAG. El tamaño del buffer podía configurarse, equilibrando área de silicio contra rendimiento de traza. Los SoCs multi-núcleo introdujeron nuevos retos: las cadenas de escaneo JTAG desaparecían cuando los núcleos se apagaban. La arquitectura CoreSight de ARM resolvió esto proporcionando un único puerto de acceso de depuración basado en JTAG que podía alcanzar todos los componentes CoreSight mapeados en memoria, incluyendo múltiples núcleos que podían ciclar de potencia independientemente.
2010–Presente
Con el auge de núcleos de 64 bits y uso generalizado de Linux/Android, la depuración en dispositivo ganó tracción. Drivers de kernel ahora exponen componentes CoreSight, permitiendo captura de traza en objetivo vía el subsistema perf. El ARM Embedded Logic Analyzer (ELA) recupera la riqueza de los ICEs tempranos, ofreciendo breakpoints complejos, disparadores y acceso a señales internas del SoC —todo dentro del silicio.
Tras 40 años de innovación incansable, el campo está al borde de un nuevo capítulo: depuración y traza sobre E/S funcional existente. Este cambio promete soluciones más esbeltas que reducen tiempo y coste de desarrollo mientras mejoran la capacidad, continuando la larga guerra contra los bugs.
Incrustado
- La evolución de SPICE: De raíces CANCER a la simulación moderna de circuitos
- Fundamentos de Programación de Microprocesadores
- Makino: Pionera de la Primera Fresadora NC y Centro de Mecanizado de Japón
- Gene Haas: Construyendo un Legado CNC y un Imperio en Motorsports
- Mazak Corporation: De Fundamentos 1919 a Líder Global en Herramientas de Máquina
- Fundamentos de programación CNC: Tutoriales paso a paso y código de ejemplo
- Cadence lanza Cloud Passport Partner Program para acelerar migración cloud en diseño de chips
- Historia del hilo de tungsteno: de los filamentos de carbono de Edison a las aleaciones AKS modernas
- Comentarios en C++: Mejores Prácticas para Código Legible y Mantenible
- Entendiendo la estructura de un programa C: Guía para principiantes
- Estructura de Programa C#: Componentes Principales y Ejemplo Hello World