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 DB I/O CB
SELECT
Counter
I/O RD
CPU
I/O WR
RESET
I/O AB
sensore inc
Interfaccia del Sensore / 1
I/O DB I/O CB CPU
I/O WR
I/O AB
SELECT S Q
R Q STATUS SELECT
Q=0 => ROSSO Q=1 => VERDE
Interfaccia del Sensore / 2
SEM. DI RIFERIMENTO
SEM. NON DI RIFERIMENTO
I/O AB I/O DB I/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 timer
semaforo equ 1h ; indiririzzo semaforo count1 equ 2h ; indiririzzo sensore1 count2 equ 3h ; indiririzzo sensore2
flag equ 1504h ; flag=0 semaforo rosso, flag=1 semaforo verde nomore equ 1505h ; nomore=1 già ritardato, =0 è possibile ritardare lastmis dl 0 ; ultima misura dai sensori
code
jsr init
seti ; 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, flag movl #0, nomore
;setim timer solo simulatore start timer
ret
;DRIVER TIMER
driver 0, 600h ; Il driver della periferica con IVN=2
; inizia dall'ind. 600h push r0 ; salva contenuto di R0 push r1
push r2
movl lastmis, r1 ; carico in r1 il numero di macchine misurato nell'ultimo intervallo movb flag,r0 ; carica flag in R0
cmpb #1,r0 ; controlla se semaforo di riferimento è verde jz 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
verde: 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
jnc cont switch:
movb flag,r0 ; carica flag in R0 notb 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 ; setto il sem.di riferimento al nuovo stato
start timer ; riavvia il timer pop r2
pop r1 pop r0 rti
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
I/O AB I/O DB I/O CB
Dec
SELECT
START
IRQ
SCO R Q
S Q STATUS
STARTDEV
COMPLETE
CLEAR
IVN
CPU
IACKIN
IACKOUT
IRQ
IOWR
REG
COUNTER
DEC
TC
R Q
S Q IM
SETIM CLRIM
LD
LD
OR
Interfaccia del DEVICE (timer)
I/O DB I/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 AB I/O DB I/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 DB CB
I/ O D B I/ O C B
I/ O A B
MEMORIA
SELECT
I/O WR
CAR INC
WC I/O WR
SCO DMAC
DECR TC
MBR F/F Q
O.C.
MBR
MBG
SCO VIDEO
DATO SCRITTO NEXT DATO
REG VIDEO REG
MRD
32 bit
32 bit
STATUS F/F
AB
IR Q
LD
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 ; inizializza il WCOUNTER OUT #BBBBh,CAR ; passa il valore al CAR
START DMAC ;avvia trasferimento
POP R0 RTI
Driver DMAC
DRIVER 2,700h
SETIM DEVICE START DEVICE CLEAR DMAC RTI