L'USB è piuttosto complicato perché varie parti del protocollo possono essere implementate nell'hardware a seconda della piattaforma utilizzata. Potrebbe essere più semplice considerare qualcosa di un po 'più semplice, forse un controller di porta seriale.
La serie precisa di azioni che vengono eseguite dipenderà dal meccanismo di gestione degli interrupt del processore (alcuni processori sono più automatizzati nella manutenzione degli interrupt di altri). La descrizione che segue è tipica dei processori che ho utilizzato nel corso degli anni.
Normalmente il controller seriale riceve un carattere che è programmato per generare un segnale di interruzione al processore. Questo è un segnale fisico che indica alla CPU che è necessario intervenire su un evento esterno. Questo segnale fa sì che il processore completi l'istruzione corrente e quindi metta il suo attuale indirizzo di esecuzione e i registri dello stato del processore nello stack.
L'indirizzo di elaborazione viene modificato nella routine del servizio di interrupt. Può esserci una routine di servizio per tutti gli interrupt o un numero di routine di interrupt una per ciascuna delle origini di interrupt supportate dal processore. Queste funzioni di interrupt devono interrogare il dispositivo che interrompe per determinare il motivo dell'interrupt e quindi eseguire le azioni appropriate, in questo caso per leggere il carattere dalla porta seriale e spostarlo sul buffer dei dati seriali di input per essere utilizzato dal processore principale applicazione.
Una volta che l'elaborazione dell'interrupt è stata completata, lo stato del processore e l'indirizzo di esecuzione vengono ripristinati e l'elaborazione continua quindi dall'istruzione dopo l'ultima istruzione eseguita prima dell'interruzione. È estremamente importante che tutti i registri del processore utilizzati dall'elaborazione dell'interrupt vengano ripristinati esattamente nello stesso stato prima che la routine si interrompa in modo che l'unico effetto dell'interrupt sul codice principale sia quello di inserire un breve ritardo nel codice di elaborazione della linea principale .
Il codice di interrupt deve impostare gli indicatori di evento sul codice principale in modo che il codice di applicazione di alto livello possa rilevare che l'evento di interruzione è avvenuto.