Alcune Istruzioni per la gestione dellI/O (Classe 7) 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 TIPOkI/Os----- MODODEST CLASSE Per loperando 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 è lindirizzo del device 10 => indica che lindirizzo 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. 111
I/O AB I/O DB I/O CB SELECT REG I/O RDSTART STARTD O.C. READY SCO SCA 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 SCO SCA 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.dellarea 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 lacquisizione 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 1DEV 2DEV 3DEV 4
Polling (acquisisce 100 dati da 4 dispositivi) … MOVL #100, R0; numero di dati da acquisire MOVL #DATI, R1; ind.dellarea 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 lacquisizione 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. Questultimo 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 unapposita periferica, detta ALARM. Il segnale dallarme utilizzato e il valore 1 codificato con 8 bit. Se la temperatura ritorna allinterno dellintervallo [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 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=T s1 =T s2 =T s3 =T s4 = = (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 in_range? SI Stato = IN SI Stato = OUT SI OUTPUT: ALARM OFF NO OUTPUT: ALARM ON Input da dev_i: new_T_si NO Stato=IN Stato=OUT NO
Il codice VEDI FILE POLLING.ASM SUL SITO…