E N D
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 CPU I/O DB I/O CB I/O RD I/O WR SELECT inc RESET Counter sensore
S Q STATUS R Q Interfaccia del Sensore / 2 I/O AB CPU I/O DB I/O CB SEM. DI RIFERIMENTO I/O WR Q=0 => ROSSO Q=1 => VERDE SELECT SELECT SEM. NON DI RIFERIMENTO
R Q STATUS S Q Interfaccia del Timer IRQ CPU I/O AB I/O DB I/O CB CLEAR START IACKIN IRQ IVN STARTD Decoder O.C. SELECT COMPLETE SCO STARTDEV IACKOUT
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 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 ; 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
R Q R Q STATUS IM S Q S Q Interfaccia del DEVICE (timer) CPU IRQ I/O AB I/O DB I/O CB IRQ START SETIM CLRIM IOWR CLEAR IACKIN REG IVN LD Dec SELECT OR COMPLETE SCO STARTDEV IACKOUT DEC LD TC COUNTER
Interfaccia DEV_TEMP I/O AB CPU I/O DB I/O CB I/O RD I/O WR SELECT RESET REG Termometro
R Q STATUS S Q Logica dell’interfaccia del DMAC per le interruzioni IRQ CPU I/O AB I/O DB I/O CB CLEAR START IACKIN IRQ IVN STARTD Decoder O.C. SELECT COMPLETE SCO DMAC STARTDEV IACKOUT
AB PD32 DB MEMORIA CB 32 bit I/O WR INC CAR 32 bit LD REG REG VIDEO SELECT DECR MRD I/O WR WC TC DATO SCRITTO Q MBR SCO DMAC SCO VIDEO NEXT DATO MBR F/F IRQ O.C. I/O AB MBG I/O DB I/O CB STATUS F/F
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