Esercizio Semaforo
description
Transcript of Esercizio Semaforo
Esercizio Semaforo
Un processore è interfacciato a due periferiche di input che indicano il numero di autovetture passate nelle due direzioni di un incrocio a X, al relativo semaforo e ad un TIMER. Normalmente il processore ogni minuto comanda il semaforo ad invertire l’abilitazione ai passaggi (da rosso a verde e viceversa). Prima di abilitare la commutazione del semaforo, il processore legge il numero di autovetture passate nella direzione con il verde, se il numero di auto passate in questa direzione è maggiore di 32 unità rispetto a quello dell’altra direzione (conteggiato nell’ultimo periodo), allora il processore ritarda la commutazione del semaforo di un altro minuto.
Ogni volta che il processore legge i valori del numero di autovetture passate avverte il SCO delle periferiche di input di riazzerare il relativo contatore.
Progettare l’interfaccia del TIMER, una delle interfacce di input e l’interfaccia della periferica che gestisce il semaforo. Inoltre progettare il software per la gestione delle interruzioni provenienti dal TIMER.
I/O DBI/O CB
SELECT
Counter
I/O RD
CPU
I/O WR
RESET
I/O AB
sensore
inc
Interfaccia del Sensore / 1
I/O DBI/O CBCPU
I/O WR
I/O AB
SELECT S Q
R Q
STATUS
SELECT
Q=0 => ROSSO
Q=1 => VERDE
Interfaccia del Sensore / 2
I/O ABI/O DBI/O CB
Decoder
SELECT
START
STARTD O.C.
IRQ
SCO
R Q
S Q
STATUS
STARTDEV
COMPLETE
CLEAR
IVN
CPU
IACKIN
IACKOUT
IRQ
Interfaccia del Timer
org 400h ;INIZIO PROGRAMMA
timer equ 0h ; indirizzo timersemaforo equ 1h ; indiririzzo semaforocount1 equ 2h ; indiririzzo sensore1count2 equ 3h ; indiririzzo sensore2buffer equ 1500h ; indirizzo buffer di scambioflag equ 1504h ; flag=0 semaforo rosso, flag=1 semaforo verdenomore equ 1505h ; nomore=1 già ritardato, =0 è possibile ritardarelastmis dl 0 ; ultima misura dai sensori
codejsr initseti ; abilita PD32 ad accettare interruzioni; setim NB: questo non va incluso perchèell'interfaccia non abbiamo incluso un ff IM
main: ;...jmp main ; NB usato solo per la simulazione!
init:movl #0, buffermovl #0, flagmovl #0, nomore;setim timer solo simulatorestart timerret
;DRIVER TIMERdriver 0, 600h ; Il driver della periferica con IVN=2
; inizia dall'ind. 600hpush r0 ; salva contenuto di R0push r1push r2movl lastmis, r1 ; carico in r1 il numero di macchine misurato nell'ultimo intervallomovb flag,r0 ; carica flag in R0cmpb #1,r0 ; controlla se semaforo di riferimento è verdejz verde
; semaforo di riferimento attualmente rossoinl count1, r0 ; legge valore da sensore 1, abbinato al semaforo non di riferimentooutb #1, count1; resetta il contatore 1jmp continue
verde: inl count2, r0 ; legge valore da sensore 2, abbinato al semaforo di riferimentooutb #1, count2 ; resetta il contatore 2
continue:movl r0,lastmis ; e sovrascrivo in memoria lastmis. lastims<-ultima misuramovb nomore, r2cmpb #1,r2 ; verifica se lo switch è stato già ritardatojz switch ; in tal caso forza lo switchsubl r1, r0 ; r0<-differenza tra mis(t)-mis(t-1)cmpl #32,r0 ; r0>=32 <=> N == Vjv vsetjnn cont ; altrimenti v=0, e se n=0 --> r0>=32jmp switch ; r0 <32
vset: jn cont ; v=1, n=1 --> r0>=32 => no switchswitch: ; else switch
movb flag,r0 ; carica flag in R0notb flag,r0andb #00000001b, r0movb r0,flag ; inverte il valore del flag che memorizza lo stato del semaforomovb #0,nomore ; setta a 0 il flag nomore, inibendo ulteriori ritardi nello switch
outb r0,semaforo ; setto il sem.di riferimento a verdestart timer ; riavvia il timerpop r2pop r1pop r0rti
cont: movb #1, nomore ; setta a 1 il flag nomorestart timer ; riavvia il timerpop r2pop r1pop r0rti
end ; FINE PROGRAMMA
Esercizio esame DMAC
I/O ABI/O DBI/O CB
Dec
SELECT
START
IRQ
SCO
R Q
S Q
STATUS
STARTDEV
COMPLETE
CLEAR
IVN
CPU
IACKIN
IACKOUT
IRQ
IOWR
REG
COUNTERDEC
TC
R Q
S Q
IM
SETIM CLRIM
LD
LD
OR
Interfaccia del DEVICE (timer)
I/O DBI/O CB
SELECT
REG
I/O RD
CPU
I/O WR
RESET
I/O AB
Termometro
Interfaccia DEV_TEMP
Logica dell’interfaccia del DMAC per le interruzioni
I/O ABI/O DBI/O CB
Decoder
SELECT
START
STARTD O.C.
IRQ
SCO DMAC
R Q
S Q
STATUS
STARTDEV
COMPLETE
CLEAR
IVN
CPU
IACKIN
IACKOUT
IRQ
PD32 DBCB
I/O
DB
I/O
CBI/
O A
BMEMORIA
SE
LE
CT
I/O WR CAR
INC
WCI/O WR
SCODMAC
DECR
TC
MBRF/F
Q
O.C.
MBR
MBGSCO
VIDEO
DATO SCRITTONEXT DATO
REG VIDEOREG
MR
D
32 bit
32 bit
STATUSF/F
ABIR
Q
LD
Inizializzazione timer
; subroutine di inizializzazione parametrica, richiede il caricamento in R0 del numero;di millisecondi dell’intervallo
init: outb R0, DEVICEstart DEVICEret
Driver timerDRIVER 1,600h
PUSH R0INB DEVTEMP, R0CMPB R0,#40JN N_EQ_1
N_EQ_0:JNV NV_EQJMP NV_DIF
N_EQ_1:JV NV_EQJMP NV_DIF
NV_EQ: START DEVICEPOP R0RTI
NV_DIF: CLRIM DEVICEOUT #512, WCOUNTER ; inizializza il WCOUNTEROUT #BBBBh,CAR ; passa il valore al CARSTART DMAC ;avvia trasferimentoPOP R0RTI
Driver DMACDRIVER 2,700h
SETIM DEVICESTART DEVICECLEAR DMACRTI