Upload
internet
View
104
Download
0
Embed Size (px)
Citation preview
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.
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
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
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
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)
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
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?
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
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
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
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
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
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
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
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... ...
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
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?
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
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
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