Aula 01 - Arquitetura de Computadores, Microprocessadores vs. Microcontroladores


1. Visão Geral e Evolução Histórica da Computação Embarcada

A evolução dos sistemas computacionais foi impulsionada pela miniaturização dos circuitos integrados monolíticos de silício. Historicamente, os primeiros computadores eletrônicos operavam com dezenas de placas de circuitos discretos e válvulas termoionicas, evoluindo na década de 1970 para o primeiro microprocessador comercial de chip único do mundo — o Intel 4004 (4 bits, 1971) e o célebre Intel 8080 (8 bits, 1974).

No entanto, a criação de sistemas dedicados para controle de processos físicos e automação industrial revelou uma cisão tecnológica fundamental entre duas filosofias construtivas distintas: os Microprocessadores de Propósito Geral (Microprocessors - ) e os Microcontroladores (Microcontrollers - ).


2. Paradigmas de Arquitetura: Von Neumann vs. Harvard

A organização de barramentos (buses) de comunicação entre a Unidade Central de Processamento (UCP) e o subsistema de memória define o desempenho e a vazão máxima de instruções (throughput):

2.1 A Arquitetura Von Neumann e o Gargalo Clássico

No modelo de John von Neumann (1945), dados de variáveis e instruções executáveis compartilham exatamente a mesma estrutura física de memória e os mesmos barramentos de endereço e de dados. Consequentemente:

  • Uma operação que exige leitura de operando em memória demanda no mínimo dois ciclos sequenciais de barramento: o ciclo de busca da instrução (Instruction Fetch) e o subsequente ciclo de busca do operando (Data Fetch).
  • Essa restrição física é consagrada na literatura como o Gargalo de Von Neumann (Von Neumann Bottleneck), limitando a velocidade de processamento pela largura de banda da memória.

2.2 A Arquitetura Harvard e o Pipelining em Microcontroladores

Concebida no desenvolvimento do computador Harvard Mark I, esta arquitetura isola física e logicamente a memória de programa da memória de dados:

  • O barramento de endereços e o barramento de dados de instrução são independentes do barramento de dados de memória RAM.
  • Larguras de Palavra Assimétricas: Em microcontroladores como a família PIC16F, a memória de instruções possui palavras de de largura, permitindo que o código de operação (opcode) e o endereço literal do operando residam na mesma palavra, enquanto a memória RAM de dados opera em palavras padrão de .
  • Sobreposição em Pipeline (Pipelining): Enquanto a UCP decodifica e executa a instrução manipulando registradores na RAM, o barramento de instruções busca concorrentemente a instrução na memória Flash. Desta forma, a grande maioria das instruções de máquina é executada em um único ciclo de instrução ().

3. Conjuntos de Instruções: CISC vs. RISC

A filosofia de projeto do repertório de instruções que a UCP é capaz de decodificar e processar divide-se em duas vertentes:

Em sistemas embarcados em tempo real, a arquitetura RISC prevalece amplamente devido à simplicidade da lógica cabeada, menor consumo de silício e, fundamentalmente, previsibilidade matemática determinística: o projetista sabe exatamente quantos ciclos de máquina cada instrução consome.


4. Arquitetura Interna da Unidade Central de Processamento (UCP)

A UCP do microcontrolador orquestra o ciclo perpétuo de Busca (Fetch), Decodificação (Decode) e Execução (Execute). Seus módulos constituintes são detalhados a seguir:

4.1 O Contador de Programa (PC) e a Pilha (Stack)

O Contador de Programa (Program Counter - PC) armazena o endereço da memória de programa que contém a próxima instrução a ser buscada. Na família PIC16F877A, por exemplo, o PC possui , permitindo endereçar diretamente palavras de programa ().

Quando ocorre uma chamada de sub-rotina (CALL) ou uma interrupção de hardware:

  1. O endereço de retorno () é empilhado (PUSH) automaticamente em uma Pilha de Hardware (Hardware Stack) de múltiplos níveis (8 níveis no PIC16F e 31 níveis no PIC18F);
  2. O PC é carregado com o endereço da sub-rotina ou com o vetor de interrupção ();
  3. Ao término, a instrução de retorno (RETURN ou RETFIE) desempilha (POP) o endereço de volta para o PC, retomando a execução do fluxo principal.

CAUTION

A pilha de hardware em núcleos RISC básicos opera de forma circular e não possui verificação automática de limite. Se o software aninhar chamadas de funções recursivas em profundidade superior ao número físico de níveis, ocorre o temido Stack Overflow, sobrescrevendo os endereços mais antigos e provocando travamento irreversível do sistema!

4.2 A Unidade Lógica e Aritmética (ULA) e o Registrador de Trabalho (WREG)

A ULA de 8 bits executa operações aritméticas fundamentais (soma, subtração, incremento, decremento) e operações lógicas booleanas (AND, OR, XOR, deslocamentos e rotações de bits através do Carry).

Em microcontroladores PIC, um dos operandos da ULA deve ser obrigatoriamente o registrador acumulador WREG (Working Register). O resultado da operação pode ser direcionado por projeto de volta para o WREG () ou para o próprio registrador de arquivo na memória RAM (), governado pelo bit de destino contido no opcode:

4.3 O Registrador de Estado (STATUS)

O registrador especial STATUS (endereço na RAM) armazena os flags aritméticos resultantes da última operação processada pela ULA:

  • Bit 2 - Zero (): Setado em se o resultado da operação for exatamente zero; limpo em caso contrário.
  • Bit 1 - Digit Carry (): Setado em se houver transporte do bit 3 para o bit 4 (nibble inferior), essencial para aritmética decimal BCD.
  • Bit 0 - Carry/Borrow (): Setado em se houver transporte para fora do bit 7 mais significativo em somas, ou se não houver empréstimo em subtrações.
  • Bits 6:5 - RP1:RP0: Seleção de banco da memória RAM (Banco 0, 1, 2 ou 3).

5. Base de Tempo e Ciclo de Máquina ()

A base de tempo de um microcontrolador é fornecida por um circuito oscilador alimentado por cristal de quartzo piezoelétrico, ressonador cerâmico ou circuito RC interno configurado nos fusíveis de programação (Configuration Bits):

Internamente, a frequência de clock é dividida por quatro () por um divisor de quadratura de fase que gera quatro sinais internos de relógio defasados de : e . O período desses quatro pulsos combinados constitui o Ciclo de Máquina ou Ciclo de Instrução ():

Exemplo Numérico de Cálculo Temporal:

Para um microcontrolador com cristal de quartzo clássico de : A taxa de execução de instruções atinge:

  • Instruções Lineares de 1 ciclo (): Executam em exatos (ex: MOVF, ADDWF, BSF, BCF).
  • Instruções de Salto de 2 ciclos (): Desvios de fluxo (GOTO, CALL, RETURN, ou saltos condicionais como BTFSS quando o teste é verdadeiro) forçam o esvaziamento (flush) da instrução previamente buscada em pipeline, exigindo um ciclo nulo adicional ().

6. Organização e Mapeamento da Memória RAM (Bancos de Memória)

A memória SRAM interna é mapeada como uma matriz contígua de registradores de 8 bits dividida em bancos lógicos para contornar a limitação de bits de endereço no formato da instrução. Cada banco divide-se estruturalmente em:

  1. Registradores de Funções Especiais (SFR - Special Function Registers): Ocupam os endereços baixos de cada banco e controlam diretamente o hardware periférico (portas I/O, temporizadores, conversores analógico-digitais, módulos de comunicação e interrupção).
  2. Registradores de Propósito Geral (GPR - General Purpose Registers): Memória RAM estática livre para o programador armazenar variáveis, matrizes e dados dinâmicos do firmware.

7. Diagrama Arquitetural Consolidado

O diagrama técnico vetorial a seguir ilustra a comparação detalhada entre as arquiteturas Von Neumann e Harvard, com destaque para a segregação de barramentos e a estrutura interna dos registradores e blocos funcionais da UCP:

Arquitetura Harvard vs Von Neumann e UCP


8. Exercícios Resolvidos e Aplicações em Concursos

Exercício 1 (Petrobras - Engenharia de Telecomunicações / CESGRANRIO)

Enunciado: Um sistema de monitoração de vibração mecânica baseado em microcontrolador de arquitetura Harvard RISC opera com cristal oscilador de . O microcontrolador consome 4 ciclos de oscilador para cada ciclo de instrução (). Uma rotina de interrupção em código Assembly que executa a leitura de um canal e armazena em buffer é composta rigorosamente por:

  • instruções lineares de ;
  • instruções de desvio/salto condicional de ;
  • instrução de retorno de interrupção (RETFIE) de .

Calcule:

  1. O período do ciclo de máquina e a capacidade nominal de processamento em MIPS.
  2. O tempo exato em microssegundos consumido para executar integralmente a rotina de interrupção.
  3. A taxa máxima teórica de requisições de interrupção por segundo que o processador suportaria se dedicasse do seu tempo exclusivamente a essa rotina.

Resolução Passo a Passo:

  1. Cálculo de e MIPS:

  2. Tempo Total de Execução da Rotina ISR: Total de ciclos de máquina consumidos: Tempo total da rotina:

  3. Taxa Máxima de Interrupções por Segundo:


Exercício 2 (Marinha do Brasil - Corpo de Engenheiros)

Enunciado: Explique fundamentadamente por que a arquitetura Harvard associada ao conjunto de instruções RISC permite implementar a técnica de pipelining de 2 estágios em microcontroladores de forma substancialmente mais eficiente do que uma arquitetura Von Neumann CISC. Demonstre o impacto de um desvio de fluxo incondicional (GOTO) sobre o desempenho do pipeline.

Resolução Analítica e Conceitual:

  1. Independência de Barramentos na Arquitetura Harvard: Na arquitetura Harvard, os barramentos de memória de instruções (Flash) e de memória de dados (RAM) são completamente segregados. Isso viabiliza o paralelismo temporal estrito: durante o intervalo de tempo do ciclo , a UCP utiliza o barramento de dados para ler ou escrever operandos na memória RAM correspondentes à instrução , enquanto simultaneamente e de forma independente o barramento de programa busca a próxima instrução na Flash ROM.
  2. Homogeneidade e Tamanho Fixo das Instruções RISC: Em arquiteturas RISC, todas as instruções possuem exatamente o mesmo comprimento físico de palavra (ex: 14 bits no PIC16, 16 bits no AVR). Isso elimina a necessidade de múltiplos ciclos de busca para decodificar o tamanho da instrução (típico do CISC x86), permitindo que a decodificação seja realizada por lógica booleana cabeada instantânea em vez de microrotinas sequenciais lentas.
  3. Impacto do Desvio de Fluxo (GOTO / CALL): O pipeline antecipa a busca da instrução subsequente linear (). Quando a instrução executada é um salto (GOTO k), o fluxo linear é quebrado: a instrução previamente buscada torna-se inválida e deve ser descartada do registrador de instrução. A UCP é forçada a executar uma bolha no pipeline (pipeline stall ou flush), consumindo um ciclo nulo enquanto o novo endereço é carregado no PC e a instrução de destino é buscada. Por essa razão, em processadores RISC:
    • Instruções que não alteram o PC consomem exatamente ;
    • Instruções de desvio que carregam novo endereço no PC consomem obrigatoriamente .