Caricare documenti e articoli online 
INFtub.com è un sito progettato per cercare i documenti in vari tipi di file e il caricamento di articoli online.


 
Non ricordi la password?  ››  Iscriviti gratis
 

Arbitraggio dei colloqui

informatica




Arbitraggio dei colloqui


Se analizziamo uno scambio di dati tra più di due elementi (sia nel caso del microprocessore collegato alle varie periferiche che in quello del computer centrale collegato ad un certo numero di terminali) occorre prevedere nel Protocollo ulteriori regole per distinguere il sistema cui si è collegati.

Due sono i metodi utilizzati per coordinare il trasferimento dei dati:

colloquio sotto il controllo dell'unità centrale (o Polling);

colloquio su richiesta della periferica (o Interrupt).

Chiameremo Master l'unità principale che detiene il controllo del protocollo e Slave i generici elementi collegati.



Polling

Il Master interroga ciclicamente tutti gli Slave, esaminando per ciascuno un opportuno registro di stato, in modo da individuare chi è disponibile al colloquio (in input o in output):

Se la periferica non è pronta, l'esame passa allo Slave successivo.

Se la periferica è pronta viene effettuato lo scambio dei dati e, al termine, il master riprende l'esame ciclico.

Con questo metodo, detto Polling, l'unità centrale ha il controllo completo dello stato d'avanzamento dei processi, decide di volta, in volta se una periferica deve essere interpellata o no, decide l'ordine di Priorità che può anche cambiare durante il lavoro. Altro vantaggio è la relativa semplicità circuitale e del software di gestione.

Per contro il Master spreca buona parte del suo tempo in interrogazioni spesso inutili degli altri dispositivi. Inoltre, una periferica che si renda disponibile al colloquio subito dopo un'interrogazione con esito negativo, dovrà attendere tutto il ciclo di Polling prima di essere nuovamente interpellata con probabile perdita di dati (ad esempio il registro Rx Hold dell'RS232 che rischia d'essere soprascritto dal prossimo carattere in arrivo sul registro Rx Shift).

Interrupt

Quando il Polling non è utilizzabile per ragioni d'efficienza, viene adottata la tecnica dell'Interruzione di Programma (Interrupt): in questo caso lo Slave che ha necessità di un col 636f51g loquio (o che si è reso disponibile dopo una precedente richiesta del Master) invia all'unità centrale un segnale di richiesta su un apposito canale.

Più in generale per "Interrupt" si intende il verificarsi di un evento esterno che alteri l'esecuzione di un programma.

Il master può decidere se ascoltare o no il segnale d'interrupt (mascheramento) che, in ogni modo, non può interrompere un'istruzione macchina in corso.

Ricevuta la richiesta il master salva sullo Stack le informazioni relative al programma in corso (Program counter, Flags, registri dati).

Viene quindi attivata la procedura di riconoscimento della periferica che ha chiesto il servizio.

In base al tipo di slave viene eseguita una subroutine specifica per trasferire i dati da o verso la periferica.

Al termine del colloquio il master riprende dallo stack i valori parcheggiati e prosegue il programma interrotto.

Con questo tipo di gestione il master può eseguire altri programmi durante le fasi in cui le periferiche sono inattive, intervenendo solo quando è necessario eseguire il trasferimento dei dati. Per contro viene richiesta una maggiore complessità circuitale e, soprattutto, software, per risolvere una serie di problemi aggiuntivi:

Riconoscimento della periferica che inoltrato il segnale di interrupt (escludendo che le richieste pervengano su fili separati per ciascuna periferica) e attivazione della subroutine di servizio relativa.

In caso di contemporaneità di richiesta occorre scegliere quale slave servire per primo assegnando dei livelli di priorità.

Per evitare la nidificazione delle chiamate occorre disabilitare il segnale di interrupt durante l'esecuzione della subroutine di servizio.

Potrebbe essere necessario, durante il lavoro, abilitare selettivamente solo alcune periferiche ed altre no.

Riconoscimento con ciclo di verifica periferiche

La soluzione più semplice consiste nell'attivare, dopo la segnalazione di interrupt, un ciclo di interrogazioni analogo al Polling.

Il master cerca la periferica disponibile al colloquio nell'ordine che ritiene più valido al momento, scavalcando quelle che desidera disabilitare. In caso di verifica positiva viene invocata la subroutine corrispondente e, se il programma lo prevede, il piedino di interrupt viene temporaneamente disabilitato fino al termine del colloquio.

Lo svantaggio di questo sistema è la relativa lentezza da parte dell'unità centrale ad attivare il colloquio.

Daisy chain

Si tratta di una soluzione hardware che permette di abilitare solo una delle periferiche che chiedono il colloquio, secondo una priorità prefissata:

tutte le periferiche sono collegate con un unico canale al piedino di interrupt (INTREQ) del master;

quando riceve una richiesta, il master invia un segnale di abilitazione INTACK (Interrupt Ackonowledge);

il segnale di INTACK attraversa in serie una cascata di dispositivi elementari, uno per periferica: ciascuno di questi circuiti lascia passare l'abilitazione se la periferica collegata non ha chiesto il servizio, mentre blocca il segnale abilitando la propria periferica se questa aveva generato il segnale di interrupt;

la periferica abilitata trasmette sul bus dati il proprio codice di riconoscimento;

l'unità centrale in base a questo codice cerca in un elenco l'indirizzo della subroutine di servizio e la esegue.

La tecnica daisy chain permette una gestione semplice ed economica del colloquio in interrupt, con la possibilità di aggiungere altre periferiche alla catena fino al numero massimo consentito dal codice di riconoscimento.

D'altro canto le priorità degli slave sono legate alla collocazione hardware e quindi non sono modificabili (il circuito più vicino al master ha sempre la precedenza); inoltre non è possibile disabilitare selettivamente solo alcune periferiche.

Controllore di interrupt esterno

Il metodo più versatile per arbitrare le richieste di interrupt è quello di affidare il lavoro ad un dispositivo esterno dedicato.

Nel caso del PC viene usato il controllore PIC 8259 (Programmable Interrupt Controller) che gestisce 8 linee di Interrupt separate; il PIC può essere istruito dal microprocessore in base alle varie esigenze:

ad ogni periferica viene assegnato un codice differente;

viene fissato un ordine di priorità degli otto dispositivi collegati;

il master può chiedere di abilitare selettivamente solo alcune linee;

quando il PIC riceve una segnalazione trasmette sul Bus Dati il codice corrispondente alla periferica;

quando due o più periferiche chiedono di essere servite, il PIC provvede a selezionare quella con priorità più alta;

solo quando il microprocessore, terminato il servizio della periferica, comunica la fine dell'interruzione, il PIC abilita ulteriori richieste.



La gestione degli INTERRUPT nel PC  

I processori a 16 bit dell'INTEL prevedono una gestione vettorizzata delle interruzioni: in corrispondenza del segnale INTA, il processore legge il byte basso del bus dati e utilizza il valore letto come puntatore alla tabella di 256 indirizzi di 4 byte ciascuna, posta nella RAM da 00000h a 003FFh.

Ad ogni Interrupt corrisponde l'indirizzo di una Subroutine di gestione (sempre di tipo FAR indipendentemente dal modello di memoria utilizzato dal programma principale); la sequenza delle operazioni eseguite dal mP è:

Termina l'istruzione in corso.

Salva i registri CS, IP e Flag nello Stack.

Acquisisce dal PIC il codice della periferica che ha chiesto l'interrupt.

Legge dalla tabella degli Interrupt i nuovi valori per IP e CS.

Esegue la routine di colloquio con la periferica o di gestione dell'evento.

In uscita dalla Subroutine, con l'istruzione IRET vengono recuperati i Flag e i vecchi valori di IP e CS.

La stessa procedura viene seguita sia per gli Interrupt Hardware (corrispondenti alla richiesta da una periferica) che per gli Interrupt Software (invocato da programma con l'istruzione INT xx )

INT

CS:IP in Tabella a

Evento concomitante o Funzione Svolta dalla Subroutine

00h

03h - 00h

Divisione per 0

01h

07h - 04h

Esecuzione passo-passo del programma

02h

0Bh - 08h

NMI ( Interrupt Non Mascherabile )

03h

0Fh - 0Ch

Breakpoint

04h

13h - 10h

Overflow

05h

17h - 14h

Print Screen

08h

23h - 20h

System Timer IRQ0

09h

27h - 24h

Lettura tastiera e inserimento nel buffer : IRQ1

0Bh

2Fh - 2Ch

Colloquio con COM2 : IRQ3

0Ch

33h - 30h

Colloquio con COM1 : IRQ4

0Dh

37h - 34h

IRQ5

0Eh

3Bh - 38h

Controller Floppy disk: IRQ6

0Fh

3Fh - 3Ch

Colloquio con LPT1 : IRQ7

10h

43h - 40h

Gestione del video

14h

53h - 50h

Gestione della comunicazione seriale

16h

5Bh - 58h

Gestione della tastiera

1Ch

70h - 73h

Richiamato dalla sub di INT 8: a disposizione dell'utente

33h

CFh - CCh

Gestione del Mouse

70h

1C3h - 1C0h

Real Time Clock: IRQ8

76h

1DBh - 1D8h

Controller Hard disk: IRQ14


Per collegare più periferiche alla linea INT del microprocessore viene usato il controllore 8259 (Programmable Interrupt Controller) che gestisce 8 linee di Interrupt anche in termini di priorità: quando due o più periferiche chiedono contemporaneamente di essere servite, il PIC provvede a selezionare quella con priorità più alta ed a trasmettere sul Bus Dati un codice corrispondente. Quando il microprocessore termina il servizio della periferica, comunica al PIC la fine dell'interruzione (EOI) in modo da poter abilitare ulteriori Interrupt.

Nei PC di tipo AT e successivi sono presenti 2 PIC (definiti PIC#1 e PIC#2), collegati in cascata ed allocati agli indirizzi  20h-21h  e  A0h-A1h  rispettivamente:

Nella fase di Bootstrap il BIOS provvede a programmare PIC#1 e PIC#2 trasmettendo gli opportuni parametri ai registri 20h-21h e A0h-A1h (priorità delle interruzioni, associazione tra IRQx e Vettore Interrupt, ecc... ).

Gli Interrupt così collegati al piedino INTR del microprocessore possono essere abilitati o disabilitati in blocco agendo sul flag di Interrupt con le istruzioni assembler STI e CLI (gli Interrupt software NON sono mascherabili).

I singoli IRQ possono poi essere abilitati o disabilitati mascherando ciascun bit del registro di indirizzo dispari del PIC (ogni bit corrisponde ad un IRQ) tenendo presente che 0 equivale all'abilitazione mentre 1 equivale alla disabilitazione dell'Interrupt.

Ad esempio, per abilitare la seriale COM2 occorre:

IN AL , 21h

AND AL, 11110111b

OUT 21h, AL

Per resettare la richiesta in corso, al termine della routine di Interrupt,

bisogna inviare il valore 20h all'indirizzo pari del PIC interessato.

MOV AL , 20h

OUT 20h, AL

La gestione del Timer  

Nel PC è installato il timer PIT 8253/8254 (Programmable Interval Timer) che si occupa di scandire il tempo per i dispositivi interni.

Il PIT è mappato in isolated I/O agli indirizzi 040h ÷ 043h e riceve in input il segnale prodotto da un clock base di 1193180 Hz; la frequenza in output è ottenuta decrementando un registro interno a 16 bit, a partire ogni volta da un valore fissato programmabile, e generando un segnale alto in output ogni volta che il registro si azzera.
In pratica assegnando al registro un valore 1 si ottiene in output la stessa frequenza del segnale di ingresso, assegnando 2 si ottiene una frequenza dimezzata (un periodo raddoppiato) e così via.

La minima frequenza è ottenibile assegnando 0 come valore iniziale, in quanto il segnale di out verrà generato ogni 65536 decrementi del registro base.

Registro di Controllo

Il PIT 8253/8254 può essere programmato scrivendo un byte di controllo nell'indirizzo I/O 043h (registro a sola scrittura) e quindi uno o due byte nei registri dei singoli contatori (lettura/scrittura).

L'accesso ai registri dei singoli contatori è sempre 8 bit alla volta.

bit









043h










select counter

00 = counter 0

01 = counter 1 

10 = counter 2

read /write

successiva operazione di lettura o scrittura sui registri contatori:

01 = solo byte basso

10 = solo byte alto

11 = prima byte basso e dopo byte alto

mode 

modalità operativa del PIT,

valori da 000 a 101.

BCD 

0 = conteggio a 16 bit da 0h a FFFFh

1 = conteggio BCDdecimale da 0 a 9999

Contatore 0

Il valore di partenza del contatore è 0 (ovvero 65536): la frequenza di Out è 1193180 / 65536 = 18.206 Hz.

Il segnale Out 0 è collegato a IRQ 0 del PIC: circa 18 volte al secondo il mP interrompe il lavoro e incrementa la longword 046Ch in memoria, che è stata inizializzata all'atto del bootstrap con il numero dei clock trascorsi dalla mezzanotte precedente (l'orologio di sistema è in funzione anche a PC spento);

quando sono raggiunte le 24:00 ( » 157300 impulsi ) viene incrementato il byte 0470h.

Contatore 1

Il contatore 1 opera con un valore 18, quindi genera una frequenza pari a 66288 Hz: questo segnale viene utilizzato per il refresh delle memorie dinamiche DRAM.

Contatore 2

Il contatore due è utilizzato per generare la frequenza di funzionamento dell'altoparlante interno (Speaker).

Per programmare il contatore 2 occorre attivare la modalità 3 del PIT con conteggio binario:

mov    al,    10110110b        contatore 2, byte basso e poi byte alto, modo 3, binario

out      43h,     al

mov    al,        low-count

out      42h,     al

mov    al,        high-count

out      42h,     al



La gestione dello Speaker  

La scala delle note musicali (basata su 440 Hz = LA, e con un Fattore moltiplicativo per un semitono = 1,0594631 pari alla radice 12° di 2 ) viene riprodotta dividendo il Clock base del PC = 1193180 Hz per la frequenza, ed assegnando il divisore al registro 0x42 del counter 0 del Timer, collegato allo speaker.

Ad esempio il LA = 440 Hz viene ottenuto con un divisore .


Scala delle note musicali: Clock base del PC = 1193180 / frequenza nota

Fattore moltiplicativo per un semitono = 1,0594631  

divisore  nota    frequenza

divisore  nota    frequenza

10847 LA   110

10238 LA#     117

 9664   SI     123

 9121   DO 131

 8609   DO#    139

 8126   RE   147

 7670   RE#     156

 7240   MI   165

 6833   FA   175

 6450   FA#     185

 6088   SOL     196

 5746   SOL#   208

 5424   LA   220

 5119   LA#     233

 4832   SI     247

 4561   DO 262

 4305   DO#    277

 4063   RE   294

 3835   RE#     311

 3620   MI   330

 3417   FA   349

 3225   FA#     370

 3044   SOL     392

 2873   SOL#   415

 2712   LA   440

2712    LA 440

2560    LA#   466

2416    SI   494

2280    DO     523

2152    DO#   554

2032    RE 587

1918    RE#    622

1810    MI     659

1708    FA     698

1612    FA#   740

1522    SOL   784

1437    SOL#     831

1356    LA     880

1280    LA#   932

1208    SI   988

1140    DO 1047

1076    DO#    1109

1016    RE   1175

 959     RE#     1245

 905     MI   1319

 854     FA   1397

 806     FA#     1480

 761     SOL     1568

 718     SOL#   1661

 678     LA   1760


La durata della nota viene ottenuta attivando e disattivando il registro 0x61 che funge da Gate per l'amplificatore.

Il filtro Passa-basso esclude frequenze dannose per l'altoparlante.

Attivazione  

    in al, 61h

or al, 3

    out 61h, al

Disattivazione 

    in al, 61h

and al, 11111100b

    out 61h, al





Privacy




Articolo informazione


Hits: 1827
Apprezzato: scheda appunto

Commentare questo articolo:

Non sei registrato
Devi essere registrato per commentare

ISCRIVITI



Copiare il codice

nella pagina web del tuo sito.


Copyright InfTub.com 2024