Zurück zum Projektjournal

PROJEKTNOTIZEN / EMBEDDED C++ & FREERTOS

NES-Emulator auf dem ESP32

Ausführung einer zyklusgenauen NES-Konsole auf einem ESP32-Mikrocontroller mit Dual-Core-FreeRTOS-Task-Scheduling, ILI9341-SPI-TFT-Ausgabe und Google-Test-Validierung.

NES-Emulator auf ESP32-Hardware mit SPI-TFT-Display
Hardware im Praxiseinsatz: NES-Emulation auf dem ESP32-Mikrocontroller mit ILI9341-Display.
ESP32 Dual-Core @ 240 MHz
FreeRTOS-Task-Scheduling
ILI9341 SPI-TFT + DMA
Google Test (33 Tests bestanden)

ESP32 / EMBEDDED REAL-TIME EMULATION

Zyklusgenaue Emulation auf hardwarenahen Mikrocontrollern

Die Portierung eines zeitkritischen Konsolen-Emulators auf einen Mikrocontroller erfordert ein durchdachtes Systemdesign. Mit 520 KB internem SRAM und zwei mit 240 MHz getakteten Xtensa-LX6-Kernen bietet der ESP32 ausreichend Leistung, doch flüssiges Rendering gelingt nur durch die saubere Aufteilung von Aufgaben über FreeRTOS, speicherabgebildete Ein-/Ausgabe und nicht blockierende SPI-DMA-Übertragungen.

01

Dual-Core-Task-Architektur

Core 0 übernimmt die Scanline-Erzeugung der PPU, Farbpaletten-Zuordnung und DMA-gestützte SPI-Übertragung an das ILI9341-Display. Core 1 führt die 6502-CPU-Befehle aus, regelt die Buszuteilung, APU-Audiosynthese und Controller-Abfrage ohne Ruckler.

02

Speicher- & DMA-Optimierung

Der ESP32 verfügt nicht über genügend SRAM für einen vollständigen, unkomprimierten 16-Bit-Doppelpuffer. Stattdessen werden Scanlines in Ping-Pong-DMA-Puffern berechnet und direkt an das Display gestreamt, während die CPU die nächste Zeile vorbereitet.

03

Host-Tests mit Google Test

Vor dem Flashen auf den Chip über PlatformIO prüft eine desktopbasierte CMake-Testsuite mit 33 Google-Test-Fällen Adressierungsarten, offizielle sowie inoffizielle Opcodes, Speicher-Mirroring und Interrupts, um Fehler frühzeitig auszuschließen.

04

Peripherie- & Hardwareanbindung

Anbindung eines 2,8" ILI9341 SPI-LCDs (320 × 240), eines SPI-MicroSD-Kartenmoduls zum Laden von ROM-Dateien, I2S-DAC / PWM-Audioausgabe sowie Tasterabfrage über CD4021-Schieberegister.

Testinfrastruktur und Verifikations-Dashboard mit 33 erfolgreichen Google Tests
CMake- und Google-Test-Prüfumgebung am Desktop: 33/33 Tests vor dem Flashen bestanden.

Hardware-Komponenten & Schnittstellen

Mikrocontroller
ESP32-WROOM-32 (Dual-Core @ 240 MHz, 4MB Flash)
Display
ILI9341 2,8" SPI TFT LCD (240 × 320, 16-Bit-Farbe)
Speichermedium
MicroSD-Kartenmodul über SPI-Bus (ROM-Ladevorgang)
Steuerung
8-Tasten-NES-Controller über CD4021-Schieberegister / GPIOs
Audio
I2S DAC / PWM-Audioausgabe mit analogem RC-Tiefpass
Toolchain
PlatformIO + VS2022 + CMake + Google Test

Test- und Build-Pipeline

Das Projekt setzt Visual Studio 2022 und PlatformIO für ESP32-Builds ein, ergänzt durch eine plattformunabhängige CMake-Konfiguration für schnelle Desktop-Tests. 33 Unit-Tests gewährleisten verlässliche 6502-CPU-Emulation.

ESP32-Repository auf GitHub ansehen