Baixe o app para aproveitar ainda mais
Prévia do material em texto
TREINAMENTO ON LINE ARM Cortex M4 Focado na Stellaris Launch Pad EK-LM4F120XL Stellaris LM4F120 Página 77 Sumário 5. Interrupções, falhas e exceções do ARM Cortex M4 .................................................... 78 5.1. O controle das interrupções .................................................................................... 80 5.1.1. Program Status Register (xPSR) ...................................................................... 80 5.1.1.1. Interruption PSR (IPSR) ................................................................................ 81 5.1.2. Interrupt Priority Register ............................................................................... 81 5.2. O comportamento das interrupções no ARM Cortex M4 ......................................... 83 5.2.1. Nomenclatura das interrupções (exceções) .................................................... 84 5.2.1.1. Única interrupção, com tratamento na ISR ................................................... 84 5.2.1.2. Única interrupção, com tratamento no MAIN ................................................ 84 5.2.1.3. Única interrupção, com fonte contínua ......................................................... 85 5.2.1.4. Múltiplas interrupções, único tratamento .................................................... 85 5.2.1.5. Preemption .................................................................................................... 85 5.2.1.6. Tail-chaning ................................................................................................... 86 5.2.1.7. Late-Arriving ................................................................................................. 87 5.1.1.1. Return ............................................................................................................ 87 5.2. Utilizando as interrupções para tratar as falhas de sistema ................................. 88 5.2.1. Falha de barramento ........................................................................................ 89 5.2.2. Falha de manuseio de memória ....................................................................... 90 5.2.3. Falha de uso ...................................................................................................... 90 5.2.4. Falha de hardware ............................................................................................ 91 5.3. Utilizando o NVIC para tratar as interrupções ........................................................ 91 5.3.1. O SYSTICK Timer presente dentro do NVIC ...................................................... 92 5.3.1.1. O SYSTICK do LM4F120H5QR ......................................................................... 93 5.4. Entrada em uma interrupção .................................................................................. 96 5.4.1. Empilhamento ................................................................................................... 96 5.4.2. Carregamento do vetor de interrupção ........................................................... 97 5.4.3. Atualização de SP, LR e PC ............................................................................... 97 5.5. Saída de uma interrupção ....................................................................................... 98 5.6. Como as prioridades afetam as interrupções ......................................................... 98 5.6.1. Pre-emption ...................................................................................................... 99 5.6.2. Tail-chain ........................................................................................................ 100 5.6.3. Late-arriving ................................................................................................... 102 5.6.4. Return ............................................................................................................. 103 5.7. Stellaris Peripheral Driver Library for interrupts .............................................. 103 5.8. Exercícios e exemplos ........................................................................................... 104 5.8.1. EXEMPLO-03 – Interrupcoes na StellarisWare ............................................. 104 5.8.2. EXERCÍCIO-02 – Botões e LEDs com interrupcoes ......................................... 104 Página 78 5. Interrupções, falhas e exceções do ARM Cortex M4 Para os núcleos ARM Cortex M4 podemos classificar em dois os tipos de interrupções no ciclo normal de um programa: • Exceções (de 1 a 15): sinais que o sistema do núcleo envia e que precisam ser tratados, desviando o programa para uma nova região de código, onde será executada uma ISR (interrupt service routine). • Interrupções (de 16 a 255): sinais que os periféricos enviam para o núcleo informando que uma interrupção deve ser processada. As três primeiras exceções não são programáveis nem são mascaráveis (NMI), tendo prioridade de atendimento fixa. Todas as demais exceções podem ser programadas, como mostra a figura abaixo. Página 79 Já as interrupções feitas pelos periféricos podem ser todas programadas, como é possível notar na próxima figura. Toda vez que uma interrupção (exceção) acontece em um ARM Cortex M4, ela pode ter quatro estados de funcionamento: • Inativa: a interrupção não está ativa e portanto não está pendente. • Pendente: a interrupção está aguardando para ser processada pelo NVIC. Um periférico ou mesmo um comando de software pode tornar uma determinada interrupção como pendente. • Ativa: a interrupção começou a ser processada pelo NVIC, mas ainda não foi concluída. Note que a chegada de uma nova interrupção (interrupção aninhada) pode suspender o processamento de uma interrupção que está em andamento, se a prioridade da mesma for maior. Isto será explicado em detalhes mais a frente. • Ativa e pendente: a interrupção começou a ser trabalhada pelo NVIC e existe mais uma interrupção da mesma fonte na fila de espera (uma porta GPIO, por exemplo). Página 80 O NVIC manipula as exceções (interrupções) utilizando três técnicas diferentes: • ISR (Interrupt Service Routines): são os trechos de programa escritos e gravados na memória do ARM Cortex M4 e sujos endereços são associados a cada um dos periféricos ou elementos que podem gerar uma interrupção. Assim, quando uma interrupção acontece, o Program Counter é desviado para o endereço correspondente da ISR e o código começa a ser executado. esta mecânica de desvio será explicada em detalhes mais a frente. • Fault Handlers: Se a causa da interrupção (exceção) é uma falha, então o PC será desviado para endereços específicos de memória, mapeados na tabela mostrada anteriormente, onde o usuário pode escrever um código fonte que seja executado caso uma destas falhas aconteça. • System Handlers: se a interrupção (exceção) é causada pelo NMI, PendSV, SVCall ou SysTick, então elas são tratadas através de endereço específico. 5.1. O controle das interrupções Uma configuração da arquitetura do ARM Cortex M4 que chama a atenção é a sua possibilidade de amplo controle sobre as interrupções, permitindo ajustar o nível de prioridade que cada uma terá. Para isto é necessário saber qual é o número da interrupção que está sendo executada (mostrada no IPSR), e qual a sua prioridade de atendimento (mostrada no Interrupt Priority Register). 5.1.1. Program Status Register (xPSR) Além dos registradores de uso geral, a arquitetura ARM Cortex M4 conta com os registradores de uso especial, ou Special-purpose Program Status Registers (xPSR), que tão divididos em três categorias: aplicação, interrupção e execução, mostrados a seguir.Página 81 Eles podem ser acessados como registradores individuais, como uma combinação de dois ou três modos, ou mesmo com os três modos ao mesmo tempo, utilizando instruções em Assembly como a Move to Register from Status (MRS) e a Move to Status from Register (MSR). Para serem utilizados coletivamente, devem passar a ter o nome xPSR. Para as interrupções, vamos nos concentrar no IPSR. 5.1.1.1. Interruption PSR (IPSR) Informa qual é o número e a prioridade da interrupção a ser executada, como mostrado abaixo. 5.1.2. Interrupt Priority Register A ARM oferece o núcleo Cortex M4 com a opção de 8 a 256 níveis de prioridade. Isto se dá através do número de bits que foi alocado para o controle de prioridade dentro do registrador de prioridade de interrupção. No caso no LM4F120H5QR, existem oito níveis de prioridade que podem ser ajustados. Isto se deve ao fato de terem sido implementados apenas os três bits mais significativos nos registradores de prioridade, como mostra a figura a seguir. Página 82 Estes três bits podem ser ainda divididos em subgrupos, criando escalas de prioridades para os periféricos, como mostra a figura a seguir. Isto pode ser feito via software. Página 83 Todos estes ajustes, feitos via software, são implementados nos registradores de prioridade de interrupção, mapeados na memória do ARM Cortex M4, como é mostrado abaixo. Cada endereço de 32 bits representa quatro interrupções, onde são marcadas as suas respectivas prioridades de atendimento. 5.2. O comportamento das interrupções no ARM Cortex M4 Página 84 5.2.1. Nomenclatura das interrupções (exceções) 5.2.1.1. Única interrupção, com tratamento na ISR 5.2.1.2. Única interrupção, com tratamento no MAIN Página 85 5.2.1.3. Única interrupção, com fonte contínua 5.2.1.4. Múltiplas interrupções, único tratamento 5.2.1.5. Preemption Quando o processador está executando uma exceção (interrupção), uma nova interrupção pode parar a interrupção atual para ser tratada, desde que sua prioridade seja maior que a prioridade da exceção sendo manipulada atualmente. Isto é o que se pode chamar de interrupções aninhadas. Página 86 5.2.1.6. Tail-chaning Uma tradução literal permitiria chamar isto de "encadeamento de cauda". Esse mecanismo agiliza execução das interrupções. Após a conclusão de uma interrupção, se houver uma exceção pendente que atenda aos requisitos de entrada de exceção, o carregamento de de pilha é ignorado e controle transfere para Program Counter diretamente par ao endereço na nova interrupção. Página 87 5.2.1.7. Late-Arriving A chamada "chegada tardia" de uma interrupção é um fenômeno que pode ser muito mais comum do que se pensa em sistemas embarcados. Esse mecanismo acelera a preempção. Se ocorrer uma exceção de prioridade a mais elevada durante o estado da salvamento da dados na pilha em uma exceção anterior, o processador muda o valor do Program Counter para manipular a exceção de prioridade superior e inicia a busca de vetor para essa exceção. O salvamento de pilha da interrupção de menor prioridade não é afetada pela chegada tardia porque o ponto de retorno de programa é o mesmo para ambas as exceções. O NVIC pode aceitar uma chegada tardia de exceção até que a primeira instrução desta exceção entra na fase de execução dentro do NVIC. No retorno desta interrupção aplicam- se as regras normais de "encadeamento de cauda". 5.2.1.8. Return O retorno de uma interrupção ocorre quando esta é concluída e não há nenhuma outra exceção pendente, com prioridade suficiente para ser atendido e também não haja outra interrupção do tipo Late-Arriving. O NVIC desempilha os dados e restaura o estado do processador para o estado que tinha antes da interrupção ocorrer. Página 88 5.3. Utilizando as interrupções para tratar as falhas de sistema Outro recurso muito importante dos núcleos ARM Cortex M4 é a utilização de alguns vetores de interrupção para tratar de falhas do sistema. Como falha de sistema são consideradas as seguintes ações: • Falha de barramento. • Falha de manuseio de memória. • Falha de uso. • Falha de hardware. Durante o desenvolvimento do seu software, o uso das falhas fará com que você consiga identificar quais as fontes de erro em software e hardware. Para tanto é necessário um bom tratamento destas falhas, com a correta identificação das causa e a implementação das correções necessárias. Algumas técnicas sugeridas para tratar estas falhas de sistema são: • RESET: isto pode ser feito através do bit de controle SYSRESETREQ, dentro do registrador de controle interrupções do NVIC. • RECUPERAÇÃO: em alguns casos é possível fazer a recuperação de um sistema em que ocorreu uma falha. Por exemplo: se a falha foi causada por o uso de uma instrução de co processador, basta utilizar um software que faça a emulação deste co processador. • FINALIZAÇÃO DE TAREFA: para dispositivos que rodam sistemas operacionais (OS), de tempo real (RTOS) ou não, uma opção é finalizar a tarefa que causou a falha. Todas estas falhas são armazenadas e estão acessíveis através de um registrador do M4: Página 89 5.3.1. Falha de barramento Uma falha de barramento acontece quando é recebida uma resposta negativa durante uma transferência de dados pela interface AHB (responsável pelos barramentos de dados, I e D). Isto pode acontecer nos seguintes estágios: • Durante o carregamento de uma instrução (ciclo de fetch). • Durante um processo de leitura ou escrita no barramento. No Cortex M4, uma falha de barramento também pode acontecer nos seguintes casos: • O armazenamento de um dado na pilha (push on the stack), na entrada de uma interrupção; • A retirada de um dado da pilha (pop onto the stack), na saída de uma interrupção; • A leitura de um vetor de interrupção (carregamento de vetor – vector fetch) quando o processador está começando uma sequência de tratamento de interrupção (este é um caso especial, classificado como falha de hardware). O tipo de falha causada pelo barramento pode ser lida no Bus Fault Status Register (BFSR), mostrado na figura abaixo. Página 90 5.3.2. Falha de manuseio de memória Esta falha é causada por um acesso ilegal a memória. Isto pode acontecer por uma tentativa de acesso a uma região protegida pela MPU ou por tentar ler/escrever em uma área não mapeada de memória. O motivo que gerou esta falha pode ser detectado através do Memory Management Fault Status Register (MMFSR), mostrado abaixo. 5.3.3. Falha de uso Falhas de uso no Cortex M4 pode ser causada por diversos motivos: • Utilização de instruções que não estão presentes na máquina de estados; • Tentativa de utilizar instruções para núcleo duplo (co processadores); • Tentar fazer o chip migrar para o ARM State, ao invés de trabalhar em Thread Mode ou Handler Mode; • Um retorno inválido para uma interrupção (o endereço apontado pelo Linker Register (LR) é inválido); • Desalinhamento de acesso de memória através de múltiplas instruções de load e store. • Divisão por zero; O motivo que gerou esta falha pode ser detectado através do Usage Fault Status Register (UFSR), mostrado abaixo. Página 91 5.3.4. Falha de hardware É considerada uma falha de hardware todas as falhas causadas pelos motivos mostrados anteriormente (uso, memória ou barramento), mas que não conseguem entrar na rotina de tratamento destas falhas, gerando um travamento do hardware.O motivo que gerou esta falha fica armazenado no Hard Fault Status Register (HFSR), mostrado abaixo. 5.4. Utilizando o NVIC para tratar as interrupções O NVIC é parte integrante do Núcleo Cortex M4, estando o mais próximo possível dele. Ele contem os registradores de controle e da lógica da interrupção, além dos registradores que controlam o SYSTICK. Todos estes registradores são acessíveis através de mapeamento de memória. O NVIC pode ser acessado na faixa de endereços de memória conhecida como System Control Space (SCS), que começa no endereço 0xE000E000. A figura da próxima página mostra no LM4F120H5QR onde fica essa região, dentro de seu mapa de memória. Essa região conta com 4095 endereços de 32 bits, que são subdivido de acordo com as aplicações do NVIC, como mostrado abaixo: • de 0xE000E000 a 0xE000E00F Æ Interrupt Type Register; • de 0xE000E010 a 0xE000E0FF Æ System Timer; • de 0xE000E100 a 0xE000ECFF Æ NVIC; • de 0xE000ED00 a 0xE000ED8F Æ System Control Block, que incluem os registradores do CPUID, do controle do sistema (configuration e status) e do resultados de falhas; • de 0xE000EF00 a 0xE000EF0F Æ Software Trigger Exception Register; • de 0xE000EFD0 a 0xE000EFFF Æ ID Space; Página 92 Maiores detalhes sobre estes registradores e seus funcionamentos devem ser estudados diretamente no Manual de Referência Técnica, disponibilizado pela própria ARM e presente no CD que acompanha este treinamento. A grande maioria destes registradores são acessíveis apenas se o microcontrolador se encontra em Privileged Mode. 5.4.1. O SYSTICK Timer presente dentro do NVIC Interno ao NVIC existem um temporizados chamado de SYSTICK. Ele é utilizado para gerar uma interrupção de SYSTICK (interrupção número 15). Em diversos sistemas operacionais de tempo real, é necessária uma base de tempo que será utilizada para comutar dentre as tarefas a serem realizadas. O SYSTICK é um contador de 24 bits decrescente, que, durante o desenho do núcleo feito pela empresa ARM, pode utilizar uma fonte de clock de contagem externa ou mesmo o sinal de clock interno que alimenta o microcontrolador. Já os fabricantes que licenciam o núcleo podem optar por uma ou outra fonte de clock, o que pode causar diferenças entre os valores de SYSTICK entre núcleos ARM Cortex M4 de fabricantes diferentes. Página 93 5.4.1.1. O SYSTICK do LM4F120H5QR O temporizador SYSTICK do LM4F120H5QR é decrescente, de 24 bits limpos quando escrito (clear-on-write), recarregáveis no zero e com um mecanismo de controle bem flexível. Suas principais aplicações são: • Uma base de tempo para sistemas RTOS, com disparos a taxas programadas (100 hz, por exemplo); • Um alarme de alta velocidade utilizando a base de clock do microcontrolador; • Um alarme ou uma base de tempo com taxa variável ao longo da execução do programa; • Um contador simples de 24 bits, que pode ser utilizado para medir tempo de uso de determinado dispositivo; Para colocar o SYSTICK para funcionar, são utilizados três registradores: • SYSTICK Control and Status Register: habilita o contador, habilita as interrupções do SYSTICK e determina qual é o status do contador; Página 94 • SYSTICK Reload Value Register: será o valor a ser carregado no registrador cada vez que ele chegar a zero; Página 95 • SYSTICK Currente Value Register: será o valor atual e instantâneo do registrador. Existe um sistema de calibração para o SYSTICK, proposto pela própria ARM, que é ajustado por um registrador chamado SYSTICK Calibration Value Register, mostrado na figura abaixo. Este registrador não está implementado no LM4F120H5QR, não sendo possível implementar a calibração do SYSTICK. Página 96 5.5. Entrada em uma interrupção Ao entrar em uma interrupção, uma sequência de ações acontece: • Empilhamento dos oito registradores na pilha; • Carregamento do vetor de interrupção correspondente a quem o chamou; • Atualizar o ponteiro de pilha, o linker register e o contador de programa. 5.5.1. Empilhamento Quando uma interrupção é reconhecida pelo sistema, e está começando a ser tratada, os registradores R0 a R3, R12, LR, PC e xPSR são salvos na pilha. Será utilizado o apontador de pilha que estiver ativo no momento em que a interrupção aconteceu. Logo, se o código que está rodando no momento da entrada da interrupção está utilizando a Process Stack Pointer (PSP), este é o que será usado. Se o código está utilizando a Main Stack Pointer (MSP), está é que será utilizada. A sequência de armazenamento destes oito registradores é mostrado na figura abaixo. É importante lembrar que a Main Stack Pointer (MSP) sempre será utilizada enquanto o processador estiver em Handler Mode. Portanto concluímos que as interrupções aninhadas sempre utilizarão a Main Stack Pointer (MSP). Este bloco com oito registradores armazenados na pilha são chamados na literatura de stack frame. No núcleo ARM Cortex M4 o stack frame sempre começa em um endereço padrão. Existe um bit dentro do NVIC que faz o alinhamento do stack frame dentro da pilha. Este bit é o STKALIGN. Para que este processo de alinhamento aconteça, é necessário colocar o valor 1 neste bit, como mostra a figura a seguir. Página 97 5.5.2. Carregamento do vetor de interrupção Enquanto o barramento de dados está ocupado empilhando os oito registradores na pilha, o barramento de instruções do ARM Cortex M4 executará outra importante função. Ele carregará o vetor de interrupção correspondente a ação que o chamou. Já que acontecem em barramentos separados, em paralelo, as ações de empilhamento de registradores e carregamento de vetor de interrupção terminam ao mesmo tempo. 5.5.3. Atualização de SP, LR e PC Quando as operações de empilhamento e carregamento do vetor de interrupção estão completas, o endereço apontado pelo vetor de interrupção está pronto para ser executado pela maquina de estados do núcleo ARM Cortex M4. Para isto, diversos registradores do núcleo serão atualizados: • SP: que pode ser o MSP ou o PSP, dependendo de onde estava o programa no momento da chamada da interrupção. Ele será atualizado com o novo valor de ponteiro de pilha. Durante uma interrupção, sempre será utilizado o MSP. • PSR: o IPSR será atualizado com o número da interrupção que está sendo executada. • PC: será carregado com o endereço apontado pelo vetor de interrupção. • LR: será carregado com um valor especial, chamado EXC_RETURN. Este valor indicará para onde deverá retornar o programa após o término de uma interrupção. Página 98 5.6. Saída de uma interrupção Ao final de uma rotina de interrupção, um processo ocorrerá para restaurar as condições que o núcleo ARM Cortex M4 tinha antes de atender a interrupção que a solicitou. Existem três maneiras de sair de uma interrupção, todas elas utilizando os valores especiais que foram armazenados no LR no início do processo de tratamento de interrupção. A grande justificativa para isto é que não existe uma instrução especial para retorno de interrupção, como acontece em algumas arquiteturas clássicas (caso do RETI do 8051, por exemplo). Com isto, a máquina de retorno de interrupção pode ser implementada com uma sub rotina simples escrita em linguagem C. Em todas estas três maneiras de saída de interrupção, sempre serão executadas duas ações: • Desempilhamento dos registradores da pilha, fazendo a atualização do ponteiro da pilha para o valor inicial. • Atualização dos registradores do NVIC, limpando o bit responsável pela chamada da interrupção. 5.7. Como asprioridades afetam as interrupções Dependendo do nível de prioridade que uma interrupção tem, o comportamento do NVIC para tratá-la poderá ser alterado. Existem quatro ações a serem tomadas, mostradas em detalhes a seguir, em função do nível de prioridade: pre-emption, tail-chain, return e late- arraving. Página 99 5.7.1. Pre-emption Uma ação do tipo pre-emption acontece se uma nova interrupção tem uma prioridade maior do que a que está sendo tratada naquele momento. O pre-emption então é a resposta a uma interrupção que esteja pendente, que causa um desvio do programa que estiver em curso para a uma ISR (Interrupt Service Routine). Analisando o gráfico de tempos de ação de tratamento de interrupções por pre-emption, mostrado na próxima página, notamos que tudo começa no próximo ciclo após o sinal INTISR ser recebido. Isto indicará ao núcleo que uma interrupção chegou e que os registradores devem ser salvos na pilha, além de carregar o vetor de interrupção para o contador de programa. As seguintes ações são tomadas, durante o pre-emption, para indicar que a interrupção deve ser tratada: Página 100 • ETMINSTAT: indica que uma interrupção começa a ser tratada, através da informação binária 001, que acontece em um único ciclo de máquina. • CURRPRI: indica qual é a prioridade da interrupção que está sendo tratada neste momento. Esta informação permanece ativa durante toda a tratativa da interrupção, e passa a ser válida no momento em que o sinal ETMINSTAT indica a informação binária 001. • ETMINTNUM: indica o número da interrupção que está sendo tratada, também permanecendo ativo durante toda a tratativa da interrupção e sendo acionada pelo sinal ETMINSTAT. 5.7.2. Tail-chain Uma ação do tipo tail-chain acontece para aumentar a velocidade de processamento de interrupções. Quando uma ISR (Interrupt Service Routine) é finalizada, se existir outra interrupção pendente, o processo de armazenamento de dados em pilha é pulado e o controle é automaticamente passado a nova ISR, da interrupção que estava pendente. Analisando o gráfico de tempos de ação de tratamento de interrupções por tail-chain, mostrado na próxima página, notamos que o sinal INTISR continua em nível alto, indicando que ao final da última ISR ainda há outra interrupção pendente. Página 101 Isto indicará ao núcleo que uma nova interrupção chegou e que os registradores não precisam mais ser salvos na pilha, pois este processo foi feito durante a primeira entrada na interrupção. Somente será necessário carregar o vetor de interrupção para o contador de programa. As seguintes ações são tomadas, durante o tail-chain, para indicar que a nova interrupção deve ser tratada: • ETMINSTAT: indica que uma nova interrupção começa a ser tratada, através da informação binária 001, que acontece em um único ciclo de máquina. • CURRPRI: indica qual é a prioridade da interrupção que está sendo tratada neste momento. Esta informação permanece ativa durante toda a tratativa da interrupção, e passa a ser válida no momento em que o sinal ETMINSTAT indica a informação binária 001. • ETMINTNUM: indica o número da interrupção que está sendo tratada, também permanecendo ativo durante toda a tratativa da interrupção e sendo acionada pelo sinal ETMINSTAT. Página 102 5.7.3. Late-arriving Uma ação do tipo late-arriving acontece para aumentar a velocidade do processamento de pre-emption. Caso uma interrupção de maior prioridade seja recebida enquanto o NVIC está no processo de armazenamento de dados na pilha, o próprio NVIC chaveia seu processamento para esta interrupção, fazendo o carregamento do vetor de interrupção correspondente àquela que tem a maior prioridade. Todos os registradores salvos na pilha não são afetados pelo processo de late-arriving e podem ser utilizados normalmente. O processo de late-arriving só acontece enquanto não se entrou na primeira linha de código da primeira ISR (Interrupt Service Routine) a ser tratada. Após a entrada nesta primeira linha da primeira ISR, ai passa-se a tratar interrupções aninhadas. Analisando o gráfico de tempos de ação de tratamento de interrupções por late-arriving, mostrado na próxima página, notamos que agora podemos ter múltiplos sinais de INTISR, um para cara interrupção que solicitou tratamento, e todos acontecendo antes da entrada na primeira linha da primeira ISR. Note também que o sinal de INTISR[2], tem prioridade menor que o sinal INTISR[8], que tem prioridade menor que o sinal INTISR[9]. As seguintes ações são tomadas, durante o late-arriving, para indicar que a nova interrupção deve ser tratada: • ETMINSTAT: indica que uma nova interrupção começa a ser tratada, através da informação binária 001, que acontece em um único ciclo de máquina. • CURRPRI: indica qual é a prioridade da interrupção que está sendo tratada neste momento. Esta informação permanece ativa durante toda a tratativa da interrupção, e passa a ser válida no momento em que o sinal ETMINSTAT indica a informação binária 001. • ETMINTNUM: indica o número da interrupção que está sendo tratada, também permanecendo ativo durante toda a tratativa da interrupção e sendo acionada pelo sinal ETMINSTAT. Página 103 5.7.4. Return Quando não existem mais interrupções pendentes, ao final do tratamento de uma ISR, o processador, através do NVIC, fará o desempilhamento dos registradores que estavam na pilha, e retorna para o Thread Mode. 5.8. Stellaris Peripheral Driver Library for interrupts Um dos recursos mais interessantes ao utilizar os microcontroladores ARM Cortex M4 da Stellaris é a biblioteca de drivers de periféricos desenvolvida pelo time de engenheiros da Luminary Micro. Cada periférico conta com uma série de APIs prontas para utilização, em linguagem C, bastando para isto apenas colocar o arquivo include correspondente ao periférico que será utilizado. Esta biblioteca tem uma excelente documentação, disponível no link a seguir. Página 104 http://www.ti.com/lit/ug/spmu019o/spmu019o.pdf No caso das interrupções, o driver está nos arquivos interrupt.c e interrupt.h e contêm as seguintes funções: void IntDisable (unsigned long ulInterrupt) void IntEnable (unsigned long ulInterrupt) unsigned long IntIsEnabled (unsigned long ulInterrupt) tBoolean IntMasterDisable (void) tBoolean IntMasterEnable (void) void IntPendClear (unsigned long ulInterrupt) void IntPendSet (unsigned long ulInterrupt) long IntPriorityGet (unsigned long ulInterrupt) unsigned long IntPriorityGroupingGet (void) void IntPriorityGroupingSet (unsigned long ulBits) unsigned long IntPriorityMaskGet (void) void IntPriorityMaskSet (unsigned long ulPriorityMask) void IntPrioritySet (unsigned long ulInterrupt, unsigned char ucPriority) �void IntRegister (unsigned long ulInterrupt, void ( pfnHandler)(void)) void IntUnregister (unsigned long ulInterrupt) 5.9. Exercícios e exemplos 5.9.1. EXEMPLO-03 – Interrupcoes na StellarisWare Dentre os exemplos fornecidos pela biblioteca StellarisWare está o de interrupções (interrupts.c). Execute este programa utilizando os recursos de emulação passo a passo para perceber onde estão os ajustes realizados na placa. 5.9.2. EXERCÍCIO-02 – Botões e LEDs com interrupcoes Identifique na Stellaris LaunchPad LM4F120H5QR em que portas estão conectados os botões de navegação e o LED RGB. Escreva um programa para executar as seguintes ações: • Ao pressionar o botão SW1, o LED RGB seja aceso na seguinte ordem: vermelho, verde, azul. • Ao pressionar o botão SW2, o LED RGB seja apagado na seguinte ordem: azul, verde, azul. • Todos estespassos devem ser realizados por interrupção.
Compartilhar