Microprocessadores 1º Ano - LECOM Universidade do Minho Dept. De Electrónica Industrial 1 Interrupções: Motivação • Pretende-se desenvolver um sistema que sintetize uma onda quadrada com um frequência de 100 KHz e que conte o número de eventos externos. Os eventos externos ocorrem sob a forma de transições negativas no pino 4 do porto A. • A solução do problema acima descrito poderia ser: ... loop call call goto ... gerarPeriodo contarEvento loop 1 Interrupções: Motivação ... loop call call goto ... gerarPeriodo contarEvento loop • No problema anterior, temos dispositivos que estão a executar comportamento concorrentemente com o programa. 9 Timer: geração da onda quadrada. 9 Porto: que é actuado por um processo externo. 9 Mas poderíamos ainda ter o watchdog timer ou ainda a escrita na EEPROM. Interrupções: Motivação • Estes dispositivos ao terminar indicam o fim da tarefa pela activação de um bit num registo. Por exemplo, no caso do timer é o bit T0IF no registo INTCON. • Chamamos de polling à estratégia de periodicamente testar o bit de status dos dispositivos para verificar o fim da sua tarefa. 2 Interrupções: Motivação • Problemas encontrados na solução anterior baseada em polling: 9 Na solução anterior, teríamos que compensar o atraso da rotina ‘contarEvento’ no cálculo do valor a utilizar na temporização. 9 O valor a usar para o tempo variará consoante houve ou não uma transição no pino de entrada. 9 O que significa que este valor deve ser inicializado na rotina ‘contarEvento’, embora seja usado na rotina ‘gerarOnda’; ou seja, estamos a criar uma dependência de dados entre as duas rotinas, o que pode introduzir bugs subtis. ... loop call call goto ... gerarPeriodo contarEvento loop Interrupções: Motivação 9 Imagine que pretendíamos introduzir mais uma operação, por exemplo, zerar o contador e activar uma saída quando o número de eventos externos ultrapassa certo limite. ... loop call call call goto ... gerarPeriodo contarEvento processarContagemDeEventos loop 3 Interrupções: Motivação ... loop call call call goto ... 9 gerarPeriodo contarEvento processarContagemDeEventos loop Consequências da alteração: 9 Teríamos que recalcular o tempo da onda quadrada, sendo que existe um limite para o qual não será possível compensar. 9 Como na implementação das rotinas ‘contarEvento’ e ‘processarContagemDeEventos’ existem diferentes caminhos será cada vez mais difícil calcular o valor a usar na temporização. Interrupções: Motivação • Podemos concluir que a solução baseada em polling não é indicada quando existem temporizações que temos que obedecer para que o comportamento da nossa aplicação seja correcto. 4 Interrupções: O que são ? • Como definiria interrupção ? 9 Sinal gerado por um dispositivo e enviado ao CPU. 9 Este sinal indica ao CPU a ocorrência de um evento externo. 9 9 Por exemplo, overflow do timer ou ainda a mudança de estado num pino do porto. O CPU executa uma ISR (interrupt service routine), que efectua acções específicas em resposta à interrupção. Interrupções: O que são ? • As interrupções provocam uma transferência de execução para um endereço conhecido onde reside uma rotina de serviço à interrupção (ISR). 9 Ao executar uma ISR, o CPU coloca o endereço de retorno na pilha. 9 Ao concluir a execução da ISR, a instrução de retorno actualiza o PC (IP) com o endereço de retorno presente na pilha. 5 Interrupções: O que são ? • No caso do PIC: 9 A ISR deve terminar necessariamente com a execução da instrução ‘retfie’. 9 Portanto a estrutura de uma ISR será a seguinte: entradaDaISR ; ... Implementação da ISR ... retfie A instrução ‘retfie’ é responsável por colocar o endereço de retorno que está guardado no topo da pilha no registo PC e por habilitar as interrupções Interrupções: O que são ? 6 Interrupções: O que são ? • Interrupção versus Polling Vantagens do Polling Vantagens da Interrupção • Utiliza poucos recursos de Hw, e como tal é fácil de implementar • Não desperdiça tempo de execução na verificação contínua do estado dos dispositivos • O atendimento aos dispositivos pode ser imediato, fornecendo por isso capacidade de resposta em tempo-real • A execução está sincronizada com a execução do programa, o programador sabe exactamente quando é verificado o estado do dispositivo e quanto tempo será necessário para servi-lo. • Não será necessário um sistema automático para salvaguardar o estado do processador • Não requer atenção à gestão da pilha Interrupções: O que são ? • Interrupção versus Polling Desvantagens do Polling Desvantagens da Interrupção • Desperdiça tempo de execução, reduzindo por isso tempo disponível às outras actividades • Requer Hw extra e complexo. • Os dispositivos não podem ser atendidos de forma instantânea, tornando-se às vezes necessário mais recursos de armazenamento • Dispositivos menos prioritários podem nunca ser atendidos • Introduz um overhead sempre que um dispositivo interrompe a execução do programa. • A execução da ISR é assíncrona relativamente à execução do programa, dificultando a estimação da temporização da interrupção. • A gestão de um número excessivo de interrupções pode tornar o sistema lento, podendo mesmo bloqueá-lo. 7 Interrupções: O que são ? • As interrupções podem ser mascaradas ou desactivadas. 9 O CPU recebe informação para ignorar as interrupções. 9 A maioria dos processadores apresenta uma instrução que informa o CPU para ignorar todas as interrupções “macaráveis”. 9 9 Designado por desactivação das interrupções. O controlador de interrupções normalmente fornece facilidades para desactivar interrupções individualmente. Interrupções: O que são ? • No caso do PIC: 9 Temos as seguintes fontes de interrupções: 9 Interrupção 9 Timer 0. 9 Transição 9 Fim externa RB0/INT. de estado no porto B (RB7:RB4). de escrita de um dado na EEPROM. 8 Interrupções: O que são ? • No caso do PIC: 9 As interrupções são controladas pelo registo INTCON bit 3 Estes bits permitem activar ou desactivas cada uma das fontes de interrupção. A terminação indica: XXIE – ‘interrupt enable’ Interrupções: O que são ? • No caso do PIC: 9 O status das interrupções são consultados no registo INTCON bit 2 Estes bits permitem identificar qual foi a fonte de interrupção, ou seja, quem provocou a interrupção (timer, interrupção externa, ...) 9 Interrupções: O que são ? 9 Mas onde encontramos o status associado a interrupção de fim da escrita de EEPROM ? 9 Este se encontra no registo EECON1. bit 4 Interrupções: O que são ? • Quando se deve desactivar as interrupções? 9 Quando estamos a executar uma actividade que não deve ser interrompida, ou seja, quando a actividade deve ser considerada como atómica. 10 Interrupções: O que são ? • Como é que o CPU sabe qual a ISR a executar aquando da ocorrência de uma interrupção? 9 Cada interrupção tem associado um número de identificação. 9 O CPU usa este número de interrupção para consultar a tabela de vectores de interrupção e obter o endereço da ISR correcta. 9 A tabela de vectores é uma colecção de apontadores para as ISRs. 9 O número da interrupção serve de índice na tabela de vectores de interrupção. 9 Cada entrada da tabela de vectores de interrupção tem um número fixo de bytes que é suficientemente grande para armazenar um endereço de memória. Interrupções: O que são ? • O que acontece logo no início da ocorrência de uma interrupção? Programa em execução Ocorrência de Interrupção ¥ Memória de código ¥ instr n-1 PC instr n Registo de flags Outros instr n+1 ¥ ¥ Registos ISR Pilha PC Tabela de vectores de interrupção 11 Interrupções: O que são ? Programa em execução Ocorrência de Interrupção ¥ ¥ instr n-1 PC instr n Registo de flags Outros instr n+1 • Uma interrupção é desencadeada durante a execução da instrução n. • O sistema concluí a execução da instrução n. ¥ ¥ Registos ISR Pilha • Como resposta, o sistema salvaguarda o PC actual e o registo das flags na pilha. Tabela de vectores de interrupção PC Interrupções: O que são ? Programa em execução Ocorrência de Interrupção ¥ ¥ instr n-1 PC instr n Registo de flags Outros instr n+1 ¥ ISR PC • O sistema concluí a execução da instrução n. ¥ Registos Pilha • Uma interrupção é desencadeada durante a execução da instrução n. • Como resposta, o sistema salvaguarda o PC actual e o registo das flags na pilha. Tabela de vectores de interrupção 12 Interrupções: O que são ? Programa em execução Interrupção ¥ ¥ A tabela de vectores é uma colecção de apontadores para as ISRs. instr n-1 instr n instr n+1 ¥ ¥ ISR Pilha • O número de interrupção serve de índice na tabela de vectores de interrupção • Cada apontador corresponde a um número de interrupção. Tabela de Registo de flags vectores de interrupção PC Interrupções: O que são ? Programa em execução Interrupção ¥ ¥ instr n-1 instr n instr n+1 ¥ ¥ • Alguns processadores usam uma tabela de saltos em vez da tabela de vectores de interrupção. • Cada entrada na tabela deve ser capaz de armazenar uma instrução de salto. ISR Pilha Registo de flags PC Tabela de vectores de interrupção • O processador salta para uma entrada da tabela e literalmente será redireccionado para a ISR dado que a entrada é uma instrução de salto. 13 Interrupções: O que são ? Programa em execução Interrupção ¥ ¥ instr n-1 instr n PC instr n+1 • Ao concluir a execução, a ISR restaura da pilha os registos que o programa interrompido usava ¥ Registo de flags • Restaura também o registo PC ¥ Outros Registos ISR Tabela de Pilha • Esta última operação devolve o controlo ao programa interrompido vectores de interrupção Interrupções: O que são ? • No PIC 9 O processamento das interrupções do PIC é bastante elementar. 9 A tabela de vectores do PIC tem apenas uma entrada no endereço 0x0004. Nesta entrada deve estar o código da ISR ou uma instrução de ‘goto’ para a ISR. 14 Interrupções: O que são ? 9 Mas se o PIC apenas tem uma entrada na tabela de vectores como é possível distinguir qual é a fonte de interrupção (Timer, entradas dos portos, ...) ? 9 Como todas as interrupções do PIC partilham o mesmo vector de interrupção, o programador terá que na entrada da ISR testar os bits de status (INTCON e EECON2) para determinar quem causou a interrupção. Interrupções: O que são ? 9 O mapa da memória de código do PIC será então: org 0x000 goto main org 0x004 goto myISR myISR ... retfie main ... END 15 Interrupções: O que são ? • Quando se deve desactivar determinada interrupção em vez de desactivar todas as interrupções ? 9 Deve-se mascarar uma interrupção caso não seja usada, evitando deste modo a possibilidade de ocorrência de falsas interrupções . 9 9 A maioria das aplicações desactivam todas as interrupções que não estejam em uso durante a inicialização. Uma ISR deve mascarar a sua própria interrupção para impedir a reentrância, activando-a posteriormente ao concluir o processamento. 9 Tem a vantagem de desactivar apenas uma determinada interrupção, enquanto permite que outras interrupções possam ser processadas. Interrupções: O que são ? • No PIC 9 Em geral sabemos que: “Uma ISR deve mascarar a sua própria interrupção para impedir a reentrância, activando-a posteriormente ao concluir o processamento”. 9 Contudo: 9 No PIC não é necessário desactivar a interrupção, porque por defeito o PIC desactiva todas as interrupções ao passar o controlo à ISR, voltando a realbilitá-las quando a instrução retfie é executada. 16 Interrupções: O que são ? • O que se entende por estado do CPU? 9 9 Na maioria dos processadores, o estado do CPU é constituído pelos registos genéricos e pelas flags do processador 9 Normalmente, as flags do processador são salvaguardadas na pilha juntamente com o endereço de retorno ao código interrompido 9 A instrução retorno-da-interrupção executada no final da ISR restaura automaticamente as flags e transfere o controlo à aplicação interrompida Ao seleccionar um processador deve-se compreender o que constituí o estado do CPU, bem como se as ISRs devem preservar algo para além dos registos genéricos Interrupções: O que são ? • No caso do PIC: 9 O estado do processador compreenderá o registo de STATUS, o registo W e o registo FSR (caso a ISR use o modo de endereçamento indirecto). 9 Uma vez que não existe instruções de push e pop não é possível usar a stack para guardar dados, então o estado do processador deve ser armazenado na memória interna do processador. 9 Por ex., movwf movf movwf movf movwf wTemp STATUS, W statusTemp FSR, W fsrTemp ; guarda W ; guarda STATUS ; guarda FSR 17 Interrupções: O que são ? 9 Na saída da ISR, o estado inicial do processador deve ser reposto. 9 Por ex., movf movwf movf movwf movf fsrTemp, W FSR statusTemp, W STATUS wTemp, W ; restaura valor de FSR ; restaura valor de STATUS ; restaura valor de W Interrupções: O que são ? • Porque é que uma ISR deve preservar o estado do CPU ? 9 Se não preservar o estado do CPU, quando a ISR termina a execução e devolve o controlo à aplicação interrompida, esta encontrará valores diferentes nos registos. 9 Repare que a aplicação não tem conhecimento de que foi interrompida. 9 Em tais casos, a depuração da aplicação é difícil, porque o sistema começará a “crashar” de forma estranha e de difícil reprodução – o cenário resultante do crash será único 9 Notar que cada vez que a ISR é executada e corrompe os registos, uma secção diferente do código da aplicação estará em execução 18 Interrupções: Exemplo • Problema. 9 Sabendo que dispõe de um sistema com um microcontrolador PIC 16F84A com um cristal de 4 MHz, escreva um programa para gerar uma onda quadrada com uma frequência de 10 KHz. 19