Les simulateurs de CPU intégrés peuvent généralement être programmés pour simuler également du matériel. Toutes les technologies de virtualisation autres que Xen le font. Mais vous devez écrire du code prétendant avoir certains registres à une adresse physique ou, sur x86, une adresse sur le bus d’E / S, puis vous devez répondre aux lectures et écritures sur ces adresses comme si votre logiciel était physique. puce dont les registres de contrôle et d'état étaient en cours d'accès.
Si vous voulez faire cela, je suggérerais de modifier QEMU. Mais ce ne serait pas facile. Ce type de tâche n’est généralement effectué que lorsque vous concevez une puce personnalisée avec un microcontrôleur et quelques autres cœurs pour vos E / S.
Le système de développement vendu par ARM Holdings répond à cela et est probablement plus facile à utiliser que le piratage informatique sur QEMU, mais il est très coûteux.
Il existe plusieurs émulateurs ARM Open Source qui exécutent une seule sous-routine, qui peut elle-même appeler d'autres sous-routines, que vous pouvez utiliser pour le débogage en optimisant les performances des sous-routines ne dépendant pas d'un accès matériel. J'ai utilisé l'un de ces logiciels avec un grand succès pour optimiser un crypteur AES pour ARM7TDMI.
Vous pouvez écrire un faisceau de test unitaire simple en C ou C ++, y associer la classe ou le sous-programme testé, puis l'exécuter dans le simulateur.
Je réfléchis à un problème similaire depuis des années: comment tester un peu le code du noyau Linux ou Mac OS X. Cela devrait être possible, mais je n'ai jamais vraiment essayé. L'une d'elles est peut-être de construire un noyau complet plutôt que de tester votre code de manière isolée, le framework de test unitaire étant directement lié à votre noyau. Vous lanceriez ensuite les tests unitaires à partir d'une sorte d'interface externe.
Peut-être serait-il plus productif d'utiliser un outil de couverture de code, puis de tester votre micrologiciel comme un package complet via son interface externe. L'outil de couverture trouverait des chemins de code qui n'avaient pas encore été testés. Vous pourrez alors ajouter des tests externes supplémentaires pour tenter d'obtenir une plus grande couverture.