Wbudowane symulatory procesorów można ogólnie zaprogramować tak, aby symulowały również sprzęt. Robią to wszystkie technologie wirtualizacji inne niż Xen. Ale musisz napisać kod, który udaje, że ma jakieś rejestry pod jakimś fizycznym adresem lub, na x86, adresem na szynie I / O, a następnie musisz odpowiadać na odczyty i zapisy na te adresy, jakby twoje oprogramowanie było fizycznym chip, do którego uzyskiwano dostęp do rejestrów kontroli i statusu.
Jeśli chcesz to zrobić, proponuję zmodyfikować QEMU. Ale to nie będzie łatwe. Tego rodzaju czynności są zazwyczaj wykonywane tylko wtedy, gdy projektujesz niestandardowy układ z mikrokontrolerem i innymi rdzeniami dla swoich I / O.
System rozwoju sprzedawany przez ARM Holdings zapewnia taką możliwość i jest prawdopodobnie łatwiejszy w obsłudze niż hakowanie na QEMU, ale jest bardzo drogi.
Istnieje kilka emulatorów ARM typu Open Source, które uruchamiają jeden podprogram, który sam może wywoływać inne podprogramy, których można użyć do debugowania dostrajania wydajności podprogramów, które nie zależą od dostępu sprzętowego. Wykorzystałem jeden z nich, aby odnieść sukces w optymalizacji szyfrowania AES dla ARM7TDMI.
Możesz napisać prostą wiązkę testową w C lub C ++, połączyć z nią testowaną klasę lub podprogram, a następnie uruchomić go w symulatorze.
Przez lata zastanawiałem się nad podobnym problemem, jak testować jednostkowo kod jądra systemu Linux lub Mac OS X. Powinno być możliwe, ale tak naprawdę nigdy nie próbowałem. Jednym z możliwych jest zbudowanie pełnego jądra, zamiast testowania kodu w izolacji, z ramami testów jednostkowych podłączonymi bezpośrednio do jądra. Następnie uruchomiłbyś testy jednostkowe z jakiegoś zewnętrznego interfejsu.
Być może bardziej produktywne byłoby skorzystanie z narzędzia do pokrywania kodu, a następnie przetestowanie oprogramowania wewnętrznego jako kompletnego pakietu za pomocą zewnętrznego interfejsu. Narzędzie pokrycia znajdzie ścieżki kodu, które nie zostały jeszcze przetestowane, więc możesz dodać dodatkowe testy zewnętrzne, aby uzyskać większy zasięg.