Ein ICE (In-Circuit Emulator) ersetzt den Zielchip. Es verhält sich wie ein echter Chip für den Rest der Schaltung, hat jedoch alle Arten von Haken im Inneren, sodass Sie sehen können, was los ist, Breakpoints setzen, neuen Code laden, Traces erfassen usw. Ein ICD (In-Circuit Debugger) verwendet Zu diesem Zweck wurde dem Zielchip spezielle Debug-Hardware hinzugefügt, die Ihnen eine ICE-ähnliche Funktionalität bieten soll. Unglücklicherweise haben sich Marketingmitarbeiter dafür engagiert und versucht, diese langjährigen Begriffe neu zu definieren, um Sie zu täuschen, dass ihr Produkt besser ist als das nächste. Microchips RealIce ist ein besonders ungeheures Beispiel dafür. Es ist real, aber das einzige, was es nicht ist, ist ein ICE.
Ein echter ICE (nicht der RealIce) ist die beste In-Circuit-Debugging-Umgebung. Leider sind diese Probleme so gut wie beseitigt, weil die Kosten für die Herstellung einer speziellen Bondout-Version des Zielchips für den Einsatz im ICE hoch sind und die Geschwindigkeit so hoch geworden ist, dass das Entfernen von Chips problematisch ist. Ein weiteres Problem besteht darin, dass ein ICE erfordert, dass sich der Zielchip in einem Sockel befindet, oder dass ein spezieller Adapter anstelle des Zielchips montiert ist, damit der ICE eine Verbindung zu seinen Leitungen herstellen kann.
Heute stecken wir also bei ICDs fest. Zum Glück machen sie die meisten Dinge, die man mit einem ICE machen möchte. Sie haben sogar einen Vorteil, dass der Code auf dem realen Zielchip ausgeführt wird , nicht etwas versucht zu sein wie der Zielchip. Der Nachteil ist, dass sie On-Chip-Ressourcen erfordern und daher für Ihren Code und Ihre Hardware nicht vollständig transparent sind, wie dies bei einem ICE der Fall ist. Der ICD benötigt Zugriff auf Debugging-Leitungen, die häufig mehrere Rollen haben können. Sie können diese Pins beim Debuggen nicht in anderen Rollen verwenden. Die Menge der in jedem Teil eingebauten Debug-Schaltkreise muss auf einen kleinen Bruchteil der Gesamtmenge beschränkt werden, da sonst die Kosten zu hoch wären und die Funktionen beeinträchtigt werden müssen. Eine nette Funktion, die zu teuer wäre, um sie auf jedem Chip hinzuzufügen, ist die echte Trace-Fähigkeit, da dies einen großen RAM-Puffer erfordert.
Jedes Problem kann schließlich mit einer Vielzahl von Werkzeugen gelöst werden. Es geht nicht darum, ob Sie es lösen können, sondern wie lange und wie viel Aufwand es kostet. Als ich regelmäßig ICEs verwendete (Microchip ICE-2000 und ICE-4000), habe ich die Trace-Funktion nicht oft verwendet, aber wenn ich andere Methoden verwendet hätte, wäre dies erheblich teurer gewesen. Manchmal haben Sie einen Fehler, bei dem eine Variable plötzlich den falschen Wert enthält. Sie gehen den Code durch und alles ist in Ordnung und die Routine, die die Variable manipuliert, scheint alles richtig zu machen, aber wenn Sie sie ausführen, scheitern die Dinge und Sie finden diese Variable verwüstet. Die Ursache ist ein anderer Code mit einem fehlerhaften Zeiger, einem Pufferüberlauf, einer Stapelinkongruenz oder dergleichen. Mit einem ICE können Sie einen Haltepunkt für die zu ändernde Variable festlegen.
Meistens reicht ein ICD aus. Besonders bei großen Chips sind die paar Pins, die dem Debuggen gewidmet sind, kein großes Problem. Heutzutage benutze ich RealIce hauptsächlich zum Debuggen. Es ist viel stabiler und weniger flockig als der ICD2. Du lernst damit zu leben.