I simulatori CPU integrati possono generalmente essere programmati per simulare anche l'hardware. Tutte le tecnologie di virtualizzazione diverse da Xen lo fanno. Ma è necessario scrivere codice che pretenda di avere alcuni registri su un indirizzo fisico o, su x86, un indirizzo sul bus I / O, e quindi è necessario rispondere a letture e scritture a questi indirizzi come se il software fosse un chip a cui è stato effettuato l'accesso ai registri di controllo e di stato.
Se vuoi farlo, ti suggerisco di modificare QEMU. Ma non sarebbe facile. Questo genere di cose viene generalmente fatto 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 gestire rispetto all'hacking su QEMU, ma è molto costoso.
Esistono diversi emulatori ARM Open Source che eseguono una singola subroutine, che a sua volta può chiamare altre subroutine, che è possibile utilizzare per eseguire il debug di ottimizzazione delle prestazioni delle subroutine che non dipendono dall'accesso all'hardware. Ho usato uno di questi con grande successo per ottimizzare un crittografo AES per ARM7TDMI.
Potresti scrivere una semplice unità test harness in C o C ++, collegare la classe o subroutine sotto test ad essa, quindi eseguirla 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 l'ho mai provato. È possibile costruire un kernel completo piuttosto che testare il codice in isolamento, con il framework di test dell'unità collegato direttamente nel kernel. Spegnerebbero quindi i test unitari da qualche tipo di interfaccia esterna.
Forse sarebbe più produttivo utilizzare uno strumento di copertura del codice, quindi testare il firmware come un pacchetto completo attraverso la sua interfaccia esterna. Lo strumento di copertura troverebbe percorsi di codice che non erano ancora stati testati, quindi potresti aggiungere ulteriori test esterni nel tentativo di ottenere una copertura maggiore.