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 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.
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 IACK IN IACK OUT IRQ Interfaccia del Timer
org 400h ;INIZIO PROGRAMMA timer equ 0h; indirizzo timer semaforoequ 1h; indiririzzo semaforo count1 equ 2h; indiririzzo sensore1 count2 equ 3h; indiririzzo sensore2 flagequ 1504h; flag=0 semaforo rosso, flag=1 semaforo verde nomoreequ 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 # b, 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 IACK IN IACK OUT IRQ IOWR REG COUNTER DEC TC R Q S Q IM SETIMCLRIM 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 dellinterfaccia 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 IACK IN IACK OUT IRQ
PD32 DB CB I/O DB I/O CB I/O AB 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 VIDEOREG MRD 32 bit STATUS F/F AB IRQ LD
Inizializzazione timer ; subroutine di inizializzazione parametrica, richiede il caricamento in R0 del numero ;di millisecondi dellintervallo 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