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.
Interfaccia del Sensore / 1
I/O AB
I/O DB
I/O CB
CPU
I/O RD
I/O WR
SELECT
RESET
Counter
inc
sensore
Interfaccia del Sensore / 2
I/O AB
I/O DB
I/O CB
CPU
I/O WR
Q=0 => ROSSO
Q=1 => VERDE
SELECT
SELECT
S
Q
STATUS
R Q
Interfaccia del Timer
IRQ
I/O AB
I/O DB
I/O CB
CLEAR
START
IRQ
STARTD
Decoder
CPU
IACKIN
IVN
O.C.
SELECT
R
Q
STATUS
S
Q
COMPLETE
STARTDEV
SCO
IACKOUT
org 400h ;INIZIO PROGRAMMA
timer
semaforo
count1
count2
buffer
flag
nomore
lastmis
equ 0h
equ 1h
equ 2h
equ 3h
equ 1500h
equ 1504h
equ 1505h
dl 0
; indirizzo timer
; indiririzzo semaforo
; indiririzzo sensore1
; indiririzzo sensore2
; indirizzo buffer di scambio
; flag=0 semaforo rosso, flag=1 semaforo verde
; nomore=1 già ritardato, =0 è possibile ritardare
; ultima misura dai sensori
code
main:
jsr init
seti
; abilita PD32 ad accettare interruzioni
; setim NB: questo non va incluso perchèell'interfaccia non abbiamo incluso un ff IM
;...
jmp main
; NB usato solo per la simulazione!
init:
movl #0, buffer
movl #0, flag
movl #0, nomore
;setim timer solo simulatore
start timer
ret
;DRIVER TIMER
driver 0, 600h
push r0
push r1
push r2
movl lastmis, r1
movb flag,r0
cmpb #1,r0
jz verde
verde:
; Il driver della periferica con IVN=2
; inizia dall'ind. 600h
; salva contenuto di R0
; carico in r1 il numero di macchine misurato nell'ultimo intervallo
; carica flag in R0
; controlla se semaforo di riferimento è verde
; semaforo di riferimento attualmente rosso
inl count1, r0
; legge valore da sensore 1, abbinato al semaforo non di riferimento
outb #1, count1; resetta il contatore 1
jmp continue
inl count2, r0
; legge valore da sensore 2, abbinato al semaforo di riferimento
outb #1, count2
; resetta il contatore 2
continue:
movl r0,lastmis
; e sovrascrivo in memoria lastmis. lastims<-ultima misura
movb nomore, r2
cmpb #1,r2
; verifica se lo switch è stato già ritardato
jz switch
; in tal caso forza lo switch
subl r1, r0
; r0<-differenza tra mis(t)-mis(t-1)
cmpl #32,r0
; r0>=32 <=> N == V
jv vset
jnn cont ; altrimenti v=0, e se n=0 --> r0>=32
jmp switch
; r0 <32
vset: jn cont
; v=1, n=1 --> r0>=32 => no switch
switch:
; else switch
movb flag,r0
; carica flag in R0
notb flag,r0
andb #00000001b, r0
movb r0,flag
; inverte il valore del flag che memorizza lo stato del semaforo
movb #0,nomore ; setta a 0 il flag nomore, inibendo ulteriori ritardi nello switch
outb r0,semaforo
start timer
pop r2
pop r1
pop r0
rti
; setto il sem.di riferimento a verde
; riavvia il timer
cont:
movb #1, nomore
; setta a 1 il flag nomore
start timer
; riavvia il timer
pop r2
pop r1
pop r0
rti
end
; FINE PROGRAMMA
Esercizio esame DMAC
Interfaccia del DEVICE (timer)
I/O AB
I/O DB
I/O CB
IOWR
Dec
START
SETIM CLRIM
CLEAR
REG
LD
CPU
IRQ
IACKIN
IVN
R
Q
STATUS
S
Q
COMPLETE
SELECT
OR
STARTDEV
LD
R Q
IM
S Q
IRQ
DEC
COUNTER
TC
SCO
IACKOUT
Interfaccia DEV_TEMP
I/O AB
I/O DB
I/O CB
CPU
I/O RD
I/O WR
SELECT
RESET
REG
Termometro
Logica dell’interfaccia del DMAC per le
interruzioni
IRQ
I/O AB
I/O DB
I/O CB
CLEAR
START
IRQ
STARTD
Decoder
CPU
IACKIN
IVN
O.C.
SELECT
R
Q
STATUS
S
Q
COMPLETE
STARTDEV
SCO DMAC
IACKOUT
AB
DB
CB
PD32
MEMORIA
32 bit
I/O WR
CAR
INC
32 bit
REG VIDEO
LD
DECR
WC
I/O WR
I/O AB
I/O DB
I/O CB
IRQ
TC
MBR
Q
O.C.
MBG
STATUS
F/F
MBR
F/F
MRD
SELECT
REG
SCO
DMAC
DATO SCRITTO
NEXT DATO
SCO
VIDEO
Inizializzazione timer
; subroutine di inizializzazione parametrica, richiede il caricamento in R0 del numero
;di millisecondi dell’intervallo
init:
outb R0, DEVICE
start DEVICE
ret
Driver timer
DRIVER 1,600h
PUSH R0
INB DEVTEMP, R0
CMPB R0,#40
JN N_EQ_1
N_EQ_0:JNV NV_EQ
JMP NV_DIF
N_EQ_1:JV NV_EQ
JMP NV_DIF
NV_EQ: START DEVICE
POP R0
RTI
NV_DIF: CLRIM DEVICE
OUT #512, WCOUNTER
OUT #BBBBh,CAR
START DMAC
POP R0
RTI
; inizializza il WCOUNTER
; passa il valore al CAR
;avvia trasferimento
Driver DMAC
DRIVER 2,700h
SETIM DEVICE
START DEVICE
CLEAR DMAC
RTI
Scarica

Document