Alcune Istruzioni per la gestione dell’I/O (Classe 7)
TIPO CODICE OPERANDI C N Z V P I COMMENTO
0 INs dev, D0 - - - - Il dato contenuto nel
buffer del device dev è trasferito nella destinazione D0.
dev ->d0
1 OUTs S,dev - - - - Il dato sorgente S
viene trasferito nel buffer del device dev.
S->dev
2 START dev - - - - Viene azzerato il flip-
flop STATUS del dev e viene avviata
l'operazione.
3 JR dev, D1 - - - - Se STATUS=1 salta
alla destinazione D1
4 JNR dev, D1 - - - - Se STATUS=0 salta
alla destinazione D1
Per la destinazione D0 sono ammessi tutti i tipi di indirizzamento tranne quello immediato.
Per la destinazione D1 sono ammessi tutti i tipi di indirizzamento tranne quello con registro e immediato.
Formato delle istruzioni di 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.
I/O AB I/O DB I/O CB
SELECT
REG
I/O RD START
STARTD
O.C.
READY
SCA SCO
R Q S Q STATUS
PD32
I/O programmato – INTERFACCIA di INPUT
PROTOCOLLO DI HANDSHAKING IMPLEMENTATO A SOFTWARE
STARTDEV COMPLETE
“0”
WAIT
Programma assembler (input)
Aspetta1: JNR DeviceIN, Aspetta1 START DeviceIN
Aspetta2: JNR DeviceIN, Aspetta2 INB DeviceIN, R0
I/O AB I/O DB I/O CB
DEC
SELECT
REG
START I/O WR
STARTD
O.C.
READY
SCA SCO
R Q S Q STATUS
PD32
STARTDEV COMPLETE
I/O programmato- INTERFACCIA di OUTPUT
PROTOCOLLO DI HANDSHAKING IMPLEMENTATO A SOFTWARE
Programma assembler (output)
Aspetta1: JNR DeviceOUT, Aspetta 1 OUT R0, DeviceOUT
START DeviceOUT
Aspetta2: JNR DeviceOUT, Aspetta2
I/O programmato
MODALITA’ BUSY WAITING
…
MOVL #100, R0 ; numero di dati da acquisire MOVL #DATI, R1 ; ind.dell’area di memoria JSR IN_AD1
…
IN_AD1: PUSH R0; salv. registri usati PUSH R1
PUSH R2
IN_1: JNR AD1, IN_1 ; attende che AD1 sia pronto IN_2: START AD1 ;avvia l’acquisizione di un dato
IN_3: JNR AD1, IN_3 ; attende che il dato sia stato prodotto INW AD1, R2 ; prelievo del dato e….
MOVW R2, (R1)+ ; … suo trasferimento in memoria SUBL #1, R0 ; decremento del contatore
JNZ IN_2 ; acquisizione di un altro dato se non si è azzerato
; il contatore
POP R2 ; ripristino dei registri usati
POP R1 ;
POP R0 ;
RET ; ritorno al programma chiamante
Polling
(verifica circolare se ogni DEVICE è pronto ad interagire)
I/O AB I/O DB I/O CB PD32
DEV 1 DEV 2 DEV 3 DEV 4
Polling
(acquisisce 100 dati da 4 dispositivi)
…
MOVL #100, R0 ; numero di dati da acquisire MOVL #DATI, R1 ; ind.dell’area di memoria JSR IN_AD1
…
IN_AD1: PUSH R0 ; salv. registri usati PUSH R1
PUSH R2
POLL1: JR AD1, IN_1 ; attende che AD1 sia pronto POLL2: JR AD2, IN_2
POLL3: JR AD3, IN_3 POLL4: JR AD4, IN_4
JMP POLL1
…
IN_i: START ADi ; avvia l’acquisizione di un dato WAIT: JNR ADi, WAIT ; attende che il dato sia stato prodotto
INW ADi, R2 ; prelievo del dato e….
MOVW R2, (R1)+ ; … suo trasferimento in memoria SUBL #1, R0 ; decremento del contatore
JZ EXIT
JMP POLL_i+1 ; continua a interrogare le altre periferiche EXIT: POP R2 ; ripristino dei registri usati
POP R1 ;
POP R0 ;
RET ; ritorno al programma chiamante
Esercizio
Una stanza e’ monitorata da 4 sensori di temperatura, i quali sono pilotati da un PD32. 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.
Macchina a stati finiti
T_media in
[Tmin-Tmax] T_media fuori da
[Tmin-Tmax]
newTemp,T_media NON in [Tmin-Tmax] /
Alarm_ON
Legenda per le transizioni:
Input, Condizione / Output
newTemp,T_media in [Tmin-Tmax] / Alarm_OFF
newTemp,
T_media NON in [Tmin-Tmax]/
-
newTemp,
T_media in [Tmin-Tmax] /
-
Diagramma di flusso
T_media=Ts1=Ts2=Ts3=Ts4=
= (Tmin+Tmax)/2 Stato=IN_RANGE
dev i ready?
controlla dev.succ Polling
NO SI
Ricalcola media:
T_media=T_media+(new_T_si-old_T_si)/4
T_media Stato = SI
SI
Stato =
SI NO
Input da dev_i: new_T_si
Stato=IN Stato=OUT
Il codice
VEDI FILE POLLING.ASM SUL SITO…
http://www.dis.uniroma1.it/~ciciani/DIDATTICA/CALCOLATORI-II/polling.asm