Los simuladores de CPU integrados generalmente pueden programarse para simular también hardware. Todas las tecnologías de virtualización distintas de Xen hacen eso. Pero debe escribir un código que pretenda tener algunos registros en alguna dirección física o, en x86, una dirección en el bus de E / S, y luego debe responder a las lecturas y escrituras en estas direcciones como si su software fuera físico. Chip cuyos registros de control y estado se estaban accediendo.
Si desea hacer esto, sugeriría modificar QEMU. Pero no sería fácil. Este tipo de cosas generalmente solo se realiza cuando se está diseñando un chip personalizado con un microcontrolador y algunos otros núcleos para su E / S.
El sistema de desarrollo vendido por ARM Holdings proporciona esto y probablemente sea más fácil trabajar con él que piratear en QEMU, pero es muy costoso.
Hay varios emuladores ARM de código abierto que ejecutan una sola subrutina, que a su vez puede llamar a otras subrutinas, que puede usar para la depuración sintonizando el rendimiento de las subrutinas que no dependen del acceso al hardware. Utilicé uno de estos con gran éxito para optimizar un encriptador AES para ARM7TDMI.
Podría escribir un arnés de prueba unitaria simple en C o C ++, vincular la clase o subrutina que se está probando y luego ejecutarlo en el simulador.
He estado pensando en un problema similar durante años, cómo hacer una prueba unitaria del código del kernel de Linux o Mac OS X. Debería ser posible, pero en realidad nunca lo he intentado. Una posible es construir un kernel completo en lugar de probar su código de forma aislada, con el marco de prueba de la unidad vinculado directamente a su kernel. A continuación, dispararías las pruebas unitarias desde algún tipo de interfaz externa.
Tal vez sería más productivo utilizar una herramienta de cobertura de código y luego probar su firmware como un paquete completo a través de su interfaz externa. La herramienta de cobertura encontraría rutas de código que aún no se habían probado, por lo que luego podría agregar pruebas externas adicionales en un intento por obtener más cobertura.