Anatomia do Arduino Bootloader Fábio Olivé (fabio.olive@gmail.com)
Tópicos A plataforma Arduino A família Atmel AVR ATmega Padronização da configuração e uso do ATmega Detalhando o ATmega328P Especificações técnicas Registradores de controle e layout da memória O papel do bootloader O que o microcontrolador faz quando é ligado? Quais funcionalidades o bootloader implementa? Conversando com o bootloader pela serial
A plataforma Arduino
A Família Atmel AVR ATmega µcontroladores RISC de 8bits, contendo: 32 registradores de 8bits de uso geral Memória de programa em Flash Arquitetura Harvard, programa separado dos dados Códigos de operação de 16bits (estilo RISC, tamanho fixo) Memória SRAM para registradores, controle, periféricos Memória EEPROM para retenção de dados Várias funções selecionáveis de I/O por pino Cada pino é uma surpresa!
Padronização de Uso do ATmega Simplificação da configuração do µcontrolador Define usos padronizados para cada pino Define formas de identificar cada pino Simplificação da linguagem de programação C++ facilitado, pré-processado para gerar o programa final Abundância de bibliotecas padronizadas Padronização de layouts e barramentos de I/O Padronização do bootloader e gravação da flash Desvantagem: perde um pouco na eficiência do código e na flexibilidade do uso
Detalhando o ATmega328P
ATmega328P
Especificações Técnicas 32KB de memória de programa em flash Organizado em 16K palavras de 16bits Separado entre área de aplicação e área de boot (final) Área de boot pode ter 2KB, 1KB ou 512B (optiboot) 2KB de Static RAM para dados e registradores Registradores de uso geral, de controle e I/O e RAM todos no mesmo espaço de endereçamento Estranho mas interessante :-) Arquitetura Harvard, e só a flash é vista como memória de programa (não executa a RAM)
Pinagem do ATmega328P
Pinagem padronizada pelo Arduino
Registradores de Controle Regiões de memória que afetam o funcionamento e a configuração do µcontrolador Funções de I/O como porta serial, seleção de direção dos pinos de I/O, seleção do canal analógico, etc PinMode(8, OUTPUT), por exemplo, muda alguns bits em registradores de controle que habilitam o pino PB0 para funcionar como saída Acesso a timers, interface de leitura e escrita na EEPROM, etc É a parte mágica do ATmega328P, que define como ele interage com o mundo externo :-)
Layout da Memória FLASH Vetores de Int Aplicação 0000h 0068h SRAM Registradores Registradores de Controle e I/O 0000h 0020h 0100h Boot 7800h 7e00h 7fffh RAM Dados e Pilha 08ffh
O papel do bootloader
O que o 328P faz quando é ligado? Inicializa todos os pinos como INPUT Inicializa registradores de controle e status Identifica fusíveis de configuração básica Incluindo onde começa o bootloader Inicializa SRAM e Stack Pointer Executa o bootloader A partir daqui é só software
Funcionalidades do Bootloader Configurar o µcontrolador de acordo com a especificação da plataforma Arduino Identificar comandos de programação Identificar o µcontrolador (modelo, etc) Realizar inicialização da plataforma Executar (saltar para) a aplicação gravada na flash Atualmente o Arduino usa o optiboot, que é muito simplificado e ocupa apenas 512 bytes
Falando com o Bootloader pela Serial Protocolo STK500 Funções bastante básicas Identificação do µcontrolador (modelo, etc) Configuração de fusíveis e bits persistentes de controle Leitura e gravação das memórias Programa especializado: avrdude
Conhecendo o Optiboot Demonstração prática :-)
Referências http://arduino.cc/en/hacking/bootloader http://code.google.com/p/optiboot/ http://www.atmel.com/devices/atmega328p.aspx AVR Instruction Set Reference http://www.atmel.com/images/doc0856.pdf STK500 Communication Protocol http://www.atmel.com/images/doc2591.pdf