Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de...

17
Capítulo 6 Exceções Autora: Wu Shin-Ting Ao longo da execução de um fluxo de controle programado, o processador pode se deparar com situações de erros conhecidos como faults: antes do processador iniciar a execução, como detecção de uma instrução inválida ou de operandos inválidos (divisão por zero); traps: durante ou após a execução de uma instrução pelo processador, como a ocorrência de overflow, e abort: quando ocorre uma falha grave no processador e que o sistema não sabe como prosseguir, como falha num acesso à memória por uso de endereços inválidos. Estas situações são detectadas com base nas condições pré-definidas. Porisso, elas são consideradas eventos síncronos (com o relógio do sistema) e são usualmente chamadas exceções. Diferentemente dos computadores de uso genérico, os microcontroladores usam intensamente as suas portas de entrada e de saída para interagir com os outros componentes no sistema em que ele está embutido. Através dos periféricos de entrada, o microcontrolador consegue coletar os dados necessários para processamento, e, via os periféricos de saída, os resultados do processamento podem ser exibidos ou usados diretamente em atuadores. Como processadores tem usualmente uma velocidade de processamento muito maior do que a dos periféricos, o grande desafio é como compatibilizar temporalmente os dois componentes sem sacificar o desempenho do primeiro e sem postergar a comunicação dos sinais com o segundo quando este estiver pronto para tal. Por exemplo, para detectar a mudança do estado de uma botoeira que depende da ação de um usuário que ocorre esporadicamente, será que o processador precisa executar periodicamente instruções de amostragem (polling) só para verificar o estado da boteira, ao invés de aplicar o tempo gasto com a amostragem na execução de outras instruções mais prioritárias? Outro exemplo é o uso de um processador para controlar um LCD. Vimos que o nosso processador Cortex-M0+ precisa somente de menos de 0.05μs para enviar uma instrução para o LCD, mas o processador do LCD precisa em torno de 1.53ms para processar a sua instrução Clear Display [1] . Será que o Cortex- M0+ precisa mesmo aguardar mais de 1500μs para enviar a próxima instrução para o LCD, ao invés de processar outras dezenas de milhares de instruções independentes em paralelo? E quando o LCD estiver pronto para processar a próxima instrução, como o nosso processador poderá saber que deve enviá-la?

Transcript of Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de...

Page 1: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

Capítulo 6

Exceções

Autora: Wu Shin-Ting

Ao longo da execução de um fluxo de controle programado, o processador pode se deparar comsituações de erros conhecidos como

faults: antes do processador iniciar a execução, como detecção de uma instrução inválida

ou de operandos inválidos (divisão por zero);

traps: durante ou após a execução de uma instrução pelo processador, como a ocorrência

de overflow, e

abort: quando ocorre uma falha grave no processador e que o sistema não sabe como

prosseguir, como falha num acesso à memória por uso de endereços inválidos.

Estas situações são detectadas com base nas condições pré-definidas. Porisso, elas são consideradaseventos síncronos (com o relógio do sistema) e são usualmente chamadas exceções.

Diferentemente dos computadores de uso genérico, os microcontroladores usam intensamente assuas portas de entrada e de saída para interagir com os outros componentes no sistema em que eleestá embutido. Através dos periféricos de entrada, o microcontrolador consegue coletar os dadosnecessários para processamento, e, via os periféricos de saída, os resultados do processamentopodem ser exibidos ou usados diretamente em atuadores. Como processadores tem usualmente umavelocidade de processamento muito maior do que a dos periféricos, o grande desafio é comocompatibilizar temporalmente os dois componentes sem sacificar o desempenho do primeiro e sempostergar a comunicação dos sinais com o segundo quando este estiver pronto para tal.

Por exemplo, para detectar a mudança do estado de uma botoeira que depende da ação de umusuário que ocorre esporadicamente, será que o processador precisa executar periodicamenteinstruções de amostragem (polling) só para verificar o estado da boteira, ao invés de aplicar o tempogasto com a amostragem na execução de outras instruções mais prioritárias? Outro exemplo é o usode um processador para controlar um LCD. Vimos que o nosso processador Cortex-M0+ precisasomente de menos de 0.05μs para enviar uma instrução para o LCD, mas o processador do LCDprecisa em torno de 1.53ms para processar a sua instrução Clear Display [1]. Será que o Cortex-M0+ precisa mesmo aguardar mais de 1500μs para enviar a próxima instrução para o LCD, ao invésde processar outras dezenas de milhares de instruções independentes em paralelo? E quando o LCDestiver pronto para processar a próxima instrução, como o nosso processador poderá saber que deveenviá-la?

Page 2: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

O mecanismo de interrupção implementado nos microcontroladores é uma solução eficiente paracompatibilizar um microcontrolador com o seu mundo externo. Ele provê uma forma eficiente tantopara capturar as variações nos estados dos periféricos quanto para respondê-las, desviandoautomaticamente do fluxo corrente de execução para uma rotina de serviço de interrupção pré-definida (Interrupt Service Routine - ISR). Os sinais oriundos dos periféricos são sinais assíncronos(em relação ao relógio do sistema) e chamamos aqueles que ativam o mecanismo de interrupção deinterrupções.

Na arquitetura ARM as interrupções são consideradas como casos especiais de exceções. Sob oponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos ostipos de eventos [2]. Os endereços de rotinas de serviço correspondentes às exeções e àsinterrupções estão armazenados na mesma Tabela de Vetores de Interrupção (Interrupt VectorTable). As interrupções são, porém, gerenciadas por um circuito extra denominado o controlador devetores de interrupção aninhandaos (Nested Vector Interrupt Control, NVIC). Veremos que estecircuito, em conjunto com o processador, consegue reduzir o tempo de latência no atendimento deduas ou mais interrupções consecutivas (tail-chaining) e no atendimento de uma interrupçãoprioritária com retardo (late-arrival). No núcleo do nosso microcontrolador está ainda integrado umtemporizador (timer) do sistema de 24-bits, denominado SysTick, que pode ser utilizado como umgerador de interrupções periódicas. Estas interrupções são eventos assíncronos gerenciados peloNVIC.

Figura 1: Módulos do núcleo dos microcontroladores da família Kinetis L: processador ARMCortex-M0+, NVIC e SysTick (opcional) (Fonte: [2])

6.1 Modelo de Exceções

A arquitetura ARM Cortex-M0+ suporta os seguintes tipos de exceção (Seção B 1.5.1 em [3]):

Reset: exceção que termina incondicionalmente o fluxo de execução corrente sem salvar o

estado,

NMI (Non-Maskable Interrupt) : é uma exceção não mascarável,

HardFault: exceção decorrente de uma condição de erro na execução de uma instrução,

SVCall: exceção causada pela chamada explícita da instrução SVC de chamada do

Supervisor,

Interrupt: exceção assíncrona ao fluxo normal de execução.

Page 3: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

Com exceção de Reset, uma exceção pode se encontrar num dos seguintes estados quanto ao seuprocessamento:

inativa: não é ativa nem pendente,

pendente: quando a exceção é gerada, mas ainda não se iniciou o seu processamento,

ativa: quando o processamento da exceção é iniciada,

ativa e pendente: quando uma instância da exceção se encontra em processamento e a

outra instância está aguardando pelo seu atendimento.

A cada exceção são associados um nível de prioridade, um número de exceção e um vetor (ou umaentrada) na Tabela de Vetores de Interrupção onde está armazenado o endereço da rotina de serviçoque trata a exceção, conforme mostra a Figura 2.

Figura 2: Exceções e seus atributos (Fonte:[7])

Três exceções, Reset, NMI e HardFault, tem o seu nível de prioridade fixado em -3, -2, -1,respectivamente. O nível de prioridade de outras exceções são configuráveis através de programas.A quantidade de níveis de prioridade configuráveis que o nosso processador Cortex-M0+ suporta é4, representável nos dois bits mais significativos de cada byte de prioridade do registrador deprioridade IPR do controlador NVIC como detalharemos na Seção 6.3. Apoś um Reset, o nível deprioridade de todas as exceções configurável é 0.

O número de exceção é, de fato, uma entrada ou um número do vetor na Tabela de Vetores deInterrupção onde está armazenado o endereço da rotina de serviço correspondente. Figura 2 mostraos números de exceção das exceções síncronas suportados pelo nosso microcontrolador e Tabela 3.7

Page 4: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

em [4] apresenta uma lista completa de todas as exceções e os respectivos números de exceçãoimplementados no nosso microcontrolador.

Quando o processador está executando uma rotina de serviço dizemos que ele está no modoHandler (tratamento de exceções); do contrário, ele está no modo Thread (aplicação). Este, por suavez, se distingue entre o modo Thread privilegiado (núcleo) e o modo Thread não-privilegiado(usuário). Para facilitar o tratamento de exceções aninhadas, uma dentro da outra, é implementadono processador duas pilhas, a pilha principal (Main Stack) e a pilha do processo (Process Stack). Nomodo Handler, o processador utiliza somente a pilha principal, enquanto para o modo Threadrecomenda-se o uso da pilha principal para o privilegiado e da pilha do processo para processos dousuário.

Dois problemas são observados no processamento de uma exceção ou de uma interrupção: latênciaou atraso no atendimento e ligeiros deslocamentos nos pulsos dos sinais (jitter). Para amenizar estesdois problemas, o processador Cortex-M0+ implementa dois mecanismos: exceção tardia (late-arrival) e encadeamento na cauda (tail-chaining).

6.1.1 Entrada de Exceção

Antes de executar uma rotina de serviço, ocorre o chaveamento do contexto (context switching) dofluxo de execução corrente para o fluxo de controle da rotina de serviço (modo Handler). Estechaveamento consiste em (Seçcão B1.5.6 em [3]):

finalizar a execução da instrução corrente,

salvar na pilha os registradores R0, R1, R2, R3, R12, LR, PC e APSR (Figura 3),

setar o registrador de retorno LR (link register) com o endereço de retorno e o tipo de

retorno,

atualizar o registrador IPSR (Interrupt Program Status Register) com o número de

exceção, e

carregar no PC o endereço armazenado no vetor correspondente da Tabela de Vetores de

Interrupção.

Page 5: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

Figura 3: Registradores do processador Cortex-M0 (Fonte: [5])

A pilha onde os registradores são empilhados varia conforme o modo de execução do processadorno momento da exceção. O processador procura garantir que o endereço do ponteiro do topo dapilha, SP, seja sempre alinhado em 8 bits (Seção B 1.5.7 em [3]). Vale observar ainda que, paraminimizar o tempo de latência no chaveamento de contexto, o processador sempre interrompe aexecução de uma instrução de transferência de múltiplos dados entre a memória e o processador, oude uma multiplicação envolvendo vários ciclos de relógio.

6.1.2 Retorno de Exceção

Após o atendimento de uma exceção no modo Handler, chaveia-se de volta para o fluxo ondeocorreu a interrupção, carregando no PC o conteúdo do LR através das instruções de assembly POPou BX. Como há três modos de execução do processador, há três tipos de retorno como mostraFigura 4: ao modo Handler, ao modo Thread privilegiado ou ao modo Thread não-privilegiado. Otipo de retorno codificado nos 4 bits menos significativos do LR faz com que o processadorrecupere automaticamente os valores dos registradores salvos na pilha. A instrução que teve a suaexecução interrompida é re-executada desde o seu início (Seção B 1.5.8 em [3]).

Page 6: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

Figura 4: Tipos de retorno

No nosso processador é implementado o mecanismo encadeamento de cauda (tail-chaining) queotimiza o tempo de latência entre o retorno de uma exceção e a entrada numa nova exceção empendência. Essencialmente o procedimento consiste em evitar a repetição do procedimento dechaveamento de contextos entre as exceções e o ponto do fluxo de controle em que ocorreu ainterrupção original.

6.1.3 Prioridade em Atendimento

Como múltiplas exceções são tratadas no processador Cortex-M0+? O nível de prioridade de umarotina de serviço em execução é setado como a prioridade de execução do processador. Umaexceção só pode interromper (ou adiar) a execução de uma instrução, se a sua prioridade deatendimento for superior à prioridade de execução. As instruções executadas no modo Thread temsempre a menor prioridade de execução. Vale chamar atenção de que na arquitetura ARM Cortex-Ma prioridade de atendimento de uma exceção é inversamente proporcional ao nivel de prioridadeassociado a ela. Quanto maior o nível, menor a prioridade de atendimento. Por exemplo, como osníveis de prioridade de Reset, NMI e HardFault são -3, -2 e -1 e os níveis de prioridadeconfiguráveis por software são sempre maior ou igual a 0, estas três exceções tem sempre maioresprioridades no atendimento. Cabe também lembrar aqui que não se deve alterar o nível deprioridade de uma exceção quando ela estiver habilitada ou ativa.

Se uma exceção de maior prioridade de atendimento ocorrer tardiamente, no momento em queacontece o chaveamento de contexto em decorrência de uma outra exceção ativa que chamamos deoriginal, o processador adia o atendimento desta exceção passando-a para estado pendente e atendea exceção tardia aproveitando toda a sequência de chaveamento já iniciada. Esta estratégia,conhecida por exceções tardias (late-arrival exceptions), consegue reduzir ainda mais o tempo delatência no atendimento de uma exceção prioritária.

E quando as múltiplas exceções tiverem o mesmo nível de prioridade? Neste caso, ela nãoconseguiria adiar (preempt) uma rotina de serviço ativa, mas conseguiria adiar rotinas de serviçopendentes de maior número de exceção (Seção B1.5.4 em [3]). Ou seja, quando se trata de exceçõescom o mesmo nível de prioridade e não houver nenhuma exceção no estado ativo, é atendidaprioritariamente a exceção que tiver menor número de exceção.

Page 7: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

6.2 Tabela de Vetores de Interrupção

Vimos na Seção 6.1 que as exceções os endereços das rotinas de serviço contém, de fato, asinstruções que tratam são armazenados na Tabela de Vetores de Interrupção. De acordo com a SeçãoB1.5.3 em [3], o endereço inicial da Tabela de Vetores de Interrupção é configurável, mas a ordemdos vetores de interrupção na Tabela é fixa na sequência dada pela Tabela 3.7 em [4]. Nosmicrocontroladores da família Kinetis, o endereço inicial da Tabela é 0x00000000 (Seção 1.1.3 em[5]). No momento de criação de um novo projeto no ambiente CodeWarrior, é geradaautomaticamente a Tabela de Vetores de Interrupção e configurados os endereços das seções dedados e de instruções (no arquivo Project_Settings/Linker_Files/MKL25Z128_flash.ld). no arquivo Project_Settings/Startup_Code/kinetis_sysinit.cFigura 5 mostra o conteúdo da seção .vectortable, definida no arquivoProject_Settings/Startup_Code/kinetis_sysinit.c. É a implementação da Tabela de Vetores deInterrupção como um vetor/arranjo de endereços em linguagem C pelo aplicativo IDE CodeWarrior.Cada elemento i do vetor é o endereço da rotina de serviço da exceção de número i. Note que aTabela de Vetores de Interrupção contém também o valor de inicialização do ponteiro do topo dapilha (SP), &estack, o valor inicial do contador de programa (PC) após um Reset, e o endereço darotina de tratamento de cada exceção.

Figura 5: Configuração da Tabela de Vetores de Interrupção no arquivo kinetis_sysinit.c

Page 8: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

Onde estão efetivamente definidas as rotinas de serviço? Uma busca mais minuciosa nos leva aencontrar a função __thumb_startup no arquivo Project_Settings/Startup_Code/__arm_start.c. E asoutras funções? Elas são, por default, substituíveis pela rotina Default_Handler, como mostraFigura 6.

Figura 6: Protótipo das funções correspondentes às rotinas de serviço na Tabela de Vetores deInterrupção

E onde está definida a rotina Default_Handler? Ela está definida no mesmo arquivokinetis_sysinit.c, como mostra Figura 7, contendo somente uma única instrução em assembly, bkpt.Esta instrução faz com que o processador entra no modo Debug.

Page 9: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

Figura 7: Rotina de Serviço Default_Handler

Se quisermos que as rotinas de serviço contenham instruções diferentes daquelas das contidas nafunção Default_Handler, precisaremos customizar as rotinas de serviço num outro arquivo ligávelao arquivo-objeto do kinetis_sysinit.c. No ambiente IDE CodeWarrior podemos criar um arquivoseparado na pasta Sources com todas as rotinas de serviço ou então inserir as rotinas de serviço noarquivo main.c. O seguinte trecho de código ilustra a redefinição da função SysTick_Handlerinserida no arquivo main.c:

unsigned int tempo; void SysTick_Handler(void) {

tempo++;}

A posição da memória, onde a Tabela de Vetores de Interrupção deve ser relocada na memória flashdo microcontrolador, está configurada no arquivo MKL25Z128_flash.ld. A instalação da Tabela deVetores de Interrupção deve ocorrer antes da execução do nosso programa. Figura 8 mostra adefinição do segmento de m_interrupts a partir do endereço 0x00000000 onde é relocada a seção.vectortable. Observe que o valor inicial de &estack é também definido neste arquivo. Ele é0x20003000.

Page 10: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

Figura 8: Configuração dos segmentos de memória no arquivo MKL25Z128_flash.ld.

6.3 Controlador NVIC

O processamento de uma condição de exceção/interrupção nos microcontroladores segue o mesmoprincípio básico do processamento de uma condição de exceção/interrupção nos computadores deuso genérico: reconhecer uma condição de exceção, desviar para as instruções que a tratem, eretornar para o fluxo de controle original. Porém, a criticidade no tempo de resposta do sistema e ovolume de sinais de entrada e de saída com os quais o sistema deve interagir demandam um projetomais elaborado do circuito de processamento de interrupções. O processador Cortex-M0+ é, porexemplo, provido de um controlador dedicado denominado controlador de interrupçõesvetorizadas e aninhadas (Nested Vectored Interrupt Controller) para arbitrar, conforme o nível deprioridade associado a cada exceção mostrado na Figura 2, a prioridade de atendimento de até 32interrupções assíncronas e todas as exceções do núcleo. É assegurado na implementação doprocessador que o circuito NVIC detecte uma requisição de interrupção/exceção e busque aprimeira instrução da rotina de serviço numa quantidade fixa de ciclos de relógio. Isso garante queos atendimentos a interrupções/exceções sejam livres do fenômeno jitter (jitter-free) (Seção 3.6.1

Page 11: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

em [2]).

Figura 9: NVIC (Fonte: [6])

Como vimos na Seção 6.1, todas as interrupções assíncronas externas ao núcleo tem o seu nível deprioridade programável. Cada uma destas interrupções externas ao núcleo tem um número n deinterrupção (Interrupt Request, IRQn) associado. Conforme podemos ver na Figura 2, o número deexceção de uma interrupção externa é igual ao seu número IRQ incrementada de 16 (IRQ+16). Paraserem atendidas, os sinais externos devem fazer requisições. Quando há “espaço na fila de entrada”,uma requisição entra no NVIC como uma exceção pendente, aguardando passar para estado ativo.

O controlador NVIC dispõe de um conjunto de registradores de estado e de controle para configuraro atendimento das 32 interrupções IRQ. Todos os registradores tem 32 bits. Com exceção dosregistradores NVIC_IPRx, cada bit n do registrador controla uma requisição de interrupção IRQn.Eles são os registradores NVIC_ISER (Interrupt Set-Enable Register), NVIC_ICER (InterruptClear-Enable Register, CLRENA), NVIC_ISPR (Interrupt Set-Pending Register), NVIC_ICPR(Interrupt Clear-Pending Register) e NVIC_IPRx (Interrupt Priority Register). Estes registradoressão mapeados na memória e são acessíveis através do barramento interno denominado PrivatePeripheral Bus (PPB) (Seção 3.3.2 em [4]). Figura 10 ilustra como estes registradores operam emconjunto para tratar uma requisição de interrupção IRQ conforme o modelo de exceção doprocessador Cortex-M.

Figura 10: Processamento de uma IRQn no NVIC (Fonte:[7])

Page 12: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

O controlador NVIC adota a política write-1-to-enable/disable nos registradores NVIC_ISER(SETENA) e NVIC_ICER (CLRENA) para habilitar e desabilitar uma interrupção IRQ (SeçõesB3.4.3 e B3.4.4 de [3]) Observe na Figura 10 que, quando há uma solicitação de IRQ (por nível oupor borda), esta fica pendente e se a interrupção estiver habilitada, ela entrará na lista deprioridades. As pendências podem, no entanto, ser removidas antes do atendimento via osregistradores NVIC_ISPR (SETPEND) e NVIC_ICPR (CLRPEND) (Seções B3.4.5 e B3.4.6 de[3]). O controlador NVIC adota também a política write-1-to-set/clear (w1c) para setar e limparuma solicitação pendente de uma IRQ. O atendimento efetivo de uma requisição ocorre com baseno nível de prioridade de atendimento das requisições. Portanto, é importante configurarcorretamente o nível de prioridade de atendimento de cada interrupção externa através dosregistradores NVIC_IPRx (Seção 3.3.2.1 de [4]). bits

Cada registrador NVIC_IPRx contém o nível de prioridade de 4 IRQs como ilustra Figura 11.Como são 32 IRQs, há 8 registradores NVIC_IPRx. Através do número n de uma IRQ podemosdeterminar o registrador NVIC_IPRx e os seus dois bits <ba> que contém o nível de prioridade daIRQn através das seguintes equações (Seção 3.3.2.3.1 em [4]):

x = n/4bit a = 8*(n mod 4)+6bit b = a+1

No arquivo Project Headers > MKL25Z4.h existem definidas 32 macros NVIC_IP_PRI_n (y) parafacilitar a configuração do nível de prioridade de cada IRQn. Essencialmente, estas macros setam onível de prioridade y no campo correto do registrador NVIC_IPRx associado à interrupção IRQn. Éimportante observar que y deve estar no formato mostrado na Figura 11, onde o nível de prioridaderepresentado por 2 bits fica armazenado nos 2 bits mais significativos de um byte. Isso significaque, se quisermos setar para IRQ5, n=5, o nível de prioridade 1 com uso da macroNVIC_IP_PRI_n, devemos utilizar a seguinte instrução

NVIC_IPR1 = NVIC_IP_PRI_5(0x60);

É NVIC_IPR1 porque x=5/4=1. E é 0x60, porque 0x60 = 0b01000000 com os dois bits maissignificativos representando o nível de prioridade 1.

Page 13: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

Figura 11: Registradores de Prioridade (Fonte: [3])

Adotando a mesma política de arbitragem da prioridade de atendimento adotada pelo processador,apresentada na Seção 6.1.3, o circuito de detecção de prioridade do NVIC seleciona dentre as IRQshabilitadas e as exceções oriundas do núcleo aquela que tiver a maior prioridade de atendimento,podendo porém interromper uma no estado ativo para atender uma outra de maior prioridade comomostra Figura 12.

Page 14: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

Figura 12: IRQ aninhada (Fonte: [6])

6.4 SysTick: Interrupção do Núcleo

É integrado ao núcleo do nosso MCU um contador de 24 bits, decrementador, cíclico e resetávelcom uma operação de escrita (clear-on-write) (B3.3 em [3]). Este timer, opcional da arquiteturaARM Cortex-M, permite que o núcleo gere interrupções periódicas com o privilégio de interferir noprocessamento do núcleo respeitando a política de prioridade do processador. Cada decrementocorresponde a um tick (de relógio), daí o nome SysTick timer.

O temporizador dispõe de quatro registradores: SYST_CSR (SysTick Control and Status Register),SYST_RVR (SysTick Reload Value Register), SYST_CVR (SysTick Current Value Register) eSYST_CALIB (SysTick Calibration Value). O primeiro (SYST_CSR) controla a configuração e oestado do temporizador; o segundo (SYST_RVR) é usado para guardar o valor máximo decontagem automaticamente recarregável no registrador SYST_CVR quando este atinge 0; oterceiro (SYST_CVR) é o contador propriamente dito, usado para contagem regressiva cujoconteúdo é automaticamente zerado quando se faze um acesso de escrita nele; e o quarto é usadopara calibração do temporizador. Observe que há um bit [0] no registrador SYST_CSR responsávelpelo controle da ativação e da desativação do temporizador. Quando o bit TICKINT do SYST_CSRestiver setado, gera-se uma exceção quando a contagem em SYST_CVR atingir 0.

Por exemplo, para que o SysTick gere interrupções periódicas de 0.25s, devemos setar noregistrador SYST)RVR o valor

0.25s/(1/20.971.520)s = 0.25*20971520 = 5242880

e para assegurar que o conteúdo do registrador SYST_CVR seja resetado, podemos fazer um acessode escrita.

O nível de prioridade do SysTick é configurável como as IRQs (Figura 2). Porém, sendo suasinterrupções classificadas como as do núcleo, as suas pendências e o seu nível de priopridade estãoarmazenados nos registradores do núcleo: no registrtador ICSR (Interrupt Controle and StateRegister, Seção B 3.2.4. em [3]) e no registrador SHPR3 (System Handler Priority Register 3, SeçãoB3.2.10), respectivamente. No registrador ICSR encontramos. além dos bits de contole de limpar(PENDSTCLR) e setar (PEDSTSET) a pendência do SysTick, o número de exceção ativa(VECTACTIVE) e o número de exceção pendente com maior prioridade de atendimento

Page 15: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

(VECTPENDING), conforme ilustra a Figura 13.

Figura 13: Registrador ICSR (Fonte: [3])

6.5 Interrupções Externas

Para prover tratamentos diferenciados aos possíveis eventos geradores de interrupção nosperiféricos, estes são providos de registradores de estado e de controle com bits dedicados para cadatipo de evento mesmo que seja gerada somente uma única IRQ para cada periférico.

Figura 14 ilustra o registrador IF, correspondente ao registrador PORTx_ISFR (Interrupt StausFlag, Seção 11.5.4 em [4]) de um módulo de controle de porta e de interrupção PORTx. Os bitsdeste registrador indicam o estado de interrupção de cada pino da PORTx. Quando a condição deinterrupção é detectada num pino n, o bit n é setado. Mesmo que o módulo NVIC seja somentesensível ao nível, há um circuito detector de bordas e de níveis no módulo PORTx de forma quesejam configuráveis quatro condições de interrupção para cada pino individualmente através docampo IRQC do registrador PORTx_PCRn (Pin Control, Seção 11.5.1 em [4]): a borda de subida, aborda de descida, o nível alto e/ou o nível baixo. Se qualquer um dos pinos de PORTx tiver umacondição de interrupção detectada e a interrupção do pino estiver habilitada, é gerado um sinalnuma única linha IRQ. Por exemplo, qualquer pino da PORTA em condição de interrupção gera ummesmo sinal na linha IRQ30 no nosso microcontrolador (Seção 3.3.2.3 em [4]).

Figura 14: IRQ geradas pelos periféricos (Fonte: [8])

A partir do sinal IRQ ativado o NVIC inicia o processamento de atendimento da interrupçãoconforme detalhado na Seção 6.3. Note que o fluxo, da detecção de uma condição de interrupção

Page 16: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

até o seu processamento pelo processador, é unidirecional. Após a execução da rotina de serviço, abandeira de interrupção levantada no registrador PORTx_ISFR não é automaticamente baixada(zerada). Cabe ao programador baixá/limpá-lo para que elas não seja reconhecida com uma novasolicitação de interrupção. A estratégia implementada para baixar a bandeira é write-one-to-clear(w1c), ou seja, precisa-se fazer um acesso de escrita (de 1) no bit.

6.6 Programação

Embora seja complexo o modelo de processamento de exceções do processador Cortex-M, aprogramação do nosso microcontrolador para tratar uma solicitação de interrupção é relativamentesimples. Essencialmente ela consiste em configurar os registradores de controle e customizar arotina de serviço através dos seguintes passos:

programar a rotina de serviço cujos nomes são os pré-definidos na tabela do arquivo

Project_Settings/Startup_Code/kinetis_sysinit.c;

configurar os registradores de controle de interrupção do módulo. Por exemplo, para o

módulo PORTA, devemos configurar os registradores PORTA_PCRn e para o móduloSysTick devemos configurar os registradores SYST_CSR e SYST_RVR;

Se for uma interrupção externa, inicializar o NVIC, limpando as pendências e setando os

níveis de priporidade das IRQs a serem tratadas; senão, limpe a pendência e configure o seunível de prioriodade nos registradores de controle de interrupção do núcleo caso fossemconfiguráveis, como o módulo SysTick; e

habilitar a interrupção.

6.7 Interrupções em Sistemas Embarcados

Prover mecanismos de interrupção eficientes é uma das características mais relevantes dos sistemasembarcados. Isso os tornam mais interativos e mais eficientes no tratamento de eventos críticos.Quando bem estruturados, os códigos dos microcontroladores podem ficar mais simples e maisfáceis de entender. Por outro lado, pela sua natureza altamente assíncrona, o comportamento doprograma pode parecer bastante confuso e totalmente imprevisível para um programador poucotreinado. Em [8] encontramos uma lista de recomendações para desenvolver um bom projeto desoftware para sistemas embarcados envolvendo interrupções, entre as quais destaco:

manter a rotinas de serviço o mais simples possível;

manter o tempo de execução de uma rotina de serviço menor possível;

evitar habilitação de uma interrupção dentro de uma rotina de serviço;

manter uma estrutura linear para os códigos de uma rotina de serviço, evitando laços muito

grandes;

Page 17: Capítulo 6 Exceções - Faculdade de Engenharia Elétrica e de ... · ponto de vista de processamento, é utilizado o mesmo modelo de tratamento exceção para ambos os tipos de

utilizar o qualificador volatile nas variáveis que são manipuladas nas rotinas de serviço; e

manter a atualização das variáveis compartilháveis entre rotinas de serivço num único lugar.

Referências

[1] Specifications Moduls for LCDftp://ftp.dca.fee.unicamp.br/pub/docs/ea079/datasheet/AC162A.pdf[2] ARM. Cortex-M0+ Nested Vector Interrupt Controllerhttp://microchip.wikidot.com/32arm:m0-nvic[3] ARM. ARMv6-M Architecture Reference Manualftp://ftp.dca.fee.unicamp.br/pub/docs/ea871/ARM/ARMv6-M.pdf[4] Freescale. KL25 Sub-Family Reference Manual, Rev. 3, September 2012ftp://ftp.dca.fee.unicamp.br/pub/docs/ea871/ARM/KL25P80M48SF0RM.pdf[5] The WireFrame. Writing a basic multitasking OS for ARM Cortex-M3 processorhttp://www.thewireframecommunity.com/writing-a-basic-multitasking-os-for-arm-cortex-m3-processor[6] Xinnova. ARM Cortex-M technologieshttp://www.xinnovatech.com/pdf/ARM%20Cortex-M%20technologies.pdf[7] ARM. Interrupt Behavior of Cortex-M1http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0211a/index.html[8] Silicon Labs Community. EFM32 and EFR32 Interrupt Handlinghttp://community.silabs.com/t5/tkb/articleprintpage/tkb-id/2@tkb/article-id/1193[9] Better Embedded System SWhttps://betterembsw.blogspot.com.br/2013/03/rules-for-using-interrupts.html

Setembro 2016