Un ICE (In-Circuit Emulator) remplace la puce cible. Il agit comme la vraie puce du reste du circuit, mais contient toutes sortes de crochets pour que vous puissiez voir ce qui se passe, définir des points de rupture, charger un nouveau code, saisir des traces, etc. Un ICD (In-Circuit Debugger) utilise un matériel de débogage spécial a été ajouté à la puce cible à cet effet et essaie de vous offrir une capacité de type ICE. Malheureusement, les gens du marketing ont commencé à s'impliquer et ont essayé de redéfinir ces termes de longue date dans leur tentative de vous tromper en leur faisant croire que leur produit est meilleur que le suivant. RealIce de Microchip en est un exemple particulièrement flagrant. C'est réel, mais la seule chose qui ne l'est pas, c'est une glace.
Un vrai ICE (pas le RealIce) est le meilleur environnement de débogage en circuit. Malheureusement, ceux-ci ont à peu près disparu en raison du coût élevé de la fabrication d'une version spéciale de liaison de la puce cible pour une utilisation dans l'ICE, et du fait que les vitesses sont devenues si élevées que le retrait de la puce est problématique. Un autre problème est qu'un ICE nécessite que la puce cible soit dans un socket, ou nécessite un adaptateur spécial monté à la place de la puce cible pour que l'ICE puisse se connecter à ses lignes.
Aujourd'hui, nous sommes donc coincés avec des DCI. Heureusement, ils font la plupart des choses que vous voudriez faire avec un ICE. Ils ont même un avantage en ce sens que le code s'exécute sur la puce cible réelle, et non quelque chose essayant de ressembler à la puce cible. L'inconvénient est qu'ils nécessitent des ressources sur puce et ne sont donc pas complètement transparents pour votre code et votre matériel comme le sont les ICE. L'ICD doit avoir accès aux lignes de débogage, qui peuvent souvent avoir plusieurs rôles. Vous ne pouvez pas utiliser ces broches dans d'autres rôles lors du débogage. La quantité de circuits de débogage intégrés dans chaque partie doit être limitée à une petite fraction du total, sinon le coût serait trop élevé, de sorte que les fonctionnalités doivent être compromises. Une fonctionnalité intéressante qui serait trop coûteuse à ajouter sur chaque puce est la véritable capacité de trace, car cela nécessite un grand tampon RAM.
Chaque problème peut être finalement résolu avec une variété d'outils. Ce n'est pas si vous pouvez le résoudre, mais combien de temps et combien d'efforts cela prend. Lorsque j'utilisais régulièrement des ICE (Microchip ICE-2000 et ICE-4000), je n'utilisais pas souvent la fonction de trace, mais lorsque j'utilisais d'autres moyens, cela aurait été beaucoup plus coûteux. Parfois, vous avez un bug où une variable a soudainement la mauvaise valeur. Vous passez par le code et tout va bien et la routine qui manipule la variable semble tout faire correctement, mais lorsque vous l'exécutez, les choses se compliquent et vous trouvez cette variable mise à la poubelle. La cause est un autre code avec un mauvais pointeur, un dépassement de tampon, une incompatibilité de pile ou similaire. Avec un ICE, vous pouvez définir un point d'arrêt sur la variable en cours de modification,
La plupart du temps, un ICD fera assez bien l'affaire. Surtout avec de grosses puces, les quelques broches dédiées au débogage ne sont pas vraiment un problème. De nos jours, j'utilise principalement RealIce pour le débogage. Il est beaucoup plus stable et moins feuilleté que l'ICD2. Vous apprenez à vivre avec.