Interrupts and Exceptions (Traps , Aborts) Sistemas Embutidos – Versão Modificada 1.1 Lecture outline Interrupt vectors Software interrupts Hardware interrupts 8259 Programmable Interrupt Controller Writing your own handlers Installing handlers Sistemas Embutidos – Versão Modificada 1.2 Why are interrupts important Interrupts let you use the operating system (run your programs, manage your files, access your peripherals etc.) Interrupts help peripherals “talk” to your microprocessor Interrupts help you measure time and control the timing of certain tasks in your microprocessors Sistemas Embutidos – Versão Modificada 1.3 Interrupts from a pedagogical perspective By learning interrupts you learn important concepts such as: Concurrency: how your processor manages to service interrupts while your program doesn’t know anything about them and how multiple interrupts are serviced at the same time Preemptability and priorities, how can a low priority-task be preempted by a high-priority task Scheduling: how can we assure that both low and high-priority tasks get the service they deserve from the processor Sistemas Embutidos – Versão Modificada 1.4 Defining Interrupts on a PC Triggers that cause the CPU to perform various tasks on demand Three types: Software interrupts – initiated by the INT instruction in your program Hardware interrupts – initiated by peripheral hardware Exceptions – occur in response to error states in the processor or during debugging (trace, breakpoints etc.) Regardless of source, they are handled the same Each interrupt has a unique interrupt number from 0 to 255. These are called interrupt vectors. For each interrupt vector, there is an entry in the interrupt vector table. The interrupt vector table is simply a jump table containing segment:offset addresses of procedures to handle each interrupt These procedures are called interrupt handlers or interrupt service routines (ISR’s) Sistemas Embutidos – Versão Modificada 1.5 Interrupções Conceito Geral de Interrupção: Rotina Trata_Int Prog x É uma maneira de tratar eventos, onde a sequência de instruções que se está executando é temporariamente interrompida de forma a executar uma outra sequência de instruções mais importante. Estou tratando algo ou verificando variáveis Salva Contexto Reseta_Int Trata_Int Restaura Contexto Retorna de Int Eventos não programados (assíncronos ao programa) alteram a sequência do programa. São geralmente requisições de serviço por dispositivos externos (E/S). Sistemas Embutidos – Versão Modificada É possível gerar interrupções por software (síncronas com programa e consideradas exceções) através do uso da instrução INT n. É uma maneira alternativa de executar uma rotina, diferindo de um CALL 1.6 Interrupções Maneiras de Tratar Interrupção: 1. Ignorá-la até que não haja nada mais prioritário a fazer. Isto pode ocorrer se eu estiver atendendo uma interrupção de mais alto nível e estiver com interrupções de mais baixo nível inibidas. Também pode acontecer se o programa principal inibir todas as interrupções por um certo tempo. 2. Atendo parcialmente o pedido, ou seja, ao receber Int, seto um flag ou incremento um contador para indicar que Int ocorreu e o programa principal (quando puder) vai tratar o evento. 3. Processo Interrupção Imediatamente. Sistemas Embutidos – Versão Modificada 1.7 Interrupções Como resolver os seguintes Problemas? Enquanto estou atendendo a interrupção de uma chamada telefônica, toca a campainha do apto. Enquanto atendo a porta, sinto um cheiro de queimado vindo da cozinha. Interrupções de 1 só nível Embora possam existir diversos pinos de interrupção no microprocessador, só atendo uma nova interrupção quando terminar de atender a anterior. E se a rotina de interrupção ficar em loop? Interrupções de Múltiplos Níveis É possível ter diversos níveis de prioridade no atendimento das interrupções e principalmente poder atender interrupções mais prioritárias dentro das rotinas de interrupções menos prioritárias (interrupções aninhadas). Sistemas Embutidos – Versão Modificada 1.8 Interrupções no AT802051(ou similar) Pergunta: Quando Ocorrer uma Interrupção, para que endereço devo desviar (Hardware força um CALL para onde?)? MEMÓRIA Interrupt 2 Pergunta: Onde na Memória Fica a Rotina de Tratamento da Interrupção? 8-byte data area Int: 8-byte data area push ACC push Status (PSW) mov ACC, Contador inc ACC mov Contador, ACC pop Status pop ACC reti Sistemas Embutidos – Versão Modificada 0013h Interrupt 1 000Bh Cabe ? Interrupt 0 8-byte data area Preciso salvar ACC e PSW aqui ? 0003h Reset Vector 0000h 1.9 Interrupções AT802051 Exemplo em C para fazer o “Debounce” de um Botão, Usando O Interrupções e Timer: 5V ButInt() { // Interrompe ao Apertar botão SetTimer (20msec); // Seta o Timer p/ atraso 20msec ResetTimerOverflow(); //Reseta Ovf do timer EnableTimerInt(); } // End ButInt TImerInt() { // Interrompe qdo timer overflow DisableTimer Int() // Inibe Interrupcao do timer if (Button == Low) // Se botão ainda apertado ButtonFlag = 1; // Indique que botão estava apert. } // End TimerInt main () { // Progr. Principal do botão TimerSetup(); // Timer0 em modo 1, entrada /4 EnableButtonInt(); // Enable Int. do botão while (1==1) {// Loop p/ sempre (ou outra coisa) while (Button ==0); // Espere botão ser liberado ButtonFlag = 0; // Resetar flag do botão while (ButtonFlag ==0); // Espere o botão ser apertado LED ^= 1; // Inverta o estado do LED } } // End main Sistemas Embutidos – Versão Modificada Problema: R S Botão 5V 0 1.10 Interrupções no AT802051 Exemplo em Assembly para fazer o “Debounce” de um Botão, Usando Interrupções e Timer: Org 20h clock = 4MHz MainLine: Flags EQU 20h ; botão apertado qdo bit 0 setado org 000h ; origem do programa na memoria ajmp MainLine ; Desvie p/programa principal ; Programa Principal mov CKCON, #%00001000 ; Use ck/4 Timer0 mov TMOD, #%00000001 ; Timer0 – Int clock ; - roda em modo 1 mov TCON, #%00010001 ; Inicíe Timer 0 org 003h ; codigo da interrupção zero (0) mov TH0, #2*256/3 ; Espere 20msec p/botao ativo setb IE.1 ; Enable Interr. Timer clr TCON.5 ; Assegure-se overflow desligado reti org 00Bh ; codigo da interrupção timer 0 clr IE.1 ; Libere só interrupç. Do botão jb P3.2, IntT0_End ; Se bot. n/apertado, n/marque setb 0 ; Setar interrupção do botão IntT0_End: ; Fim da Interrupção de overflow T0 reti ; Interrupções de borda mov IE, #%10000001 ; Enable Interr. botão MainLoop: jnb P3.2, MainLoop ; Esp. Apertar botao clr 0 ; Limpa flag botão ButtonLoop: jnb 0, ButtonLoop ; Espere setar bit cpl P1.0 ; Inverte estado LED ajmp MainLoop ; Espere para decr. ; na proxima vez Sistemas Embutidos – Versão Modificada 1.11 Interrupções no PC Rotina de Tratamento de Interrupção num uP 80x86 Procedure Trata_Int_M; Far; Assembler; ASM Push Ax ; Acumulador Principal Push Bx ; Reg. End. Base -------Push Bp ; Reg. Ponteiro Base da Pilha Mov Bp, Sp Sub SP, Tam_Local Mov Ax, Seg_Data ; Aponta Novo segmento de dados Mov Ds, Ax STI ; Enable outras Interrupções (OPCIONAL) !!!!!! Call Serve_Int_M ; Chama Rotina que serve Interrupção Mov Sp, Bp ; Pop Bp -----Pop Bx NOTA: Se Trata Interrupções de Hardware Pop Ax não usar Rotinas de I/O nem Funções DOS IRET pois DOS não é reentrante End; Sistemas Embutidos – Versão Modificada 1.12 Interrupções no PC Funções Para Tratamento de Interrupção em Borland Pascal (C é parecido) – Apenas como exemplo Procedure Trata_Int (Flags, CS, IP, Ax, Bx, Cx, Dx, SI, DI, DS, ES, Bp:Word): Interrupt; var - - Begin // Salva todos os registros passados como parâmetro, mas ---// pode não ser necessário salvar todos End; Procedure GetIntVec // Retorna End. Especificado num vetor Int Especificado Declaração: GetIntVec (IntNo: Byte; var Vector: Pointer) OBS: IntNo especifica vetor de Interrupção (0 .. .255) e o end. é retornado em vetor Procedure SetIntVec // Associa a um vetor de Interr. Especificado o Endereço // da rotina de tratamento Declaração: SetIntVec (IntNo: Byte; Vector: Pointer) OBS: IntNo especifica No. do vetor (0 .. .255) e Vector especifica endereço Sistemas Embutidos – Versão Modificada 1.13 Interrupções no PC - 80x86 A - Geradas por Hardware End (Hex) No.(Hex) 0-3 0 Div. Por Zero 4-7 1 Single Step 8-B 2 NMI C-F 3 Overflow 14 - 17 4 Print Screen --- 5 24 - 27 9 Keyboard 34 - 37 D Hard Disk 38 – 3B E Floppy 3C – 3F F Printer 40 - 43 10 Video Sistemas Embutidos – Versão Modificada Nome 1.14 Interrupções no PC - 80x86 B - Por Software – Instruçao INT n (exceções) End (Hex) No. (Hex) 80 - 83 20 DOS Program Terminate 84 - 87 21 DOS Function Call 88 – 8B 22 DOS Terminate Address ----- --- 94 - 97 25 ----- --- ----- --- A0 - FF 33 Sistemas Embutidos – Versão Modificada Função DOS Absolute Disk Read Driver de Mouse 1.15 Níveis de Interrupção Os primeiros uP só Possuíam 1 nível de Interrupção, ou seja, o uP não distinguia interrupções com Diferentes Prioridades ou níveis. Caso fosse necessário usavam hardware externo. Uma das poucas exceções era o sinal de interrupção NMI (Non-Maskable Interrupt) Como é feito no PC ? Controlador de Interrupções 8259 (antigamente era externo ao uP) Prioridade em Níveis – Nível 0 = Mais Prioritário; Nível 7 = Menos Prioritário Se UCP permitir (Enable Interrupt ou EI), interrupções podem ser atendidas dentro de outras, obedecendo as prioridades Prioridade Rotativa – O periférico que acabou de ser atendido passa para o fim da fila Prioridade Especificada por Software – Neste modo não há interrupção – UCP faz “polling” Prioridade em Níveis, mas Com Possibilidade de Liberar/Inibir níveis + baixos – (Semelhante aos microprocessadores SPARC e MC680xx) Sistemas Embutidos – Versão Modificada 1.16 Interrupções de Múltiplos Níveis Quais os Problemas a Tratar ? Permitir que Possa Haver Tratamento de Chamadas de Interrupção de um Certo Nível, Dentro de Uma Rotina de Interrupção, ou seja, Tratamento de Interrupções Aninhadas. Fazer com que o Procedimento Descrito Acima Possa ser Facilmente Controlado pelo Programador Permitir que um Sistema Possa ter Diversos Periféricos Dentro de um Mesmo Nível de Interrupção, mas com Subníveis, Fazendo com que o Sistema Possa Atender Muitos Periféricos de Forma Estruturada Sistemas Embutidos – Versão Modificada 1.17 Tratamento de Interrupções no SPARC (Estações SUN) e Processadores Similares - I Conceito Importante: Processador tem 3 bits na PSW indicando o nível de Interrupção Atual Passos Automáticos do Hardware numa Interrupção: Se a Prioridade da Interrupção é Maior do que a Prioridade Corrente do uP, Desvia para Rotina da nova Interrupção, ao Final da Instrução O Registro de Status do uP é Salvo, o Estado de Privilégio vai para Supervisor e o Nível de Prioridade do uP é Tornado Igual à Int Atendida. O uP Busca o Valor do Vetor de Int. no Dispositivo que Interrompeu, Indicando IACK e Indicando o Nível de Int. nas linhas de Endereço. O Periférico Insere Vetor de Interrupção. O uP Salva o PC e a PSW na Stack do Modo Supervisor O PC é Carregado com a soma do Vetor de Interrupção e do Endereço Base. O uP Passa a Executar a Rotina de Interrupção a Partir Deste Endereço. Sistemas Embutidos – Versão Modificada 1.18 Tratamento de Interrupções no SPARC (Estações SUN) e Processadores Similares - II Conceito Importante: Processador tem 3 bits na PSW indicando o nível de Interrupção Atual Passos em Software numa Interrupção: O Programador Deve Salvar o Contexto Não Salvo pelo Hardware Caso Outras Interr. de Nível mais Baixo Devam ser Atendidas (O que não é usual), o Programador Deverá Alterar o Registro de Nível de Interrupção do uP. O Programador Deve Ler o Registro De Estados da Interface que Causou a Interrupção e Desligá-lo. A Rotina de Interrupção Deve Realizar as Operações Necessárias Ao Final da Rotina de Interrupção, Deve ser Executada a Instrução de Retorno de Exceção (RTE), que Carregará de Volta o PC, a PSW, Voltando ao Nível de Interrupção Anterior Sistemas Embutidos – Versão Modificada 1.19 EXCEÇÕES – Armadilhas (Traps) Exceções Ocorrem Quando o Processador Detecta uma Condição de Êrro (Causado por Software ou Hardware) TRAPS – Causam um Desvio Imediato para a Rotina de Tratamento (Não Esperam o Final da Instrução) Instrução que as causou é abortada antes que mude o estado da UCP. Êrro de Memória Exceção de Ponto Flutuante (e.g. divisão por zero) Exceçaõ de Có-Processador Instrução Ilegal Instrução Privilegiada em Modo Usuário End. Memória Não Alinhado uP SPARC e 68020 permitem reiniciar a instrução do ponto onde parou. Sistemas Embutidos – Versão Modificada 1.20 EXCEÇÕES – Abortos ABORTOS – Também Causam um Desvio Imediato para a Rotina de Tratamento (Não Esperam o Final da Instrução) Não Permitem Reinício da Instrução S.O. Deve Assumir o Contrôle ( mensagem PANIC ! Do UNIX) Exemplos: Duplo TRAP ou Outros Êrros Sérios do Hardware Duplo Bus Error Dupla Instrução Ilegal Time-Out do Barramento Sistemas Embutidos – Versão Modificada 1.21 Interrupt vectors – x86 and Pentium The first 1024 bytes of memory (addresses 00000 – 003FF) always contain the interrupt vector table. Always. Never anything else. Each of the 256 vectors requires four bytes—two for segment, two for offset Memory address (hex) 003FC 4*x 00008 00004 00000 Sistemas Embutidos – Versão Modificada Interrupt function pointer INT 255 INT x INT 2 INT 1 INT 0 1.22 Software interrupts Essentially just function calls using a different instruction to do the calling Software interrupts give you access to “builtin” code from BIOS, operating system, or peripheral devices Use the INT instruction to “call” these procedures Sistemas Embutidos – Versão Modificada 1.23 The INT and IRET instructions Syntax: INT imm8 Imm8 is an interrupt vector from 0 to 255 INT does the following: Pushes flag register (pushf) Pushes return CS and IP Far jumps to [0000:(4*imm8)] Clears the interrupt flag disabling the interrupt system IRET is to INT what RET is to CALL Pops flag register Performs a far return Sistemas Embutidos – Versão Modificada 1.24 Things to notice The interrupt vector table is just a big permanently located jump table The values of the jump table are pointers to code provided by bios, hardware, the os, or eventually 291 students Interrupt service routines preserve the flags – the state of the computer should be completely unaltered by an ISR Sistemas Embutidos – Versão Modificada 1.25 Hardware interrupts Alert the processor of some hardware situation that needs tending to A key has been pressed A timer has expired A network packet has arrived Same software calling protocol Additional level of complexity with the interrupt “call” not coming from your program code Can happen at any time during the execution of your program Sistemas Embutidos – Versão Modificada 1.26 The 80x86 interrupt interface INT Request (INTR) 80x86 processor INT Acknowledge (INTA) Some device Data bus Device generates request signal Device supplies interrupt vector number on data bus Processor completes the execution of current instruction and executes ISR corresponding to the interrupt vector number on the data bus ISR upon completion acknowledges the interrupt by asserting the INTA signal Sistemas Embutidos – Versão Modificada 1.27 But wait there’s more… The above setup could get complicated with multiple devices generating multiple interrupts connected to the same few pins on the processor Enter the 8259 Programmable Interrupt Controller Sistemas Embutidos – Versão Modificada 1.28 The 8259 PIC 8259 PIC 0 1 2 3 4 5 6 7 INTR INTA INT# Sistemas Embutidos – Versão Modificada Interrupt outputs from peripheral devices 80x86 1.29 The 8259 PIC The PIC is programmed with a base interrupt vector number “0” corresponds to this base “1” corresponds to this base + 1 “n” corresponds to this base + n For example, if the PIC is programmed with a base interrupt vector of 8, then “0” corresponds to interrupt vector 8 Sistemas Embutidos – Versão Modificada 1.30 Master-Slave Configuration Base vector is 08h 80x86 Master 8259 INTR Sistemas Embutidos – Versão Modificada 0 1 2 3 4 5 6 7 IRQ0 IRQ1 Slave 8259 INTR IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 0 1 2 3 4 5 6 7 IRQ8 IRQ9 IRQ10 IRQ11 IRQ12 IRQ13 IRQ14 IRQ15 Base vector is 78h 1.31 Typical IRQ assignments IRQ 0: Timer (triggered 18.2/second) IRQ 1: Keyboard (keypress) IRQ 2: Slave PIC IRQ 3: Serial Ports (Modem, network) IRQ 5: Sound card IRQ 6: Floppy (read/write completed) IRQ 8: Real-time Clock IRQ 12: Mouse IRQ 13: Math Co-Processor IRQ 14: IDE Hard-Drive Controller Sistemas Embutidos – Versão Modificada 1.32 Interrupt priority Lower interrupt vectors have higher priority Lower priority can’t interrupt higher priority ISR for INT 21h is running • Computer gets request from device attached to IRQ8 (INT 78h) • INT 21h procedure must finish before IRQ8 device can be serviced ISR for INT 21h is running • Computer gets request from Timer 0 IRQ0 (INT 8h) • Code for INT 21h gets interrupted, ISR for timer runs immediately, INT21h finishes afterwards Sistemas Embutidos – Versão Modificada 1.33 Servicing an interrupt Complete current instruction Preserve current context PUSHF Store flags to stack Clear Trap Flag (TF) & Interrupt Flag (IF) Store return address to stack PUSH CS, PUSH IP Identify Source Read 8259 PIC status register Determine which device (N) triggered interrupt Execute Interrupt Service Routine usually the handler immediately reenables the interrupt system (to allow higher priority interrupts to occur) (STI instruction) process the interrupt Indicate End-Of-Interrupt (EOI) to 8259 PIC mov al, 20h out 20h, al ;transfers the contents of AL to I/O port 20h Return (IRET) POP IP (Far Return) POP CS POPF (Restore Flags) Activate Interrupt Service Routine Use N to index vector table Read CS/IP from table Jump to instruction Sistemas Embutidos – Versão Modificada 1.34 Interrupt service routines Reasons for writing your own ISR’s to supersede the default ISR for internal hardware interrupts (e.g., division by zero) to chain your own ISR onto the default system ISR for a hardware device, so that both the system’s actions and your own will occur on an interrupt (e.g., clock-tick interrupt) to service interrupts not supported by the default device drivers (a new hardware device for which you may be writing a driver) to provide communication between a program that terminates and stays resident (TSR) and other application software Sistemas Embutidos – Versão Modificada 1.35 Interrupt vectors and the 8259 PIC Base vector is 08h 80x86 Master 8259 INTR Sistemas Embutidos – Versão Modificada 0 1 2 3 4 5 6 7 IRQ0 IRQ1 Slave 8259 INTR IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 0 1 2 3 4 5 6 7 IRQ8 IRQ9 IRQ10 IRQ11 IRQ12 IRQ13 IRQ14 IRQ15 Base vector is 78h 1.36 Interrupt service routines DOS facilities to install ISRs Function INT 21h Function 25h INT 21h Function 35h INT 21h Function 31h Action Set Interrupt vector Get Interrupt vector Terminate and stay resident Restrictions on ISRs Currently running program should have no idea that it was interrupted. ISRs should be as short as possible because lower priority interrupts are blocked from executing until the higher priority ISR completes Sistemas Embutidos – Versão Modificada 1.37 Interrupt Service Routines ISRs are meant to be short keep the time that interrupts are disable and the total length of the service routine to an absolute minimum remember after interrupts are re-enabled (STI instruction), interrupts of the same or lower priority remain blocked if the interrupt was received through the 8259A PIC ISRs can be interrupted ISRs must be in memory Option 1: Redefine interrupt only while your program is running • the default ISR will be restored when the executing program terminates Option 2: Use DOS Terminate-and-Stay-Resident (TSR) command to load and leave program code permanently in memory Sistemas Embutidos – Versão Modificada 1.38 Installing ISRs Let N be the interrupt to service Read current function pointer in vector table Use DOS function 35h Set AL = N Call DOS Function AH = 35h, INT 21h Returns: ES:BX = Address stored at vector N Set new function pointer in vector table Use DOS function 25h Set DS:DX = New Routine Set AL = N DOS Function AH = 25h, INT 21h Sistemas Embutidos – Versão Modificada 1.39 Installing ISR Interrupts can be installed, chained, or called Install New interrupt replace old interrupt MyIntVector Save Registers Service Hardware Reset PIC Restore Registers IRET Sistemas Embutidos – Versão Modificada Chain into interrupt Service myCode first MyIntVector Save Registers MyCode Restore Registers JMP CS:Old_Vector Call Original Interrupt Service MyCode last MyIntVector PUSHF CALL CS:Old_Vector Save Registers MyCode Restore Registers IRET 1.40 Interrupt Driven I/O Consider an I/O operation, where the CPU constantly tests a port (e.g., keyboard) to see if data is available CPU polls the port if it has data available or can accept data Polled I/O is inherently inefficient Wastes CPU cycles until event occurs Analogy: Checking your watch every 30 seconds until your popcorn is done, or standing at the door until someone comes by Solution is to provide interrupt driven I/O Perform regular work until an event occurs Process event when it happens, then resume normal activities Analogy: Alarm clock, doorbell, telephone ring Sistemas Embutidos – Versão Modificada 1.41 Timer interrupt example In this example we will replace the ISR for the Timer Interrupt Our ISR will count the number of timer interrupts received Our main program will use this count to display elapsed time in minutes and seconds Sistemas Embutidos – Versão Modificada 1.42 Timer interrupt - main proc skeleton ;====== Variables =================== ; Old Vector (far pointer to old interrupt function) oldv RESW 2 count DW 0 ;Interrupt counter (1/18 sec) scount DW 0 ;Second counter mcount DW 0 ;Minute counter pbuf DB 8 ;Minute counter ;====== Main procedure ===== ..start … ;----Install Interrupt Routine----call Install ;Main program (print count values) .showc Mov ax, [mcount] ;Minute Count … Sistemas Embutidos – Versão Modificada call pxy mov ax, [scount] … call pxy mov ax,[count] … call pxy mov ah,1 int 16h jz .showc ;Second Count ;Interrupt Count (1/18 sec) ;Check for key press ;Quit on any key ;---- Uninstall Interrupt Routine----call UnInst;Restore original INT8 … call mpxit 1.43 Timer interrupt – complete main proc ..start mov ax, cs mov ds, ax mov ax, 0B800h mov es, ax call install ;Insert my ISR mov ax, [mcount] ;Minute Count mov bx, pbuf call binasc mov bx, pbuf mov di,0 ;Column 0 mov ah,00001100b ;Intense Red call pxy mov mov call mov ax,[scount] bx,pbuf binasc bx, pbuf ;Initialize DS=CS mov di,12 ;Column 6 (DI=12/2) mov ah,00001010b ;Intense Green call pxy ;ES=VideoTextSegment showc: mov mov call mov mov mov call ax,[count] ;Int Count (1/18th sec) bx,pbuf binasc bx, pbuf ah,00000011b ;Cyan di,24 ;Column 12 (DI=24/2) pxy mov ah,1 int 16h jz showc ;Key Pressed ? ;Second Count Sistemas Embutidos – Versão Modificada Call UnInst mov ax,4c00h int 21h ;Restore original INT8 ;Normal DOS Exit 1.44 Timer interrupt – PXY and Install interrupt ;pxy (bx = *str, ah = color, di = column) pxy mov al, [bx] cmp al, ‘$' je .pxydone mov es:[di+2000], ax inc bx add di,2 jmp pxy .pxydone ret ;====== Install Interrupt ===== install ;Install new INT 8 vector push es push dx push ax push bx Sistemas Embutidos – Versão Modificada mov mov int al, 8 ah, 35h 21h mov mov mov mov word [oldv+0], bx word [oldv+2], es al, 8 ;INT = 8 ah, 25h ;Set Vector Subfunction mov dx, myint int pop pop pop pop ret 21h ;INT = 8 ;Read Vector Subfunction ;DOS Service ;DS:DX point to function ;DOS Service bx ax dx es 1.45 Timer interrupt – uninstall interrupt ;====== Uninstall Interrupt =========== UnInst ; Uninstall Routine (Reinstall old vector) push push push mov mov ds dx ax dx, word [oldv+0] ds, word [oldv+2] mov al, 8 mov ah, 25h int 21h ; INT = 8 ; Subfunction = Set Vector ; DOS Service pop ax pop dx pop ds ret Sistemas Embutidos – Versão Modificada 1.46 Timer interrupt – ISR code ;====== ISR Code ========= myint push ds ;Save all registers push ax mov ax, cs ;Load default segment mov ds, ax pushf ;Call Orig Function w/flags call far [oldv] ;Far Call to existing routine inc cmp jne word [count] ;Increment Interrupt count word [count],18 .myintdone Sistemas Embutidos – Versão Modificada inc mov cmp jne inc mov word [scount] word [count], 0 word [scount], 60 .myintdone word [mcount] word [scount], 0 .myintdone mov al, 20h out 20h, al pop ax pop ds iret ;Next second ; Next minute ;Reset the PIC ;End-of-Interrupt signal ;Restore all Registers ;Return from Interrupt 1.47 The complete code with exe www.ece.uiuc.edu/ece291/lecture/timer.asm www.ece.uiuc.edu/ece291/lecture/timer.exe Sistemas Embutidos – Versão Modificada 1.48 Replacing An Interrupt Handler ;install new interrupt vector %macro setInt 3 ;Num, OffsetInt, SegmentInt push ax push dx push ds mov mov mov mov mov int dx, %2 ax, %3 ds, ax al, %1 ah, 25h 21h ;set interrupt vector ;store old interrupt vector %macro getInt 3 ;Num, OffsetInt, SegmentInt push bx push es mov al, %1 mov ah, 35h int 21h mov %2, bx mov %3, es pop es pop bx ;get interrupt vector %endmacro pop ds pop dx pop ax %endmacro Sistemas Embutidos – Versão Modificada 1.49 Replacing An Interrupt Handler CR EQU LF EQU 0dh 0ah New04h SEGMENT stkseg STACK resb 8*64 stacktop: SEGMENT code Warning DB “Overflow - Result Set to ZERO!!!!”,CR,LF,0 msgOK DB “Normal termination”, CR, LF, 0 old04hOffset old04hSegment sti ;our new ISR for int 04 ;occurs on overflow ;re-enable interrupts mov push call xor cwd ax, Warning ax putStr ;display message ax, ax ;set result to zero ;AX to DX:AX iret RESW RESW Sistemas Embutidos – Versão Modificada 1.50 Replacing An Interrupt Handler ..start mov mov mov ax, msgOK push ax call putStr ax, cs ds, ax ;store old vector getInt 04h, [old04hOffset], [old04hSegment] ;replace with address of new int handler setInt 04h, New04h, cs mov add into test jz Error: ;restore original int handler setInt 04h, [old04hOffset], [old04hSegment] al, 100 al, al ;calls int 04 if an overflow occurred ax, 0FFh Error mov int ax, 4c00h 21h NOTES INTO is a conditional instruction that acts only when the overflow flag is set With INTO after a numerical calculation the control can be automatically routed to a handler routine if the calculation results in a numerical overflow. By default Interrupt 04h consists of an IRET, so it returns without doing anything. Sistemas Embutidos – Versão Modificada 1.51 Why are interrupts important Interrupts let you use the operating system (run your programs, manage your files, access your peripherals etc.) Interrupts help peripherals “talk” to your microprocessor Interrupts help you measure time and control the timing of certain tasks in your microprocessors Sistemas Embutidos – Versão Modificada 1.52 Interrupts from a pedagogical perspective By learning interrupts you learn important concepts such as: Concurrency: how your processor manages to service interrupts while your program doesn’t know anything about them and how multiple interrupts are serviced at the same time Preemptability and priorities, how can a low priority-task be preempted by a high-priority task Scheduling: how can we assure that both low and high-priority tasks get the service they deserve from the processor Sistemas Embutidos – Versão Modificada 1.53 Interrupts and our everyday lives We will spend at least two lectures to explain how to measure and track time in your microprocessor and you will be wondering why don’t we just look at our watches… But we will also learn that looking at your watch all the time is not a good thing to do, especially if you’re a microprocessor… We all have priorities E.g. you do your ECE291 homework and your girlfriend/boyfriend calls, there’s a high-priority interrupt While you talk to your girlfriend/boyfriend you get another incoming call from your mom, there’s an interrupt that you decide how to handle • High priority: put the girlfriend/boyfriend on hold • Low priority: put your mom on hold or don’t even bother to switch to the other line Sistemas Embutidos – Versão Modificada 1.54 Interrupts…seriously defined Triggers that cause the CPU to perform various tasks on demand Three types: Software interrupts – initiated by the INT instruction in your program Hardware interrupts – initiated by peripheral hardware Exceptions – occur in response to error states in the processor or during debugging (trace, breakpoints etc.) Regardless of source, they are handled the same Each interrupt has a unique interrupt number from 0 to 255. These are called interrupt vectors. For each interrupt vector, there is an entry in the interrupt vector table. The interrupt vector table is simply a jump table containing segment:offset addresses of procedures to handle each interrupt These procedures are called interrupt handlers or interrupt service routines (ISR’s) Sistemas Embutidos – Versão Modificada 1.55 The 80x86 interrupt interface INT Request (INTR) 80x86 processor INT Acknowledge (INTA) Some device Data bus Device generates request signal Device supplies interrupt vector number on data bus Processor completes the execution of current instruction and executes ISR corresponding to the interrupt vector number on the data bus ISR upon completion acknowledges the interrupt by asserting the INTA signal Sistemas Embutidos – Versão Modificada 1.56 It is not that simple… What if we want to connect more than one devices to the processor ? What happens if multiple devices generate multiple interrupts at the same time ? We need a way to share the two interrupt lines among multiple devices 8259 Programmable Interrupt Controller The 8259 PIC operates as an arbiter for interrupts triggered by multiple devices One 8259 serves up to 8 devices, but multiple 8259 chips can be “cascaded” to serve up to 64 devices Sistemas Embutidos – Versão Modificada 1.57 The 8259 PIC 8259 PIC 0 1 2 3 4 5 6 7 INTR INTA INT# Sistemas Embutidos – Versão Modificada Interrupt outputs from peripheral devices 80x86 1.58 Master-Slave Configuration Base vector is 08h 80x86 Master 8259 INTR Sistemas Embutidos – Versão Modificada 0 1 2 3 4 5 6 7 IRQ0 IRQ1 Slave 8259 INTR IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 0 1 2 3 4 5 6 7 IRQ8 IRQ9 IRQ10 IRQ11 IRQ12 IRQ13 IRQ14 IRQ15 Base vector is 78h 1.59 The 8259 PIC PIC is very complex to program, fortunately the BIOS does most of the work needed Programmed with the I/O address 20h-21h (master) and 0A0h-0A1h (slave) I/O instructions yet to be discussed… in reads from an I/O address out writes to an I/O address Consider them as two registers the status register and the interrupt mask register Sistemas Embutidos – Versão Modificada 1.60 The 8259 PIC The mask register is addressed from 21h It lets you enable/disable specific hardware interrupts Counterintuitive: a 0 ENABLES an interrupt and a 1 DISABLES the interrupt Never load a value immediately to the mask register Always read the previous value and use and/or instructions to set the new mask in al, 21h ; this one reads the value of the mask register and al, 0efh ; this zeroes out bit 4 i.e. IRQ4 out 21h, al ; this actually disables the interrupt in IRQ4 Sistemas Embutidos – Versão Modificada 1.61 The 8259 PIC When an interrupt occurs and the processor starts executing the ISR all further interrupts from the same device are blocked until the ISR issues an end of interrupt instruction mov al, 20h out 20h, al You must end exactly one interrupt! Not sending one will block all interrupts from the save device Sending two or more means that you might accidentally acknowledge the end of a pending interrupt! Two more registers track pending interrupts received at the PIC and interrupt priorities You must be careful when you’re patching existing ISR’s (because the end instruction sequence may already be included in the ISR) Sistemas Embutidos – Versão Modificada 1.62 The 8259 PIC IRQ mapping Interrupt vectors 8 through 0Fh map to IRQ0-IRQ7 Interrupt vectores 70h-77h map to IRQ8-IRQ15 Sistemas Embutidos – Versão Modificada 1.63 Interrupt vectors and the 8259 PIC Base vector is 08h 80x86 Master 8259 INTR Sistemas Embutidos – Versão Modificada 0 1 2 3 4 5 6 7 IRQ0 IRQ1 Slave 8259 INTR IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 0 1 2 3 4 5 6 7 IRQ8 IRQ9 IRQ10 IRQ11 IRQ12 IRQ13 IRQ14 IRQ15 Base vector is 78h 1.64 Typical IRQ assignments IRQ 0: Timer (triggered 18.2/second) IRQ 1: Keyboard (keypress) IRQ 2: Slave PIC IRQ 3: Serial Ports (Modem, network) IRQ 5: Sound card IRQ 6: Floppy (read/write completed) IRQ 8: Real-time Clock IRQ 12: Mouse IRQ 13: Math Co-Processor IRQ 14: IDE Hard-Drive Controller Sistemas Embutidos – Versão Modificada 1.65 Interrupt priority Lower interrupt vectors have higher priority Lower priority can’t interrupt higher priority Higher priority can interrupt lower priority ISR for INT 21h is running • Computer gets request from device attached to IRQ8 (INT 78h) • INT 21h procedure must finish before IRQ8 device can be serviced ISR for INT 21h is running • Computer gets request from Timer 0 IRQ0 (INT 8h) • Code for INT 21h gets interrupted, ISR for timer runs immediately, INT21h finishes afterwards Sistemas Embutidos – Versão Modificada 1.66 Priority in the 8259 8259 supports several priority schemes On PC’s the 8259 uses the simplest form of fixed priorities Each IRQ has a fixed priority Lower IRQs has higher priority The timer interrupt (IRQ0) has lower priority than any other IRQ If you really need higher priority than the timer (e.g. connecting a nuclear reactor to your microprocessor) it is possible to use a NMI (non-maskable interrupt) NMI has the highest priority among all hardware interrupts and cannot be disabled by the program Sistemas Embutidos – Versão Modificada 1.67 Interrupt enabling/disabling You can enable/disable all maskable hardware interrupts The CLI instruction disables all maskable hardware interrupts The STI instruction enables all maskable hardware interrupts Be very careful if you ever need to use them Many deadlock scenarios! Sistemas Embutidos – Versão Modificada 1.68 The ugly details ISRs for hardware interrupts clear the interrupt flag at the beginning to disable interrupts. They may include a STI instruction if they want to enable interrupts before they finish It’s all about performance! Keeping interrupts blocked for long is a BAD IDEA ISRs for software interrupts do not disallow hardware interrupts automatically at the beginning. If an ISR for a software interrupt needs to do that it must issue a CLI instruction This is what most ISRs do Again for the sake of performance a STI instruction must be issued as soon as possible Note that when interrupts are enabled the priority rule applies The CLI works only for maskable hardware interrupts Code enclosed between CLI/SCI is often called a critical section, an uninterruptible piece of code Sistemas Embutidos – Versão Modificada 1.69 Is there a way out of this mess ? In many critical section situations (e.g. patching the interrupt vector tables) DOS helps us ensure the required atomicity Convenient calls for Safely getting the value of the interrupt vector from the interrupt vector table Safely storing a new value to the interrupt vector table (patching the interrupt vector table) In all difficult situations always examine what if scenarios What if a hardware interrupt occurs at different points of our ISR ? Identify the points that need to be protected and protect them with CLI/STI Sistemas Embutidos – Versão Modificada 1.70 Servicing a hardware interrupt Complete current instruction Preserve current context PUSHF Store flags to stack Clear Trap Flag (TF) & Interrupt Flag (IF) Store return address to stack PUSH CS, PUSH IP Identify Source Read 8259 PIC status register Determine which device (N) triggered the interrupt Activate ISR Use N to index vector table Read CS/IP from table Jump to instruction Sistemas Embutidos – Versão Modificada Execute ISR usually the handler immediately re-enables the interrupt system (to allow higher priority interrupts to occur) (STI instruction) process the interrupt Indicate End-Of-Interrupt (EOI) to 8259 PIC mov al, 20h out 20h, al Return (IRET) POP IP (Far Return) POP CS POPF (Restore Flags) 1.71 Interrupt service routines Reasons for writing your own ISR’s to override the default ISR for internal hardware interrupts (e.g., division by zero need not terminate the program) to chain your own ISR onto the default system ISR for a hardware device, so that both the system’s actions and your own will occur on an interrupt (e.g., clock-tick interrupt, measure elapsed time) to service interrupts not supported by the default device drivers (a new hardware device for which you may be writing a driver) to provide communication between a program that terminates and stays resident (TSR) and other application software (maintain your ISRs) Sistemas Embutidos – Versão Modificada 1.72 Impact of interrupts on performance The frequency of occurrence and the latency of the ISR determine the impact of servicing interrupts to your program The latency of the ISR is non-negligible! You may not notice it but you may be interrupted several times while executing your program. The good thing is that you don’t notice it! Always remember: When the processor starts executing an ISR there might be other ISRs executing already Your ISR may be interrupted by a higher-priority interrupt Many devices expect low latency from your ISR (imagine what happens if you hit a key in the keyboard and wait for a minute!) Even those devices with high latencies (e.g. the disk) are not allowed to block other activity in the processor for long Sistemas Embutidos – Versão Modificada 1.73 Interrupt Service Routines ISRs are meant to be short keep the time that interrupts are disabled and the total length of the service routine to an absolute minimum remember after interrupts are re-enabled (STI instruction), interrupts of the same or lower priority remain blocked if the interrupt was received through the 8259A PIC ISRs can be interrupted ISRs must be in memory Option 1: Redefine interrupt only while your program is running • the default ISR will be restored when the executing program terminates Option 2: Use DOS Terminate-and-Stay-Resident (TSR) command to load and leave program code permanently in memory Sistemas Embutidos – Versão Modificada 1.74 Interrupt Driven I/O Consider an I/O operation, where the CPU constantly tests a port (e.g., keyboard) to see if data is available CPU polls the port if it has data available or can accept data Polled I/O is inherently inefficient Wastes CPU cycles until event occurs Analogy: Checking your watch every 30 seconds until your popcorn is done, or standing at the door until someone comes by Solution is to provide interrupt driven I/O Perform regular work until an event occurs Process event when it happens, then resume normal activities Analogy: Alarm clock, doorbell, telephone ring Sistemas Embutidos – Versão Modificada 1.75