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 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 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