Dúvida sobre interrupção

142 views
Skip to first unread message

Igor Cavalcanti

unread,
Dec 6, 2012, 8:52:56 AM12/6/12
to sis_emb...@googlegroups.com
Olá, gente!
 
    Quando há o acionamento de uma interrupção no microcontrolador 8051, o programa do micro é desviado para o vetor de interrupção específico e deste ponto é desviado para a rotina de interrupção que eu implementei.
    Tenho uma dúvida: quando o programa estiver no meio da rotina de interrupção, é possivel que a mesma interrupção seja acionada e a rotina de interrupção seja chamada novamente, antes de acabar a primeira execução?  
    Abraços! 

Felipe de Andrade Neves Lavratti

unread,
Dec 6, 2012, 12:56:06 PM12/6/12
to sis_emb...@googlegroups.com
Não manjo PIC, mas provavelmente vc tem que, ao final da rotina de atendimento à interrupção (handler), escrever em um registrador que irá avisar que a interrupção foi atendida. Assim sendo, o comportamento que você descreve não ocorre.


Henrique Rossi

unread,
Dec 6, 2012, 1:05:38 PM12/6/12
to sis_emb...@googlegroups.com
Olá Igor,

Faz muito tempo que não trabalho com 8051, mas a resposta é sim. Para evitar este comportamento, chamado de interrupção aninhada, basta desabilitar todas as interrupções ou somente a que estiver sendo tratada no início da ISR
e ao final da mesa realizar a operação inversa. Ou seja, no início desabilta e ao final habilita.

void int_isr( void ) {
  DESABILITA_INTERRUPCAO();

  /* Trata interrupcao */

  HABILITA_INTERRUPCAO();
}

Espero ter ajudado!


Henrique P. Rossi



2012/12/6 Igor Cavalcanti <igorc...@gmail.com>

Igor Cavalcanti

unread,
Dec 7, 2012, 5:57:17 AM12/7/12
to sis_emb...@googlegroups.com
Pessoal, muito obrigado!
Henrique Rossi, não conhecia o termo "chamado de interrupção aninhada"! Aprendi mais uma rs!
Fiz o que foi aconselhado: desabilitei a interrupção no inicio da Interrupt Handler e no final da mesma habilitei a interrupção!
Abraços!

Sergio Prado

unread,
Dec 7, 2012, 9:00:13 AM12/7/12
to sis_emb...@googlegroups.com
Olá Igor,

Apenas complementando as informações do Henrique.

A arquitetura 8051 permite interrupções aninhadas (em inglês usa-se o
termo interrupt nesting). Isso significa que se você estiver tratando
uma interrupção e outra interrupção *de maior prioridade* acontecer, a
sua interrupção será interrompida para atender a interrupção de maior
prioridade. OK, abusei do termo "interrupção" aqui...:)

O principal detalhe é que uma interrupção no 8051 não pode ser
interrompida por uma outra interrupção de igual ou menor prioridade.
Isso significa que sua interrupção não será interrompida por ela
mesma!

Resumo da ópera, a não ser que você esteja compartilhando dados entre
interrupções (o que pode ser um erro de design), evite sempre que
possível desabilitar todas as interrupção dentro de uma ISR.

Por mais rápido que sua ISR seja, desabilitando as interrupções lá
dentro pode aumentar o tempo de latência (resposta à eventos) da sua
aplicação.

Um abraço,

Sergio Prado
www.sergioprado.org
Twitter @sergioprado

Igor Cavalcanti

unread,
Dec 17, 2012, 5:21:33 AM12/17/12
to sis_emb...@googlegroups.com
Desculpe a demora em responder, Sergio!
Muito obrigado pela explicação didática!
Está mais do que entendido agora!
Abraço!
Reply all
Reply to author
Forward
0 new messages