Pular para conteúdo

Exercícios da Aula 02: Famílias de Microcontroladores e Ambiente de Desenvolvimento 🏋️

Orientações

Resolva as questões práticas implementando os algoritmos em linguagem C/C++ para sistemas embarcados. Após tentar solucionar individualmente, consulte o Gabarito Explicado para conferir a justificativa técnica e o código recomendado.


🟢 Nível 1: Básico (Conceitual e Sintaxe)

  1. Explique por que a arquitetura Harvard é amplamente preferida em microcontroladores de tempo real em comparação com a arquitetura Von Neumann.
  2. No contexto de Famílias de Microcontroladores e Ambiente de Desenvolvimento, qual é a função essencial do modificador volatile ao declarar ponteiros para registradores mapeados em memória?

🟡 Nível 2: Intermediário (Aplicação e Cálculos)

  1. Suponha um microcontrolador operando a 16 MHz. Calcule o valor do Prescaler necessário para que um timer de 16 bits gere um overflow a cada 10 milissegundos.
  2. Desenvolva um trecho de código em C que configure uma máscara de bits para ligar o pino GPIO 5 sem alterar o estado dos outros pinos no registrador de saída.

🔴 Nível 3: Desafio Técnico (Engenharia de Firmware)

  1. Projete uma função completa em C com tratamento de concorrência que implemente a rotina principal para Famílias de Microcontroladores e Ambiente de Desenvolvimento, garantindo tratamento de erros e sem bloqueio excessivo da CPU.

📚 Gabarito e Soluções Comentadas

Gabarito Explicado ### Questão 1: Arquitetura Harvard vs. Von Neumann - **Fundamentação:** A arquitetura Harvard possui barramentos físicos separados para memória de programa (Flash) e memória de dados (SRAM). - **Vantagem Técnica:** Permite a busca simultânea da próxima instrução e a leitura/escrita de operandos de dados no mesmo ciclo de clock, eliminando o gargalo de Von Neumann e proporcionando execução estritamente determinística. ### Questão 2: Papel do Modificador `volatile` - **Fundamentação:** O modificador `volatile` instrui o compilador C a desabilitar otimizações de cache em registradores da CPU para aquela variável ou endereço de memória. - **Justificativa:** Como registradores de hardware periférico podem mudar de valor espontaneamente sem ação direta do software, a cada leitura o compilador é obrigado a acessar o endereço físico real na memória. ### Questão 3: Cálculo de Prescaler de Timer - **Cálculo:** Para uma frequência de 100 Hz (período de 10 ms) com clock de 16 MHz e timer de 16 bits (limite de 65.535 ticks): Com Prescaler = 64: Frequência do timer = 16.000.000 / 64 = 250.000 Hz. Contagem para 10 ms = 250.000 * 0,01 s = 2.500 ticks. - **Conclusão:** Configura-se Prescaler = 64 e valor de recarga (ARR) = 2.500. ### Questão 4: Manipulação de Bits para GPIO
// Ativa GPIO 5 mantendo os demais pinos inalterados
#define GPIO_OUT_REG (*(volatile uint32_t*)0x3FF44004UL)
#define PIN_NUM 5

void ligar_gpio5(void) {
    GPIO_OUT_REG |= (1UL << PIN_NUM); // Operação OR bit a bit com máscara
}
### Questão 5: Implementação do Desafio Técnico
// Implementação profissional de Famílias de Microcontroladores e Ambiente de Desenvolvimento
#include <stdint.h>
#include <stdbool.h>

bool processar_unidade_02(void) {
    if (!hardware_ready()) {
        return false;
    }
    // Execução da rotina com integridade
    return true;
}