La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 M. Rebaudengo Routine di servizio dell’interrupt.

Presentazioni simili


Presentazione sul tema: "1 M. Rebaudengo Routine di servizio dell’interrupt."— Transcript della presentazione:

1 1 M. Rebaudengo Routine di servizio dell’interrupt

2 2 M. Rebaudengo Main in C Extern void UART_init(); Extern void fine_isr(); void main() { char stringa[20], *pstringa; char eos=0; pstringa = stringa; UART_init(); while (eos == 0) {/* CPU FA NULLA IN ATTESA CHE TERMINA IL PROCESSO DI GESTIONE VIA INTERRUPT*/} printf(“%s\n”, stringa); fine_isr(); }

3 3 M. Rebaudengo Scheletro Assembler EXTRN pstringa:WORD EXTRN eos:BYTE rbrequ03f8h dlr_lsbequ03f8h dlr_msbequ03f9h lcrequ03fbh ierequ03f9h lsr equ03fDh fifo_crequ03fah mcrEQU03FCH.model small,c.DATA old_int0C_offset dw ? old_int0C_segment dw ?.code

4 4 M. Rebaudengo Routine di servizio dell’interrupt ISR_UART proc FAR PUSH DS STI MOV AX, SEG pstringa MOV DS, AX MOV SI, pstringa mov dx,rbr in al, dx ; then write the byte MOV [si], AL INC pstringa CMP AL, 0 JNE fine MOV eos, 1 fine: OUT 20h, 20h ; EOI master POP DS pop dx iret ISR_UART endp

5 5 M. Rebaudengo Inizializzazione 8250 UART_init proc PUSH ES movdx, lcr in al, dx;lettura del contenuto di LCR oral, 80h;set DLAB outdx, al;scrittura in LCR ; bit-rate: 9600 movax, 000ch movdx, dlr_lsb outdx, al mov al, ah incdx outdx, al ; 1 bit di stop, 8 bit/carattere, parita’ ; DLAB = 0 moval, 0Bh movdx, lcr outdx, al

6 6 M. Rebaudengo Inizializzazione 8250 (cont.) ; disabilitazione fifo control register xor al, al mov dx, fifo_cr out dx, al ; abilitazione delle richieste di interruzione per trasmissionwe mov al, 01h movdx, ier outdx, al MOV DX, MCR MOV AL, 0Bh ; abilitazione out2 OUT DX, AL

7 7 M. Rebaudengo Inizializzazione 8250 (cont.) mov ax, 0 mov es, ax ; segmento ES=0000 mov bx, 0Ch ; tipo di interrupt shl bx, 2 ; moltiplica per 4: offset IVT ; salva l’indirizzo della vecchia ISR mov ax, es:[bx] mov old_int0C_offset, ax mov ax, es:[bx+2] mov old_int0C_segment, ax cli ; disabilita interrupt prima di ; scrivere nella IVT ; carica l’indirizzo della nuova ISR mov ax, OFFSET isr_uart mov es:[bx], ax mov ax, SEG isr_uart mov es:[bx+2], ax sti ; riabilita interrupt POP ES ret UART_init endp

8 8 M. Rebaudengo Ripristino della situazione iniziale fine_isr PROC Push es mov ax, 0 mov es, ax ; segmento ES=0000 mov bx, 0Ch ; tipo di interrupt shl bx, 2 ; moltiplica per 4: offset IVT ; salva l’indirizzo della vecchia ISR cli ; disabilita interrupt prima di ; scrivere nella IVT ; carica l’indirizzo della nuova ISR mov ax, old_int0C_offset mov es:[bx], ax mov ax, old_int0C_segment mov es:[bx+2], ax sti ; riabilita interrupt pop es ret fine_isr ENDP


Scaricare ppt "1 M. Rebaudengo Routine di servizio dell’interrupt."

Presentazioni simili


Annunci Google