Имитаторы встроенных процессоров, как правило, могут быть запрограммированы на симуляцию аппаратного обеспечения. Все технологии виртуализации, кроме Xen, делают это. Но вам нужно написать код, который претендует на наличие некоторых регистров по какому-то физическому адресу или, на x86, по адресу шины ввода-вывода, а затем вам нужно реагировать на чтение и запись по этим адресам, как если бы ваше программное обеспечение было физическим микросхема, чьи регистры управления и состояния были доступны.
Если вы хотите сделать это, я бы предложил изменить QEMU. Но это было бы нелегко. Подобные вещи обычно выполняются только тогда, когда вы разрабатываете специализированный чип с микроконтроллером и некоторыми другими ядрами для ввода / вывода.
Система разработки, продаваемая ARM Holdings, обеспечивает это и, вероятно, с ней легче работать, чем взламывать QEMU, но это очень дорого.
Существует несколько эмуляторов Open Source ARM, которые запускают одну подпрограмму, которая сама может вызывать другие подпрограммы, которые вы можете использовать для отладки настройки производительности подпрограмм, которые не зависят от аппаратного доступа. Я использовал один из них с большим успехом для оптимизации шифратора AES для ARM7TDMI.
Вы можете написать простой модуль модульного тестирования на C или C ++, связать с ним тестируемый класс или подпрограмму, а затем запустить его в симуляторе.
В течение многих лет я размышлял над подобной проблемой - как выполнить модульное тестирование кода ядра Linux или Mac OS X. Это должно быть возможно, но я никогда не пробовал. Возможно, стоит создать полное ядро, а не тестировать свой код изолированно, с модульным тестовым фреймворком, напрямую связанным с вашим ядром. Затем вы запускаете юнит-тесты с какого-то внешнего интерфейса.
Возможно, было бы более продуктивно использовать инструмент покрытия кода, а затем протестировать свою прошивку как полный пакет через ее внешний интерфейс. Инструмент покрытия найдет пути кода, которые еще не были протестированы, поэтому вы можете добавить дополнительные внешние тесты, чтобы получить больше покрытия.