21
Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Embed Size (px)

Citation preview

Page 1: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Interrupções

Ivan Saraiva Silva

Sistemas de Tempo Real Embutidos

Page 2: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

O Problema

• Nem sempre é possível garantir que o sistema (embutido) vai reagir rapidamente a eventos externos.

• Exemplo– Em um sistems automatizados de controle de

trem elétrico– O trem está desenvolvendo sua velocidade

máxima quando um sensor avisa da presença de um obstáculo na linha.

Page 3: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Uma solução

• Interrupção• Uma interrupção deve causar a suspensão

da atividade em execução para que a interrupção seja tratada

• Interrupção pode introduzir novos problemas– Programabilidade– Imprevisibilidade

Page 4: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Conceitos básicos

• Em sistemas embutidos baseados em micro-controladores– Aplicações desenvolvidas em linguagens de

alto nível são traduzidas para código assembly– A maioria dos comandos da linguagem C, por

exemplo, são traduzidos em uma série de instruções assembly

Page 5: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Conceitos básicos

• A maioria dos micro-controlador possuem pinos de interrupção (IRQ – Interrupt Request)

• Quando um destes pinos é ativado o micro-controlador para a seqüência de execução apontada pelo PC e salta para uma rotina de tratamento da interrupção

Page 6: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Conceitos básicos

• Tarefas da rotina de tratamento– Salvar contexto– Tratar a interrupção– Restaurar contexto

• Para a maioria dos microcontroladores é possível desabilitar interrupções

• A maioria dos microcontroladores dispões de interrupções não macaráveis (não podem ser desabilitadas)

Page 7: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Conceitos básicos

• Sobre interrupções e microntroladores é necessário conhecer– Onde encontrar a rotina de tratamento da

interrupção– Se duas interrupções ocorrem ao mesmo tempo

qual é trataDa primeiro– O que acontece se uma interrupção ocorre

quando interrupções estão desabilitadas

Page 8: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Conceitos básicos

– O que acontece se o programador esquece de reabilitar as interrupções depois elas foram desabilitadas?

– O que acontece se o programador desabilita as interrupções quando elas já estão desabilitadas?

– O que acontece se o programador habilita as interrupções quando elas já estão habilitadas?

– As interrupções estão habilitadas ou desabilitadas quando o microcontrolador é inicializado?

– Rotinas de interrupçào podem ser escritas em C?

Page 9: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Variáveis Compartilhadas

• Um problema comum ocorre devido a necessidade de comunicação entre as tarefas do sistema e as rotinas de interrupção

• Normalmente esta comunicação é feita por intermédio do compartilhamento de variávies.

EXEMPLO

Page 10: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Exemplo

void main (void){ int iTemp0, iTemp1; whilw (TRUE) { iTemp[0] = iTemperature[0]; iTemp[1] = iTemperature[1]; if (iTemp0 != iTemp1) !!! ALARME; }}

void interrupt vReadTemp (void){ iTemperature[0] = !! Lê temp; iTemperature[1] = !! Lê temp;}

Hardware de leitura datemperatura interrompe:• se uma temperatura muda• periodicamente

Page 11: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Alarme Falso

void main (void){ int iTemp0, iTemp1; whilw (TRUE) { iTemp[0] = iTemperature[0]; iTemp[1] = iTemperature[1]; if (iTemp0 != iTemp1) !!! ALARME }}

E se uma interrupção acontecer aqui?

Alarme falso

Page 12: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Uma Solução (?)

void main (void){

whilw (TRUE) {if (iTemperature[0] != iTemperature[1]) !!! ALARME }}

void interrupt vReadTemp (void){ iTemperature[0] = !! Lê temp. iTemperature[0] = !! Lê temp.}

Hardware de leitura datemperatura interrompe:• se uma temperatura muda• periodicamente

Page 13: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Alarme Falso

...Begin: MOVE R1, (iTemperature[0] MOVE R2, (iTemperature[1] SUB R1,R2 JCOND ZERO, Begin......... Código Alarme......

E se uma interrupção acontecer aqui?

Alarme falso

Page 14: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Quando este problema é percebido

• As 5 da noite na sexta-feira

• Quando você não estiver prestando atenção

• Quando não se dispões de recursos para depuração

• Quando seu sistema foi acionado em Marte

• Durante a demonstração para o Cliente

FALHA QUANDO NÃO DEVERIA

Page 15: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

A SOLUÇÃO

void main (void){ int iTemp0, iTemp1; whilw (TRUE) { disable ( ); iTemp[0] = iTemperature[0]; iTemp[1] = iTemperature[1]; enable ( ); if (iTemp0 != iTemp1) !!! ALARME; }}

void interrupt vReadTemp (void){ iTemperature[0] = !! Lê temp. iTemperature[0] = !! Lê temp.}

Hardware de leitura datemperatura interrompe:• se uma temperatura muda• periodicamente

Page 16: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

A Solução

...Begin: DI (Instrução Disable Interruption) MOVE R1, (iTemperature[0]) MOVE R1, (iTemperature[1]) EI (Instrução Enable Interruption) SUB R1,R2 JCOND ZERO, Begin......... Código Alarme... ...

Page 17: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Mais Exemplo

void interrupt vUpdateTime (void){++iSeconds; if (iSeconds >=60) {iSeconds = 0; ++iMinutes; if (iMinutes >=60) {iMinutes = 0; ++ iHours; if (iHours >=24) iHours = 0; } }}

long lSencoSinceMidnight (void){ return ((((iHours*60)+iMinuts)* 60)+iSeconds);}

Obviamente podem ocorrerproblemas se houver interrupçãono calculo dos segundos desdemeia noite

Page 18: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Soluções

long lSencoSinceMidnight (void){ disable ( ); return ((((iHours*60)+iMinuts* 60)+iSeconds); enable ( );}

ERRADO

long lSencoSinceMidnight (void){ long lReturnVal disable ( ); lReturnVal = (((iHours*60)+iMinuts)*60) +iSeconds; enable ( ); return (lReturnVal);}

SE CHAMADO EM SEÇÃOCRÍTICA?

Page 19: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Soluções

long lSencoSinceMidnight (void){ long lReturnVal Bool fInterruptStateOld; fInterruptStateOld =disable ( ); lReturnVal = (((iHours*60)+iMinuts)*60) +iSeconds; if(fInterruptStateOld) enable ( ); return (lReturnVal);}

Desable retorna TRUE se não desabilitado antes

Page 20: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Soluções

void interrupt vUpdateTime (void){ ++lSecondsToday; if (lSecondsToday == 60*60*24) lSecondsToday = 0L;}

long lSencoSinceMidnight (void){ return (lSecondsToday);}

Solução se registradores do micro-controlador longos

MOVE R1, (lSecondsToday)RETURN

Page 21: Interrupções Ivan Saraiva Silva Sistemas de Tempo Real Embutidos

Soluções

void interrupt vUpdateTime (void){ ++lSecondsToday; if (lSecondsToday == 60*60*24) lSecondsToday = 0L;} long lSencoSinceMidnight (void)

{ long lReturn; lReturn = lSecondsToday; while (lReturn != lSecondsToday) lReturn = lSecondsToday; return (Return);

Se duas leituras são idênticas devem estarcertas