Il Quarto Membro dell’Equipaggio (5) – Input/Output

Le periferiche di I/O dell’AGC

Con questo post concludo la trattazione dell’hardware dell’AGC, occupandomi dei dispositivi e delle modalità di Input / Output (I/O). A partire dalla settimana prossima passeremo ad occuparci del software.

Con l’espressione Input / Output (abbreviata in I/O) si fa riferimento a come un computer scambia informazioni col mondo esterno. Genericamente i dispositivi che permettono questo scambio sono detti periferiche: tastiere, mouse, schermi, stampanti, dischi di vario tipo e formato sono tutti periferiche.

Nel piccolo mondo dell’AGC (che alla fine gestiva ‘solo’ il PGNCS) la complessità dell’I/O era decisamente inferiore a quella dei computer general purpose di oggi e le periferiche erano di tipo molto diverso: la piattaforma inerziale, i razzi, i radar, il DSKY e gli interruttori dei pannelli di controllo. Tutti dispositivi che non richiedevano di certo la capacità di trattamento dei dati (in termini di velocità e capacità) di un computer del giorno d’oggi.

Le modalità di I/O utilizzate dall’AGC erano 3: i canali di I/O (I/O channels), i counters e le word a 15 bit. I dati non venivano scambiati in grandi quantità e la velocità richiesta non era un fattore significativo per le performance dell’AGC. Come vedremo, molte delle operazioni di I/O erano relative alla modifica di un singolo bit.

I canali di I/O
I canali di I/O erano specifiche aree di 15 bit, simili alle locazioni di memoria, ma che non risiedevano nella memoria dell’AGC. Sono accessibili solo tramite le istruzioni di I/O. Con due eccezioni: l’accumulatore e il registro L venivano considerati anche parte dell’area di memoria dei canali I/O e possono essere utilizzati dalle suddette istruzioni (e questo causava un interessante, e voluto, effetto collaterale). I canali erano unidirezionali; potevano essere canali di input o di output, non entrambi; unica eccezione il canale 7, di cui veniva utilizzato un solo bit (il bit 7), il Superbanking Bit usato per l’indirizzamento. L’AGC poteva solo leggere dai canali di Input e solo scrivere in quelli di output. La caratteristica peculiare dei canali era che ogni bit rappresenta un effettivo segnale di I/O: si comportava in pratica come un interruttore che ha due stati discreti possibili, On e Off. Può sembrare strano considerare operazioni di I/O che coinvolgono un singolo bit, ma provate a pensare a come si comanda un motore a razzo con propellenti iperbolici (come l’SPS): attivarlo (o disattivarlo) è questione solo di comandare l’apertura / chiusura delle valvole dei condotti del combustibile e dell’ossidante. Insomma un singolo bit può comandare l’SPS.

Il format delle istruzioni di I/O

Le istruzioni di I/O per i canali avevano un loro formato proprio:

  • tutte avevano lo stesso opcode (000)

  • i bit 10,11,12 rappresentavano il ‘codice periferica’, che in realtà identificava una delle 7 differenti operazioni possibili

  • i rimanenti 9 bit servivano a specificare l’indirizzo del canale: più che sufficienti dal momento che si potevano referenziare 29=512 canali ma l’AGC ne aveva solo 16 canali (per capsula)

Esistevano istruzioni che operavano sull’intero canale (READ e WRITE) e quelle, ben più importanti, che eseguivano operazioni booleane tra i canali e l’accumulatore (WOR, WAND, ROR, RXOR), utilizzate per impostare od estrarre informazioni dai singoli bit dei canali.

L’effetto collaterale di cui si parlava sopra era quello di poter utilizzare le istruzioni di I/O booleane sull’accumulatore e il registro L (considerato come se fosse un canale) per ‘estendere’ il set di istruzioni dell’AGC con queste operazioni (di suo l’AGC era in grado di fare solo l’AND).

I counter
I counter erano invece locazioni della memoria dell’AGC vere e proprie. Al contrario dei canali qui era tutta la word a contenere l’informazione da / per un singolo dispositivo. Il dato contenuto nel counter era un valore appartenente ad un intervallo continuo e rappresentava una misura (ad esempio l’angolo rilevato lungo uno degli assi della IMU). Il trattamento dei dati nei counter richiedeva l’intervento dell’AGC tramite la tecnica del cycle stealing, descritto nel precedente post sugli interrupt. Non era necessaria alcuna speciale istruzione per accedere ai dati contenuti nei counter, per alterarli invece si utilizzavano le ‘nonprogrammed sequences’: speciali istruzioni non disponibili ai programmatori per le loro routine e il cui compito era solo quello di manipolare (incrementare, decrementare o ruotare) il contenuto dei counter.

Esistevano poi dei counter in output: impostare un valore in queste locazioni equivaleva ad inviare un comando ad un dispositivo esterno. Un esempio: inserire un valore nel counter di output appropriato serviva a muovere la IMU lungo un determinato asse. Proprio quello che serviva per il riallineamento della piattaforma inerziale.

Possiamo sintetizzare e completare nella seguente tabella le principali differenze tra canali e counter:

Channels Counters
I/O Sincrono I/O Asincrono
I dati rappresentati sono uno specifico stato discreto I dati sono un punto specifico in un intervallo continuo di valori
Un singolo bit all’interno della word è assegnato ad un dispositivo (per estrarlo occorrono operazioni di tipo booleano) L’intera word è dedicata ad un dispositivo
I dati sono accessibili solo tramite le speciali istruzioni di I/O I dati sono accessibili senza utilizzare speciali istruzioni
Più dispositivi gestiti tramite un singolo canale Un counter dedicato per ogni dispositivo
I canali sono ‘direttamente’ collegati al dispositivo, non ci sono processi intermedi eseguiti dall’AGC Le variazioni sui counter provocano nell’AGC l’esecuzione di ‘nonprogrammed sequences’ prima che i dati siano disponibili

L’interrupt T4RUPT e l’I/O Sincrono
Esisteva anche una modalità di gestione dell’I/O (detta sincrona) per alcuni dispositivi che richiedevano attenzione periodica. Si basava sull’utilizzo della routine T4RUPT, così chiamata perché utilizzava l’omonimo interrupt per controllare la sua esecuzione. Questo era legato al timer TIME4: quando il timer ‘scattava’, ogni 120 millisecondi, la routine T4RUPT veniva eseguita. Questa routine pianificava l’esecuzione di diverse attività per ogni sua attivazione, secondo uno schema ciclico distribuito su 8 fasi (ogni ciclo era quindi eseguito ogni 120 x 8 = 960 ms). Le attività erano volontariamente di breve durata ed erano eseguite con gli interrupt disabilitati.

In realtà erano solo 4 le routine eseguite nel corso delle fasi: venivano ripetute 2 volte, a distanza di 480ms l’una dall’altra, per garantire una migliore reattività da parte dell’AGC.

C’erano due operazioni che venivano compiute all’inizio di ogni fase:

  • la verifica della presenza di output destinato al DSKY

  • la verifica dello stato del pulsante Proceed del DSKY (l’unico tasto del DSKY a non generare un interrupt KEYRUPT quando veniva premuto)

Le operazioni compiute in ognuna delle 8 fasi era diversa a seconda della capsula. Come esempi quella che segue è la descrizione delle fasi per il CM:

  • Fasi 0 e 4 – OPTTEST/OPTDRIVE: in queste due fasi l’AGC determinava se era necessario muovere il sestante. In caso affermativo, guidava l’operazione

  • Fasi 2 e 6 – IMUMON: queste due fasi erano dedicate al controllo dello stato della IMU

  • Fasi 3 e 7 – RESUME: il CM non utilizzava appieno le possibilità offerte da questo processo e in questi due casi, ritornava semplicemente il controllo alla routine T4RUPT

  • Fasi 1 e 5 – OPTMON: in queste due fasi si eseguivano le stesse operazioni delle fasi 0 e 4 ma per il telescopio (nel caso questo fosse in modalità ‘slaved’ al sestante)

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...