Buscar

APOSTILA M4 PARTE3

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.

Continue navegando