I/O mappato in memoria
I registri delle periferiche stanno nello stesso spazio di indirizzamento della memoria, quindi una normale scrittura a un indirizzo può accendere un LED.
Invece di istruzioni di I/O dedicate — le IN e OUT di x86, note come I/O mappato su porte — la CPU legge e scrive indirizzi che non sono instradati alla RAM, ma a una UART, a un timer o a una porta GPIO. Ogni microcontrollore basato su ARM funziona così, come le schede PCIe di un PC, i cui registri compaiono in finestre di indirizzi fisici.
L'insidia in C è che il compilatore ritiene si tratti di memoria ordinaria. Due scritture consecutive allo stesso indirizzo vengono fuse; una lettura dentro un ciclo viene spostata fuori. I puntatori ai registri vanno quindi dichiarati volatile, e sulle CPU con write buffer a volte serve una barriera di memoria per mantenere l'ordine. Home computer come il Commodore 64 facevano lo stesso, ed è per questo che PEEK e POKE potevano controllare suono e grafica.