A execução de um programa de interrupção do timer é acionada por um cronômetro de hardware que atinge um valor predefinido. Aqui está um colapso do processo:
1. Configuração do timer de hardware: *
Inicialização: O temporizador é inicializado com um valor específico (contagem) representando o intervalo de tempo desejado. Isso pode envolver a definição de registros dentro do hardware do timer. O temporizador também precisa do seu modo configurado (por exemplo, um tiro para um único gatilho, periódico para interrupções repetidas).
*
Fonte do relógio: O temporizador está conectado a uma fonte de relógio (por exemplo, um relógio do sistema). Este relógio incrementa o balcão do cronômetro.
2. Geração de interrupção do timer: *
Contador atingindo zero: À medida que o relógio aumenta o contador do cronômetro, ele acaba atingindo zero (ou uma contagem de terminais especificados). Este evento aciona um sinal de interrupção de hardware.
*
Solicitação de interrupção (IRQ): O timer de hardware envia uma solicitação de interrupção (IRQ) para o processador. Este pedido indica que um evento precisa de atenção imediata.
3. Manuseio de interrupção pela CPU: *
Reconhecimento de interrupção: A CPU reconhece a interrupção, suspendendo sua execução atual. A prioridade da interrupção do timer determina se é tratada imediatamente ou após interrupções de prioridade mais alta.
*
Salvando o contexto: A CPU salva o estado do programa atual (registros, contador de programas etc.) em uma pilha. Isso é crucial para retomar a execução mais tarde.
*
Tabela de vetor de interrupção: A CPU consulta a tabela de vetores de interrupção para localizar o endereço de memória da rotina de serviço de interrupção (ISR) associada à interrupção do timer.
*
pular para ISR: A CPU pula para a localização da memória do ISR do interrupção do timer.
4. Rotina de serviço de interrupção (ISR) Execução: *
Código ISR: Esta é a peça específica de código projetada para lidar com a interrupção do timer. Suas tarefas podem incluir:
*
Atualizando um contador: Mantendo o controle do tempo decorrido.
*
alternar uma saída: Controlar um LED ou outro periférico.
*
Tarefas de agendamento: Executando outras funções do programa em intervalos específicos.
*
LEITURA DADOS DE SENSOR: Amostragem de dados de sensores em intervalos regulares.
*
Comunicação: Enviando/recebendo dados sobre uma rede ou porta serial.
*
Mantendo -o curto: O ISRS deve ser mantido o mais curto possível para minimizar o tempo em que o programa principal é interrompido. As tarefas de longa duração devem ser descarregadas para o programa principal depois que o ISR define um sinalizador ou atualiza uma estrutura de dados compartilhada.
5. Retornando da interrupção: *
Restaurando o contexto: O ISR restaura o estado da CPU que foi salvo anteriormente (registros, contador de programas etc.).
*
retornar da interrupção (IRET ou RTI): Uma instrução especial (IRET ou RTI, dependendo da arquitetura) é executada para retornar o controle do programa principal. A CPU retoma a execução de onde parou antes da interrupção.
Exemplo (código conceitual do tipo C): `` `c
// Timer ISR
void timer_isr () {
estático não assinado INT contador =0; // Contador para o tempo de rastreamento
contador ++;
if (contador ==1000) {// Verifique se ocorreram interrupções de 1000 timer
contador =0;
// executar alguma ação, por exemplo, alternar um LED
toggle_led ();
}
}
`` `
Considerações importantes: *
Latência de interrupção: O tempo gasto entre a solicitação de interrupção e o início do ISR é a latência de interrupção. É crucial manter isso baixo para aplicativos em tempo real.
*
Priorização de interrupção: Várias interrupções podem ocorrer simultaneamente. A CPU lida com isso com base em suas prioridades atribuídas.
*
Reentrância: ISRs devem ser reentrantes; o que significa que eles podem ser interrompidos novamente antes de concluir sua execução sem causar corrupção de dados.
*
Recursos compartilhados: São necessários mecanismos cuidadosos de sincronização (por exemplo, semáforos, mutexes) se os recursos compartilhados com acesso à ISR também usados pelo programa principal.
Esse processo se aplica a uma ampla gama de microcontroladores e sistemas incorporados. Os detalhes específicos (nomes de registro, instruções) variam com base na arquitetura de hardware.