O Que é uma Máscara de Interrupção?
Uma máscara de interrupção é um mecanismo de hardware ou software que desabilita temporariamente (mascara) uma ou mais fontes de interrupção, impedindo-as de interromper a CPU. Funciona como um porteiro: quando o bit de máscara de uma interrupção está setado, a CPU ignora aquela solicitação; quando limpo, a interrupção é habilitada e pode disparar uma rotina de serviço de interrupção (ISR).
Por Que o Mascaramento é Necessário?
O mascaramento de interrupções é essencial para vários cenários críticos:
- Proteção de Seções Críticas: Ao executar código que não deve ser interrompido (ex.: atualização de estruturas de dados compartilhadas, modificação de registradores de hardware, troca de contexto), o mascaramento garante execução atômica.
- Tratamento Previsível de Interrupções: Mascarando seletivamente interrupções de menor prioridade durante execução de ISR de alta prioridade, você impõe esquema de prioridade determinístico.
- Gerenciamento de Recursos: Previne condições de corrida em periféricos ou buffers de memória compartilhados acessados tanto pelo código principal quanto por ISRs.
- Gerenciamento de Energia: Mascarar interrupções de wake-up desnecessárias durante modos de baixa potência evita wake-ups espúrios.
- Depuração & Testes: Permite desenvolvedores isolar caminhos de código desabilitando temporariamente fontes de interrupção específicas.
Como Funcionam as Máscaras de Interrupção?
Tipicamente, cada fonte de interrupção tem bit correspondente em um Registrador de Máscara de Interrupção (IMR) ou Registrador de Habilitação de Interrupção (IER):
- Bit de máscara = 1 (setado) → Interrupção desabilitada (mascarada).
- Bit de máscara = 0 (limpo) → Interrupção habilitada.
A CPU verifica este registrador antes de reconhecer uma interrupção. Em muitas arquiteturas (ARM Cortex-M, AVR, x86), há instruções globais de habilitar/desabilitar interrupções (ex.: CPSID I/CPSIE I, cli/sti) e registradores de máscara por interrupção para controle granular.
Quais Interrupções Podem Ser Mascaradas?
A granularidade do mascaramento varia por arquitetura:
- Mascaramento global: Desabilita todas as interrupções mascaráveis de uma vez (interrupções não-mascaráveis, NMIs, não podem ser mascaradas).
- Mascaramento por periférico: Cada periférico (UART, timer, ADC, GPIO, etc.) tem seu bit de habilitação em controlador de interrupção central (ex.: NVIC no ARM, PIC/APIC no x86).
- Mascaramento baseado em prioridade: Alguns controladores (como NVIC do ARM) permitem mascarar por nível de prioridade (ex.: registrador
BASEPRI), habilitando todas interrupções acima de certa prioridade enquanto desabilita as menores.
Melhores Práticas
- Mantenha regiões mascaradas o mais curtas possível para minimizar latência de interrupção.
- Prefira mascaramento por interrupção a desabilitação global quando apenas fontes específicas precisam ser bloqueadas.
- Sempre reabilite (desmascare) interrupções no mesmo caminho de execução, incluindo manipuladores de erro/exceção.
- Use leitura-modificação-escrita atômica ou registradores dedicados set/clear para evitar condições de corrida ao modificar bits de máscara.
O mascaramento adequado de interrupções é pedra angular de design de firmware embarcado confiável e em tempo real.