Pular para conteúdo

Aula 08 - Interrupções de Hardware (ISR) e Tratamento Assíncrono ⚙️

Objetivo Pedagógico

Objetivo: Mecanismo de interrupção externa (EXTI), vetor de interrupções (NVIC), salvamento de contexto, prioridades e boas práticas de projeto em rotinas ISR.


📑 1. Fundamentos Teóricos & Conceituação

Mecanismo de interrupção externa (EXTI), vetor de interrupções (NVIC), salvamento de contexto, prioridades e boas práticas de projeto em rotinas ISR. Em projetos de engenharia eletrônica e sistemas computacionais embarcados, a precisão temporal, a contenção de recursos de memória e a confiabilidade contínua são requisitos mandatórios de projeto.

📐 Arquitetura Conceitual & Fluxo de Operação

graph TD
    A["Entrada / Periféricos"] --> B["Interrupções de Hardware (ISR) e Tratamento Assíncrono"]
    B --> C["Processamento e Validação"]
    C --> D["Saída / Atuador / Rede"]

    style A fill:#e3f2fd,stroke:#1565c0
    style B fill:#fff3e0,stroke:#e65100,stroke-width:2px
    style C fill:#e8f5e9,stroke:#2e7d32
    style D fill:#f3e5f5,stroke:#7b1fa2

🔍 Pilares e Princípios de Engenharia

Nesta unidade, exploramos detalhadamente os seguintes conceitos: - ISR (Interrupt Service Routine): Requisito essencial para garantir operação determinística e estável. - Vetor de Interrupções: Requisito essencial para garantir operação determinística e estável. - Context Switching: Requisito essencial para garantir operação determinística e estável. - Flag Pattern: Requisito essencial para garantir operação determinística e estável. - Latência de Interrupção: Requisito essencial para garantir operação determinística e estável.


🛠️ 2. Implementação Técnica & Código em C/C++

Abaixo está o exemplo prático estruturado de acordo com as normas de desenvolvimento bare-metal / FreeRTOS para a família estudada:

// Tratamento seguro de interrupção externa via Flag Pattern
#include <stdint.h>
#include <stdbool.h>

volatile bool g_button_event = false;

// Rotina de Serviço de Interrupção (ISR) - Deve ser o mais rápida possível!
void IRAM_ATTR gpio_isr_handler(void* arg) {
    g_button_event = true; // Sinaliza a tarefa principal, sem delays ou printf
}

void processar_eventos(void) {
    if (g_button_event) {
        g_button_event = false;
        // Executa processamento pesado fora da ISR
        acionar_rele_seguranca();
    }
}

💡 Análise Passo a Passo do Código

  1. Configuração de Registradores / Drivers: O hardware é parametrizado antes da ativação das interrupções globais.
  2. Tratamento Seguro: Utilização de tipos com largura fixa (uint8_t, uint32_t) da biblioteca <stdint.h> para garantir portabilidade entre arquiteturas de 8, 16 e 32 bits.
  3. Eficiência e Baixo Consumo: Minimização de ciclos de clock desperdiçados e liberação do barramento para outros periféricos.

🎯 3. Próximos Passos & Sequência Prática