Salta al contenuto
Note per Studenti Moduli di input-output e input-output programmato

Moduli di input-output e input-output programmato

In questa pagina 5
In questa pagina 4

Perché un modulo di I/O

Le periferiche sono molto diverse tra loro (formati, velocità da pochi byte/s per una tastiera a GB/s per un SSD) e quasi tutte più lente della CPU. Collegarle direttamente al bus sarebbe impossibile: il modulo di I/O (controllore, interfaccia) fa da tramite tra il bus di sistema e uno o più dispositivi.

Funzioni:

  • controllo e temporizzazione del flusso di dati;
  • comunicazione con la CPU: decodifica dei comandi, scambio di dati, segnalazione dello stato, riconoscimento del proprio indirizzo;
  • comunicazione con il dispositivo: comandi, stato, dati;
  • buffer: assorbe la differenza di velocità;
  • rilevazione degli errori (meccanici, di trasmissione).

Il dispositivo esegue la trasduzione: converte tra dati binari e grandezze fisiche (movimento, luce, suono, magnetizzazione).

Il modulo presenta alla CPU dei registri: di dati, di stato (es. bit "pronto", bit "errore") e di controllo (comandi).

Indirizzamento dei dispositivi

I/O mappato in memoria I/O isolato
spazio di indirizzi unico: i registri dei moduli occupano indirizzi di memoria separato per l'I/O
istruzioni le stesse load/store della memoria istruzioni dedicate (IN, OUT in x86)
pro nessuna istruzione speciale; tutte le modalità di indirizzamento disponibili lo spazio di memoria resta tutto per la memoria
contro consuma indirizzi di memoria insieme di istruzioni di I/O limitato

ARM usa I/O mappato in memoria. Esempio: il registro di stato di una UART a 0x101F1018, bit 5 = "buffer di trasmissione pieno", registro dati a 0x101F1000.

I/O programmato

La CPU esegue tutto: dà il comando, poi interroga ripetutamente il registro di stato (polling) finché il dispositivo è pronto, poi trasferisce il dato.

armasm
        LDR  r1, =0x101F1000    @ base della UART
attesa: LDR  r2, [r1, #0x18]    @ legge il registro di stato
        TST  r2, #0x20          @ bit 5: buffer pieno?
        BNE  attesa             @ sì: aspetta (attesa attiva)
        STRB r0, [r1]           @ no: scrive il carattere nel registro dati

Problema: attesa attiva. Se la CPU esegue 10910^9 istruzioni al secondo e una stampante accetta 1000 caratteri al secondo, per ogni carattere la CPU spreca circa un milione di istruzioni a controllare lo stato.

Le tre tecniche

Errori tipici

  • Pensare che con l'I/O mappato in memoria i dati passino per la cache: i registri dei dispositivi vanno marcati come non cacheable, altrimenti la CPU leggerebbe valori vecchi.
  • Confondere I/O isolato (spazio di indirizzi separato) con "periferica non collegata al bus".

Versione ripasso

Modulo di I/O

Le periferiche sono eterogenee e lente; il modulo di I/O sta tra bus e dispositivi: controllo e temporizzazione, comunicazione con CPU e dispositivo, buffer, rilevazione degli errori. Il dispositivo fa la trasduzione. La CPU vede registri di dati, di stato (pronto, errore) e di controllo.

Indirizzamento

  • Mappato in memoria: spazio unico, stesse load/store, modalità complete, ma consuma indirizzi di memoria. ARM lo usa: UART con stato a 0x101F1018 (bit 5 = buffer pieno) e dati a 0x101F1000.
  • Isolato: spazio separato, istruzioni dedicate (IN, OUT in x86), insieme di istruzioni di I/O limitato.

I/O programmato

Comando, poi polling del registro di stato finché il dispositivo è pronto, poi trasferimento: LDR r1,=0x101F1000; attesa: LDR r2,[r1,#0x18]; TST r2,#0x20; BNE attesa; STRB r0,[r1]. Attesa attiva: con 10910^9 istruzioni/s e una stampante da 1000 caratteri/s si sprecano circa un milione di istruzioni per carattere.

Le tre tecniche

Errori tipici: i registri dei dispositivi vanno non cacheable (altrimenti valori vecchi); I/O isolato non significa periferica fuori dal bus.

Lezioni in cui compare

Teoria collegata