I simulatori di CPU incorporati possono generalmente essere programmati per simulare anche l'hardware. Tutte le tecnologie di virtualizzazione diverse da Xen lo fanno. Ma devi scrivere un codice che finge di avere dei registri su un indirizzo fisico o, su x86, un indirizzo sul bus I / O, quindi devi rispondere a letture e scritture a questi indirizzi come se il tuo software fosse un fisico chip i cui registri di controllo e di stato erano accessibili.
Se vuoi farlo, suggerirei di modificare QEMU. Ma non sarebbe facile. Questo genere di cose viene generalmente eseguito solo quando si progetta un chip personalizzato con un microcontrollore e alcuni altri core per l'I / O.
Il sistema di sviluppo venduto da ARM Holdings prevede questo ed è probabilmente più facile da lavorare rispetto all'hacking su QEMU, ma è molto costoso.
Esistono diversi emulatori ARM Open Source che eseguono una singola subroutine, che può chiamare altre subroutine, che è possibile utilizzare per il debug ottimizzando le prestazioni delle subroutine che non dipendono dall'accesso hardware. Ho usato uno di questi con grande successo per ottimizzare un codificatore AES per ARM7TDMI.
È possibile scrivere un semplice cablaggio di unit test in C o C ++, collegare la classe o la subroutine sotto test ad esso, quindi eseguirlo nel simulatore.
Ho riflettuto su un problema simile per anni, su come testare il codice del kernel Linux o Mac OS X. Dovrebbe essere possibile, ma non ci ho mai provato. Uno probabilmente è quello di costruire un kernel completo piuttosto che testare il codice in modo isolato, con il framework di unit test collegato direttamente nel kernel. Dovresti quindi eseguire il test dell'unità da una sorta di interfaccia esterna.
Forse sarebbe più produttivo utilizzare uno strumento di copertura del codice, quindi testare il firmware come pacchetto completo attraverso la sua interfaccia esterna. Lo strumento di copertura trova percorsi di codice non ancora testati, quindi è possibile aggiungere ulteriori test esterni nel tentativo di ottenere una copertura maggiore.