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