Italiano - English

Gestione degli Interrupt su micropocessori 80/86

Sommario

    Esercitazioni di Informatica Industriale
    1. Architettura di un sistema basato su microprocessore Intel 8086
    2. Gestione degli Interrupt su micropocessori 80/86
    3. Programmable Interrupt Controller (PIC Intel 8259a)
    4. Demo Kernel Multitasking
    5. La Porta Seriale
    6. La Porta Parallela

    Attività di interrupt, la tabella delle interruzioni e riprogrammazione degli interrupt

    Interruzione del processo di elaborazione

    POSSIBILI ALTERNATIVE:

    1. Ignorare la richiesta di interruzione e procedere con l'elaborazione
    2. Aspettare di arrivare ad un punto conveniente e poi soddisfare la richiesta di interruzione
    3. Interrompere immediatamente l'elaborazione corrente e soddisfare la richiesta

    UN SISTEMA A MICROPROCESSORE E' COMPOSTO DA PIU' COMPONENTI HARDWARE. SPESSO QUESTI COMPONENTI HANNO BISOGNO DELLA CPU SOLO IN ALCUNI MOMENTI, IN ALTRI POSSONO FUNZIONARE DA SOLI.

    Esempio: visualizazione dinamica dell'ora sul monitor

    Ogni secondo la CPU deve mostrare a video l'ora

    Alternative:

    1. In un ciclo infinito la CPU legge l'ora di sistema e la mostra a video => la CPU no puo fare nient'altro
    2. Ad ogni secondo il clock di sistema interrompe la CPU che quindi mostra l'ora => la CPU e' quasi sempre libera

    Interruzioni esterne

    Il chip 8086/8088 ha tre ingressi per gestire 3 diversi tipi di interruzioni esterne.

    Non Mascherable Interrupt: linea dedicata alle interruzioni che devono essere sempre riconosciute dalla CPU appena è elettricamente possibile, cioè quando l'istruzione corrente è completa (le istruzioni richiedono piu cicli di clock)

    INTerrupt Request: linea dedicata alle richieste di interruzione. Questa linea nel PC-IBM è controllata dal 8259 Programmable Interrupt Control (PIC). Può essere disattivata con l'istruzione CLI (STI attiva)

    RESET: linea dedicata alla ripartenza del sistema. Tutti i registri interni vengono azzerati tranne CS che viene posto a FFFFh

    Attività della CPU durante un Interrupt

    1. Il registro FLAG viene salvato nello stack (PUSHF)
    2. Viene disabilitato l'ingresso INTR con l'istruzione CLI
    3. TF (Trap Flag) viene diabilitato con l'istruzione CLT
    4. Il registro CS viene salvato nello stack (PUSH CS)
    5. Il registro IP viene salvato nello stack (PUSH IP)
    6. Il registro IP viene caricato con l'indirizzo del gestore dell'interrupt.
    7. Il registro CS viene caricato con il segmento del gestore dell'interrupt.
    8. Esecuzione dell'interrupt, attraverso la procedura associata (gestore o handler)
    9. Vengono ripristinati tutti i registri con le diverse istruzioni di POP
    10. L'indirizzo del gestore dell'interrupt viene prelevato dalla Tabella delle Interruzioni, che contiene gli indirizzi per i gestori di tutti gli interrupt (interni ed esterni) gestiti dalla CPU

    La Tabella delle Interruzioni

    ELENCO DI 256 INDIRIZZI (SEGMENTO + OFFSET) RELATIVI AI GESTORI DI 256 DIVERSI INTERRUPT

    OCCUPA I PRIMI 256x4byte=1024 DELLA MEMORIA DI SISTEMA, CIOE' GLI INDIRIZZI 0000..003FF

    Ad esempio, l'indirizzo dell'interrupt 21h è memorizzato all'indirizzo 21Hx4=84H. Precisamente i byte 84H e 85H contengono l'offeset rispetto al segmento che è contenuto nei byte 86H e 87H

    Riprogrammazione di un Interrupt

    SIGNIFICA SCRIVERE UN GESTORE PER L'INTERRUPT, DA FAR ESEGUIRE AL POSTO DI QUELLO ATTUALE, E SCRIVERE NELLA TABELLA DELLE INTERRUZIONI, L'INDIRIZZO DELLA NUOVA PROCEDURA.

    ESEMPIO:riprogrammazione int 1Ch (timer tick).

    Si desidera questo interrupt mostra l'ora sul monitor.
     

    1. Scriviamo nel segmento CS una procedura di visualizzazione. L'indirizzo fisico di questa procedura è CS:new_1c
    2. Riprogrammammiamo l'interrupt 1Ch:
      1. Accesso diretto alla tabella: l'indirizzo del gestore
        ;per l'int 1Ch si trova 0000:1Chx4=0000:70h
        
        lea ax, CS:new_1c   ;ax <- offset di new_int1c
        cli                 ;INTR off
        
        mov 0000:70h,ax     ;imposto l'offset 
        mov 0000:72h,CS     ;imposto il segmento 
        sti                 ;INTR on 
      2. Uso di interrupt dos per riprogrammazione
        lea dx, CS:new_1c   ;dx <- offset di new_int1c
        
        mov al,1Ch          ;interrupt da riprogrammare
        mov ah,37h          ;servizio riprogrammazione
        int 21h             ;chiamata dos
        

    Intercettare un interrupt

    SIGNIFICA RIPROGRAMMARE UN INTERRUPT PER ESEGUIRE UNA FUNZIONE UTENTE PRIMA DELL'INTERRUPT ORIGINALE.

    IL NUOVO GESTORE DI INTERRUPT TERMINA CON UN SALTO AL VECCHIO GESTORE

    NECESSITA' DI MEMORIZZARE L'INDIRIZZO FISICO DEL VECCHIO INTERRUPT, PRIMA DELLA SUAL RIPROGRAMMAZIONE

    ESEMPIO:

       old_1c DB 0EAh ;codice macchina per jmp 
       old_1c_o DW ? ;offeset dell'interrupt 
       old_1c_s DW ? ;segmento dell'interrupt 
       .... 
       mov ah,53 ;servizio lettura ind. int 
       mov al,1Ch ;interrupt richiesto 
       int 21h ;chiamata dos
    
    	;ora es:bx puntano all'interrupt corrente 
       mov old_int1c_o,bx ;salvo l'offset 
       mov old_int1c_s,es ;salvo il segmento 
    
    ..... ;riprogram. dell'interrupt 
    
    new_int1c: 
       ..... 
       jmp old_1c ;salto al vecchio int. 

    Esempi 

    ESEMPIO: clock.asm

    In questo esempio viene intercettato l'INT08H per mostrare a video un contasecondi.

    L'INT08H viene generato dal PC ogni 55ms quindi dopo 18 volte e' trascorso circa un secondo e puo' essere aggiornato il monitor.

    In ogni caso sempre viene chiamato INT 08h orginale per mantenere integro il sistema
     

    ESEMPIO: keysound.asm

    KEYSOUND.ASM incercetta il gestore int09h per la tastiera per emettere un suono ad ogni pressione di un tasto

    int09h e viene emesso alla pressione ed al rialscio di un tasto il suono invece viene generato solo alla pressione. In ogni caso viene sempre chiamato il INT09H orginale per garantire il funzionamento della tastiera
     

    ESEMPIO: scr2txt.asm

    Riprogrammazione dell'INT 05h collegato al tasto print screen per salvare il contenuto dello schermo 25x80 caratteri in un file di testo.

    In questo esempio viene riprogrammato l'interrupt e si perde la funzione originale.

    Vota questa pagina:

    1 Commenti:

    #1 Inviato da Turbato Thomas 20-11-2009

    brilliant! absolutly fantastic

    Lascia il tuo commento:

    Note:
    • La tua email non è obligatoria e non sarà visibile in alcun modo
    • Si prega di inviare solo commenti relativi a questa pagina
    • Commenti inappropriati o offensivi saranno modificati o eliminati
    • Codici HTML non sono consentiti. Prego usare i BB code:
      [b]bold[/b], [u]underline[/u], [i]italic[/i], [code]code[/code]
    Il codice, le illustrazioni e gli esempi riportati in questa pagina sono solo a scopo illustrativo. L'autore non prende alcuna responsabilità per il loro utilizzo da parte dell'utente finale.
    Questo materiale è di proprietà di Pk Lab ed è utilizzabile liberamente a condizione di citarne la fonte.