CALCOLATORI ELETTRONICI BUS IO PD 32 POLLING BUSY
CALCOLATORI ELETTRONICI • BUS I/O PD 32 • POLLING / BUSY WAITING • PROGETTAZIONE INTERFACCE INPUT / OUTPUT
I/OBus PD 32 I/O Address bus fatto da 8 bit Quante periferiche possiamo collegare al massimo? ? ?
Istruzioni I/O PD 32 Classe 7 Per la destinazione D 0 sono ammessi tutti i tipi di indirizzamento tranne quello immediato. Per la destinazione D 1 sono ammessi tutti i tipi di indirizzamento tranne quello con registro e immediato.
Formato istruzioni I/O Per l’operando dev sono ammessi solo due modi di indirizzamento: diretto con registro ed assoluto. Per la codifica di questo campo sono usati i campi I/O e k. Il campo I/O può assumere solo due valori: • 01 => indica che il contenuto di k è l’indirizzo del device • 10 => indica che l’indirizzo del device è contenuto nel registro generale specificato dai primi 3 bit del campo k Poichè i campi modo sorgente e sorgente sono inutilizzati, la sorgente S viene specificata nei campi modo destinazione e destinazione. CLASSE 111 31 TIPO 29 28 24 23 k I/O s 16 15 14 13 12 11 ----- 9 8 MODO 6 5 DEST 32 0
Interazione con le periferiche Esistono due tipologie di interazione con le periferiche: • Sincrona • Asincrona In questa parte faremo focus sull’interazione sincrona, successivamente verrà analizzata anche quella asincrona.
Interazione Sincrona Come tutte le comuni interazioni sincrone, il software si preoccupa di testare direttamente lo stato della periferica. L’architettura deve quindi dare la possibilità al processore di poter sapere in ogni istante la situazione attuale della periferica. Le tecniche più usare di interazione sincrona sono: • Busy Waiting • Polling sei pronta? ? si /no pd 32 periferica 1
Busy Waiting Idea che sta dietro all’implementazione del busy waiting: Loop: Salta a “Loop” se la periferica non è pronta Si rimane in attesa attiva che la periferica abbia terminato. La CPU è impegnata al 100% in questo controllo.
Busy Waiting / Implementazione Implementazone del busy waiting in assembly pd 32: Aspetta: JNR Device, Aspetta L’istruzione JNR (Jump Not Ready) salta all’etichetta “Aspetta” se Device non è pronto, altrimenti se Device è Ready passiamo alle istruzioni successive.
Polling verifica circolare se ogni DEVICE è pronto ad interagire I/O AB I/O DB I/O CB PD 32 DEV 1 DEV 2 DEV 3 DEV 4
Polling / Implementazione Implementazone del polling in assembly pd 32: POLL 1: JR D 1, Op_Dev_1 POLL 2: JR D 2, Op_Dev_2 POLL 3: JR D 3, Op_Dev_3 JMP POLL 1 Ciclicamente il software interroga le periferiche per sapere se qualcuna è pronta ad interagire. Altrimenti va avanti fino a che non arriva alla fine delle periferiche da controllare e con una jmp non condizionata torna sulla prima da controllare.
Progettazione Periferiche Progettiamo la nostra interfaccia hardware con lo scopo di fornire i componenti e le interconnessioni di supporto alla “semantica” della periferica (ovvero cosa deve fare la periferica). 1. Si deve poter leggere e/o scrivere sulla periferica 2. Si deve poter selezionare la periferica tra tutte quelle collegate al bus 3. Si deve poter interrogare la periferica per sapere se ha completato il suo lavoro 4. Si deve poter avviare la periferica
Classico protocollo alto livello In maniera molto astratta si dovranno eseguire almeno queste operazioni per interagire con le periferiche: 1. Aspettare che la periferica sia disponibile 2. Avviare la periferica 3. Scrivere / Leggere i dati d’interesse
Interfaccia di Input I/O programmato – PROTOCOLLO DI HANDSHAKING IMPLEMENTATO A SOFTWARE I/O AB I/O DB I/O CB PD 32 WAIT I/O RD START READY “ 0” STARTD SELECT REG SCA O. C. R Q STATUS S Q COMPLETE STARTDEV SCO
Interfaccia di Input / Impl 1. 2. 3. 4. Aspettare finché la periferica Device. In non è disponibile Avvio la periferica così che possa produrre informazioni Aspetto la sua terminazione Leggo il risultati acquisiti Aspetta 1: JNR Device. IN, Aspetta 1 START Device. IN Aspetta 2: JNR Device. IN, Aspetta 2 INB Device. IN, R 0 Cosa implementa? ? Busy Waiting / Polling? ?
Interfaccia di Output I/O programmato – PROTOCOLLO DI HANDSHAKING IMPLEMENTATO A SOFTWARE PD 32 I/O AB I/O DB I/O CB START READY STARTD DEC SELECT REG SCA O. C. R Q STATUS S Q COMPLETE STARTDEV SCO
Interfaccia di Output / Impl 1. 2. 3. 4. Aspettare finché la periferica Device. Out non è disponibile Scrivi il dato sul registro di interfaccia Avverto la periferica che può considerare un nuovo dato. Aspetto la sua terminazione Aspetta 1: JNR Device. OUT, Aspetta 1 OUT R 0, Device. OUT START Device. OUT Aspetta 2: JNR Device. OUT, Aspetta 2 Cosa implementa? ? Busy Waiting / Polling? ?
Esercizio Busy Waiting Dato questo frammento di codice implementante il codice di una funzione chiamante, definire la subroutine IN_AD 1 che legge 100 dati dalla periferica di input con indirizzo AD 1 e li memorizza in un vettore a partire dall’indirizzo 1280. Si noti che i dati sono già nei registi R 0 ed R 1 … MOVL #100, R 0 MOVL #1200, R 1 JSR IN_AD 1 ; numero di dati da acquisire ; ind. dell’area di memoria
Soluzione Busy Waiting … MOVL #100, R 0 ; numero di dati da acquisire MOVL #DATI, R 1 ; ind. dell’area di memoria JSR IN_AD 1 … IN_AD 1: PUSH R 0 ; salv. registri usati PUSH R 1 PUSH R 2 IN_1: JNR AD 1, IN_1 ; attende che AD 1 sia pronto IN_2: START AD 1 ; avvia l’acquisizione di un dato IN_3: JNR AD 1, IN_3 ; attende che il dato sia stato prodotto INW AD 1, R 2 ; prelievo del dato e…. MOVW R 2, (R 1)+ ; … suo trasferimento in memoria SUBL #1, R 0 ; decremento del contatore JNZ IN_2 ; acquisizione di un altro dato se non si è azzerato ; il contatore POP R 2 ; ripristino dei registri usati POP R 1 ; POP R 0 ; RET ; ritorno al programma chiamante
Esercizio Polling Dato questo frammento di codice implementante il codice di una funzione chiamante, definire la subroutine IN_AD 1 che legge 100 dati da quattro periferiche di input con indirizzo AD 1, AD 2, AD 3, AD 4 e li memorizza in un vettore a partire dall’indirizzo 1280. I 100 dati possono essere letti non necessariamente rispettando l’ordine delle periferiche, ovvero 25 da AD 1, 25 da AD 2……. Si noti che i dati sono già nei registi R 0 ed R 1 … MOVL #100, R 0 MOVL #1200, R 1 JSR IN_AD 1 ; numero di dati da acquisire ; ind. dell’area di memoria
Soluzione Polling IN_AD 1: PUSH R 0 ; salv. registri usati PUSH R 1 PUSH R 2 POLL 1: JR AD 1, IN_1 ; attende che AD 1 sia pronto POLL 2: JR AD 2, IN_2 POLL 3: JR AD 3, IN_3 POLL 4: JR AD 4, IN_4 JMP POLL 1 … IN_i: START ADi ; avvia l’acquisizione di un dato WAIT: JNR ADi, WAIT ; attende che il dato sia stato prodotto INW ADi, R 2 ; prelievo del dato e…. MOVW R 2, (R 1)+ ; … suo trasferimento in memoria SUBL #1, R 0 ; decremento del contatore JZ EXIT JMP POLL_i+1 ; continua a interrogare le altre periferiche EXIT: POP R 2 ; ripristino dei registri usati POP R 1 ; POP R 0 ; RET ; ritorno al programma chiamante
Esercizio Una stanza e’ monitorata da 4 sensori di temperatura, i quali sono pilotati da un PD 32. Quest’ultimo controlla costantemente che il valor medio della temperatura rilevata nella stanza sia compreso tra i valori [Tmin-Tmax]. Nel caso in cui il valor medio della temperatura non cada in tale intervallo, il microprocessore inviera’ un segnale di allarme su un’apposita periferica, detta ALARM. Il segnale d’allarme utilizzato e’ il valore 1 codificato con 8 bit. Se la temperatura ritorna all’interno dell’intervallo [Tmin-Tmax], la CPU invia sulla periferica ALARM il valore 0. I sensori ritornano la temperatura misurata come un numero intero ad 8 bit, usando i decimi di gradi Celsius come unita’ di misura. Scrivere il codice assembly per il controllo dei sensori di temperatura e della periferica di allarme.
Macchina a stati finiti new. Temp, T_media NON in [Tmin-Tmax] / Alarm_ON T_media in [Tmin-Tmax] new. Temp, T_media in [Tmin-Tmax] / - Legenda per le transizioni: Input, Condizione / Output new. Temp, T_media NON in [Tmin-Tmax]/ T_media fuori da [Tmin-Tmax] new. Temp, T_media in [Tmin-Tmax] / Alarm_OFF
Diagramma di flusso T_media=Ts 1=Ts 2=Ts 3=Ts 4= = (Tmin+Tmax)/2 Stato=IN_RANGE g ollin P controlla dev. succ dev i ready? NO SI Input da dev_i: new_T_si Stato=OUT Stato=IN Ricalcola media: T_media=T_media+(new_T_si-old_T_si)/4 SI SI Stato = IN NO OUTPUT: ALARM OFF SI T_media in_range? NO Stato = OUT NO OUTPUT: ALARM ON
- Slides: 23