|
 |
Procedure Seriali |
SetInt0C - Fasi preliminari 1/6
[191 di 403] |
- Gestione degli eventi seriali con la Tecnica dell'Interruzione |
|
5.2
Procedura SetInt0C:
rimappatura del
Vettore INT 0CH [1 di 6] |
 | Le fasi preliminari
necessarie per garantire il servizio ad una richiesta d'interruzioni Hardware
sono numerose e
improrogabili; la procedura che stiamo analizzando ne è un esempio
concreto. |
 | Il primo compito da svolgere è
quello di dare al processore la certezza di
localizzare la procedura di servizio
che sarà chiamato a far partire in risposta
alla
richiesta interruzione; per prevenire ogni possibile malfunzionamento il
sistema garantisce sempre una procedura
pronta d'ufficio, spesso chiamata a non far
nulla, cioè costituita dalla sola sua istruzione finale, sempre
IRET; è facile pensare che questi
servizi pronti siano del tutto inadeguati
alle nostre esigenze per cui dovremo scriverne uno personalizzato (nel nostro esempio ServInt0C, discusso più avanti). |
 | Di solito il sistema associa
un numero xxH
ad ogni procedura di
Servizio (nel nostro caso 0CH)
con il quale:
 | consente di lanciarla anche
da software con l'aiuto dell'istruzione
INT xxH (nel nostro caso
INT 0CH) |
 | crea (moltiplicandolo per 4) un
puntatore (nel nostro caso
0CH*4=0030H) alle
4 locazioni della
Tabella dei Vettori che
contengono l'indirizzo
logico (segment:offset, vettore) della
procedura di
Servizio stessa |
|
 | Il primo compito da svolgere è
dunque quello di sostituire (rimappare, sovrascrivere) il
vettore originale con
l'indirizzo effettivo della
nostra procedura di servizio, CS:ServInt0C. |
 | Le operazioni di rimappatura
distruggono di fatto il vettore originale e il buon programmatore non deve permettere che ciò succeda;
prima di sostituirlo con CS:ServInt0C
provvederà quindi a salvarlo in una variabile locale,
per poter
ripristinare in uscita le stesse condizioni trovate in ingresso; nei nostri
progetti la variabile è una doppia word, [Old_Int0C],
aggiunta nella zona delle variabili, all'inizio del sorgente ASM: |
 | Le tecniche per
modificare
e
sostituire
un Vettore
nella Tabella dei
Vettori d'Interruzione sono descritte in ogni dettaglio in
queste pagine del Tutorial;
da esse è tratto il codice necessario per
il vettore associato a
INT 0CH, cioè al servizio in risposta ad una
IRQ4
generata dalla porta seriale
COM1
o COM3. |
 | Naturalmente per servire la richiesta
IRQ3 generata dall'UART
della porta seriale
COM2
o COM4, per localizzare la
procedura di servizio (ServInt0B, INT
0BH)
si dovrà modificare il dodicesimo vettore (0000:002CH) della
Tabella dei Vettori d'Interruzione invece del
tredicesimo
(0000:0030H), ma la sostanza non cambia; per
coerenza logica anche la doppia word di
deposito avrà un nome adeguato, [Old_Int0B]: |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|