Title: Gestione delle subroutine
1Esercizio 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 labilitazione 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 dellaltra direzione (conteggiato
nellultimo 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 linterfaccia
del TIMER, una delle interfacce di input e
linterfaccia della periferica che gestisce il
semaforo. Inoltre progettare il software per la
gestione delle interruzioni provenienti dal TIMER.
2Interfaccia del Sensore / 1
I/O AB
CPU
I/O DB
I/O CB
I/O RD
I/O WR
SELECT
inc
RESET
Counter
sensore
3Interfaccia del Sensore / 2
I/O AB
CPU
I/O DB
I/O CB
SEM. DI RIFERIMENTO
I/O WR
Q0 gt ROSSO Q1 gt VERDE
SELECT
SELECT
SEM. NON DI RIFERIMENTO
4Interfaccia del Timer
IRQ
CPU
I/O AB
I/O DB
I/O CB
START
CLEAR
IACKIN
IRQ
IVN
STARTD
Decoder
O.C.
SELECT
COMPLETE
SCO
STARTDEV
IACKOUT
5org 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 flag0 semaforo rosso,
flag1 semaforo verde nomore equ 1505h
nomore1 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!
6init movl 0, flag movl 0, nomore setim
timer solo simulatore start timer ret DRIVER
TIMER driver 0, 600h Il driver della
periferica con IVN2 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
7continue movl r0,lastmis e sovrascrivo in
memoria lastmis. lastimslt-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 r0lt - 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
8cont movb 1, nomore setta a 1 il flag
nomore start timer riavvia il timer pop
r2 pop r1 pop r0 rti end FINE PROGRAMMA
9Esercizio esame DMAC
10Interfaccia del DEVICE (timer)
CPU
IRQ
I/O AB
I/O DB
I/O CB
IRQ
START
IOWR
SETIM
CLRIM
CLEAR
IACKIN
REG
IVN
LD
Dec
SELECT
OR
COMPLETE
SCO
STARTDEV
IACKOUT
DEC
LD
TC
COUNTER
11Interfaccia DEV_TEMP
I/O AB
CPU
I/O DB
I/O CB
I/O RD
I/O WR
SELECT
RESET
REG
Termometro
12Logica dellinterfaccia del DMAC per le
interruzioni
IRQ
CPU
I/O AB
I/O DB
I/O CB
START
CLEAR
IACKIN
IRQ
IVN
STARTD
Decoder
O.C.
SELECT
COMPLETE
SCO DMAC
STARTDEV
IACKOUT
13AB
PD32
DB
MEMORIA
CB
32 bit
I/O WR
INC
CAR
32 bit
LD
REG VIDEO
REG
SELECT
DECR
MRD
WC
I/O WR
TC
DATO SCRITTO
Q
MBR
SCO DMAC
SCO VIDEO
NEXT DATO
MBR F/F
IRQ
I/O AB
O.C.
MBG
I/O DB
I/O CB
STATUS F/F
14Inizializzazione timer
subroutine di inizializzazione parametrica,
richiede il caricamento in R0 del numero di
millisecondi dellintervallo init outb R0,
DEVICE start DEVICE ret
15Driver timer
DRIVER 1,600h PUSH R0 INB DEVTEMP, R0 CMPB
R0,40 JN N_EQ_1 N_EQ_0JNV NV_EQ JMP
NV_DIF N_EQ_1JV 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
16Driver DMAC
DRIVER 2,700h SETIM DEVICE START DEVICE CLEAR
DMAC RTI