Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
student
2
Siamo partiti da
John von Neumann wrote "First Draft of a Report on the EDVAC, 1945 Dispositivi di ingresso: Tastiera Mouse Scanner Sensori Ecc.. Dispositivi di uscita: Monitor Stampante Attuatori Ecc...
CALCOLATORE ELETTRONICO
Memoria principale Unit di elaborazione (CPU)
PROGRAMMA DATI
ALU REGISTRI
Bus di sistema
Rete
per arrivare a
CPU
INT INTA Logica di generazione dei CS
8259
INTRs
Sotto-sistema di I/O
4
IL SISTEMA
Interfaccia LED
Interfaccia OROLOGIO
COM1
COM2
Interfaccia INTERRUTORI
COM3
Fck = 1Hz
5
Funzionamento
Il sistema riceve di continuo dei dati dalla COM1. I dati sono costituiti da messaggi di dimensione pari ad 1KB. Ricevuto un intero messaggio, il sistema deve trasferire lintero messaggio sulla COM2 o sulla COM3 sulla base del valore corrente degli interruttori (interpretato come byte senza segno): per valori compresi tra 0 e 127 il messaggio deve essere trasferito verso la COM2, altrimenti verso la COM3. Durante la trasmissione di un messaggio il sistema deve essere in grado di ricevere un nuovo messaggio dalla COM1. Il sistema deve inoltre, sulla base del valore corrente degli interruttori, eseguire di continuo delle routine (tasks). Lindirizzo della routine corrente da eseguire memorizzato in una tabella (tabella dei tasks). Lindice di accesso alla tabella rappresentato dal valore letto dagli interruttori (interpretato anche in questo caso come byte senza segno). A tal proposito si consideri che listruzione CALLR, consente di specificare come operando un registro. Il valore corrente degli interruttori deve essere riportato in uscita su 8 led, il cui scopo appunto quello di visualizzare la programmazione corrente del sistema.
IPOTESI
Le interfacce seriali sono realizzate con 8250 e vengono tutte e tre gestite a interrupt Lorologio deve essere gestito ad interrupt La priorit delle routine di interrupt deve essere la seguente:
RX_COM1 TX_COM2 TX_COM3 CLOCK
Quesiti
HARDWARE:
Chip Select: RAM, EPROM e I/O (Mem: 4 GB, I/O: 64 KB) Interfacciamento dei dispositivi di I/0
SOFTWARE:
Main Tabella degli interrupt Tabella dei tasks (subito dopo la fine della tabella degli interrupt) Routine di gestione degli interrupt Esempio della struttura del codice di un task
8
CS Memorie
EPROM1 64KB (16 bit di indirizzamento) FFFFFFFFH
FFFF0000H EPROM2 32KB (15 bit di indirizzamento) RAM2 32 MB (25 bit di indirizzamento) RAM1 128MB (27 bit di indirizzamento) 09FFFFFFH FFFEFFFFH FFFE8000H
RAM1: 128 MB 27 bit 5 bit costanti RAM2: 32 MB 25 bit 7 bit costanti EPROM1: 64 KB 16 bit 16 bit costanti EPROM2: 32 KB 15 bit 17 bit costanti Decodifica completa:
CS_EPROM1 CS_EPROM2 CS_RAM1 = CS_RAM2 = = BA31 .. BA16 = BA31 .. BA17 /BA16 BA15 /BA31 BA30 BA29 BA28 /BA27 /BA31 BA30 BA29 /BA28 BA27 /BA26 /BA25
08000000H 07FFFFFFH
00000000H
CS Memorie
BA EPROM1 EPROM2 RAM1 RAM2 31 1 1 0 0 30 1 1 0 0 29 1 1 0 0 28 1 1 0 0 27 1 1 0 1 26 1 1 x 0 25 1 1 x 0 24 1 1 x x 23 1 1 x x 22 1 1 x x 21 1 1 x x 20 1 1 x x 19 1 1 x x 18 1 1 x x 17 1 1 x x 16 1 0 x x
Identifica univocamente RAM2 rispetto a EPROM1 e EPROM2 Permette di distinguere EPROM1 e EPROM2 da RAM1 e RAM2 Permette di distinguere EPROM1 da EPROM2
Decodifica semplificata: CS_EPROM1 = BA31 BA16 CS_EPROM1# = /BA31 + /BA16 CS_EPROM2 = BA31 /BA16 CS_EPROM2# = /BA31 + BA16 CS_RAM1= /BA27 CS_RAM1#= BA27 CS_RAM2 = /BA31 BA27 CS_RAM2# = BA31 + /BA27
10
CS dispositivi di I/O
Decodifica semplificata: 1. 2. 3. 4. 5. 6. 7. SWITCH: FFFFH (1 byte) CS_SWITCH# = /BA15 CLOCK: 0100-0103H (4 bytes) CS_CLOCK# = /BA8 + BA7 PIC: 0200-0201H (2 bytes) CS_PIC# = /BA9 + BA7 LED: 0000H (1 byte) CS_LED# = BA9 + BA8 COM1: 01F8-01FFH (8 bytes) CS_COM1# = BA9 + /BA7 COM2: 02F8-02FFH (8 bytes) CS_COM2# = BA8 + /BA7 COM3: 03F8-03FFH (8 bytes) CS_COM3# = BA15 + /BA9 + /BA8 BA CLOCK PIC SWITCH LED COM1 COM2 COM3 1 5 0 0 1 0 0 0 0 1 4 0 0 1 0 0 0 0 1 3 0 0 1 0 0 0 0 1 2 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 9 0 1 1 0 0 1 1 8 1 0 1 0 1 0 1 7 0 0 1 0 1 1 1 6 0 0 1 0 1 1 1 5 0 0 1 0 1 1 1 4 0 0 1 0 1 1 1 3 0 0 1 0 1 1 1 2 0 0 1 0 x x x 1 x 0 1 0 x x x 0 x x 1 0 x x x 11
Interruttori: input
CS_SWITCH#
Vcc Vcc Vcc
IORDC#
S7
S6
S0
244
OUT[7..0]
BD[7] BD[6]
BD[0] 12
Led: output
L7
L6
L0
373
D[7..0]
OE*
BD[0]
13
TX RX
8250
Sar presente un 8250 per ogni porta seriale presente nel sistema (in questo caso 3)
14
Interfaccia orologio
8259
16
3FC-3FFH 3F8-3FBH 3F4-3F7H 3F0-3F3H 3EC-3EFH 3E8-3EBH 3E4-3E7H 3E0-3E3H 004-007H 000-003H
F8H * 4
1111 1000 00
Per eseguire un determinato task, la CPU sulla base di un indice i di 1 byte, acceder alla tabella per recuperare lindirizzo della routine da eseguire ed eseguir una CALLR a quellindirizzo: taskIndex taskTable LBU MULTI LW CALLR DB EQU 1 400H
Byte senza segno!
; linterrupt viene rilevato sul fronte (1BH = a livello) ; 5 bit pi significativi dellinterrupt type ; AEOI disabilitato (3H = abilitato) ; 8 bit di maschera (0: non mascherato,1: mascherato) ; da inviare per segnalare la fine della routine
;Nomi simbolici per i registri del CLOCK CLOCK_S EQU 100H CLOCK_M EQU 101H CLOCK_H EQU 102H ;Indirizzo degli SWITCH SWITCH EQU ;Indirizzo dei LED LED
FFFFH
EQU
0000H
19
20
COM_RX
Buffer0 Buffer1
COM_TX
SWAP
COM_RX
COM_TX
Ricezione: Buffer1
Trasmissione: Buffer0
I ruoli dei due buffer vengono alternativamente scambiati: mentre un buffer viene usato per memorizzare i dati attualmente ricevuti (es. Buffer0), laltro (es. Buffer1) viene usato per trasferire i dati precedentemente ricevuti. Una volta che il buffer di ricezione risulta pieno, il ruolo dei buffer viene scambiato (swap). Sotto quali ipotesi questo meccanismo funziona? 21
DOPPIO BUFFER
RxIndex
TxIndex
TxIndex
RxIndex
RxBuffer 0
RxBuffer 1
buffer0 buffer1
buffer0 buffer1
22
; interrupt rilevati a fronte ADDI R1,R0, RESET OUT ICW1(R0), R1 ;5 bit pi significati dellinterrupt type (F8H) ADDI R1,R0, ADDRESS OUT ICW2(R0), R1 ;AEOI disabilitato ADDI R1,R0, EN_AEOI OUT ICW4(R0), R1 POP RET ENDP R1
23
Le procedure di inizializzazione di COM2 e COM3 differanno da COM1 per questo valore e accederanno ai registri della propria interfaccia, e.s. LCR2, IER3,
24
Main: inizializzazione
Main: CLI
//INIZIALIZZAZIONE VARIABILI
LB LH LH LB LB LB
// INIZIALIZZAZIONE PERIFERICHE
25
Main loop
Loop: IN SB OUT R1, SWITCH(R0) taskIndex(R0),R1 LED(R0),R1 ;lettura interruttori ;memorizzazione byte di ;programmazione ;visualizzazione byte di ;programmazione
;indice corrente del task ;accesso alla tabella dei task ;esecuzione task
PROC TASKn PUSH PUSH ;CODICE DEL TASK
Loop
Generico Task:
End:
R1 R2 R3 R4
SB SB SB OUT OUT OUT ADDI OUT POP POP POP POP RFE
R1,Secondi(R0) R2,Minuti(R0) R3,Ore(R0) R1,R1,1 R4,R1,60 R4,end R1,R0,R0 R2,R2,1 R4,R2,60 R4,end R2,R0,R0 R3,R3,1 R4,R3,24 R4,end R3,R0,R0
27
;Lettura del byte ricevuto da COM1 ;Lettura dellindice corrente ;Controllo di quale sia il buffer di ricezione corrente ;Scrittura in buffer1 ;Scrittura in buffer0
Buf0: check1K:
;Fine trasferimento di 1KB? ;NO ;SI Fine trasferimento di 1KB ;Inversione del buffer corrente di ricezione
1kdone:
com3: com1_end:
28
;maschera TX COM2
TxFromBuf0 : send:
com2_end:
; EPILOGO
29
;maschera TX COM3
;Verifica del buffer di trasmissione ;e prelievo del byte da inviare Unica differenza rispetto a COM2 ;Trasferimento e incremento ; dellindice
TxFromBuf0 : send:
com2_end:
; EPILOGO
30
Main
Loop: IN SB OUT
LBU MULTI LW CALLR
OUT
R1, SWITCH(R0) taskIndex(R0),R1 LED(R0),R1
R1,taskIndex(R0) R1,R1,4 R2,taskTable(R1) R2
IN
OUT
INT_CLOCK: STI PUSH ... LB R1,Secondi(R0) LB R2,Minuti(R0) LB R3,Ore(R0) ... End: SB Secondi(R0),R1 SB Minuti(R0),R2 SB Ore(R0),R3 Ore Minuti OUT CLOCK_S(R0),R1 OUT CLOCK_M(R0),R2
Loop
taskTable taskIndex
PROC TASKn PUSH PUSH PROC TASKn PUSH ;CODICE DEL TASK PUSH
Secondi
;CODICE DELPOP TASK POP RET ;CODICE DEL TASK POP ENDP POP POP RET POP ENDP RET
ENDP
31
Overview: seriali
COM2/COM3 COM1
IN
INT_COM1: STI ... IN LHU LBU SB
Smaschera interrupt
R2, RBR1(R0) R1, RxIndex(R0) R3, RxBuffer(R0) buffer1(R1),R2 buffer0(R1),R2 R1,SWITCH(R0) IER2(R0), R1 IER3(R0),R1 OCW2(R0),R1
IN
Maschera interrupt
INT_COM2: STI LH STI SH OUT LB LH LB SH LB OUT LB OUT LB RFE LB OUT RFE R1,TxIndex(R0) TxIndex(R0),R0 IER2(R0),R0 R2,RxBuffer(R0) R1,TxIndex(R0) R2,buffer1(R1) TxIndex(R0),R0 R2,buffer0(R1) IER2(R0),R0 R2,RxBuffer(R0) THR2(R0),R2 R2,buffer1(R1) R2,buffer0(R1) THR2(R0),R2
Buf0:
SB IN OUT
com3:
INT_COM3: Continue:
Continue: send:
send:
RXIndex Buffer0
TxIndex
Buffer1
RxBuffer
32
I 10 quesiti
1. Cosa cambierebbe se linterfaccia verso l orologio funzionasse in modo diverso? Ovvero: riceve 2 byte in sequenza, dove il primo indica il parametro da settare (ore =FFH,minuti=FEH,secondi=FDH) e il secondo il valore. 2. Quali sono gli interrupt type associati alle varie routine programmando il PIC con ICW2= 38H? 3. Considerando 0-stati di wait, calcolare quando durano i vari frammenti di codice 4. Quali sono le istruzioni da inserire nelle routine di interrupt affinch si possa operare in fully nested mode? 5. Cosa cambierebbe nel caso in cui si vogliano gestire la COM2 e la COM3 a polling? Dove andrebbe inserito il codice a tal riguardo? 6. Come si potrebbe gestire a polling la forma donda periodica in modo da rilevare ogni secondo trascorso? Dove andrebbe inserito il codice a tal riguardo? 7. Volendo prevedere un task che una volta ricevuto 1KB provveda a controllare quanti byte sono uguali al carattere A come si dovrebbe agire? Chi lo fa partire? Deve lavorare ad interrupt disabilitati? 8. Si vuole introdurre anche un cicalino che si attiva quando riceve in ingresso un valore logico alto. Un task deve controllare delle variabili che rappresentano lora a cui impostata una sveglia. Nel momento in cui rileva che lora corrente coincide con lora della sveglia deve attivare il cicalino. La disattivazione del cicalino avvine mediante un pulsante gestito ad interrupt. Scrivere il codice del task che si occupa di questo, la routine di gestione del tasto ed interfacciare le due nuove periferiche al sistema. 9. Supponiamo che se nel momento in cui stato ricevuto 1KB il valore degli interruttori vale FFH, quello che si vuole fare mandare in uscita il KB ad entrambe le COM2 e COM3. Quali modifiche occorre apportare al sistema? Solo software o anche hardware? 10. Si vuole che nel momento in cui il valore degli interruttori vale 0 il sistema si comporti come segue: cerca di capire a che baud rate funziona la COM1 ed imposta di conseguenza la stessa baud rate sulle COM2 e COM3. 33