segunda-feira, julho 18, 2011

Arduino: O Bootloader

No meu primeiro post sobre o Arduino eu mencionei a necessidade de ter um software chamado bootloader gravado no microcontrolador; no post anterior eu falei um pouco sobre a memória Flash onde precisa estar gravado o código executável. Vamos agora juntar estas duas informações e ver em mais detalhes o que é e como funciona o Bootloader.

Uma vez que todo software a ser executado no AVR precisa estar na Flash, o programa feito na IDE do Arduino (sketch) precisa ser gravado lá. Para dispensar o uso de um gravador externo, a gravação da Flash é feita por um software que reside nela própria, o Bootloader. O Bootloader é o primeiro software executado pelo microcontrolador após um Reset (Boot) e carrega na Flash um software que recebe pela serial (loader).

O ATmega328 possui alguns recursos que facilitam (ou complicam?) isto:
  • A memória Flash pode ser dividida em duas seções, um bootloader (no final da memória, com 512, 1024, 2048 ou 4096 bytes) e uma aplicação (com o restante). Na seção do bootloader pode ser usada a instrução SPM, capaz de reprogramar toda a Flash.
  • Independente disto, existe uma outra divisão em duas seções de tamanho fixo, a RWW (Read While Write, os primeiros 28K) e a NRWW (No Read While Write, os últimos 4K). Enquanto está sendo feito um apagamento ou escrita na região RWW, código pode estar executando na região NRWW. No caso contrário, região NRWW sendo atualizada, o processador fica parado durante a operação.
  • Para fins de apagamento e gravação a Flash é dividida em páginas de 128 bytes. As operações afetam sempre uma página inteira.
Obs.: Os outros microcontroladores usados no Arduino tem recursos semelhantes, porém os números acima podem ser diferentes.

Em termos práticos, um software na seção bootloader pode executar sem parada enquanto a seção de aplicação é atualizada. A seção de bootloader pode se auto-atualizar, porém o processador ficará parado enquanto a operação de completa (e você não vai querer atualizar a página onde está sendo executada a instrução SPM).

No que diz respeito ao protocolo para receber o programa pela serial, o Bootloader utiliza um subconjunto do protocolo usado por um programador externo, o STK-500. Isto permite usar softwares padrão de programação no PC, a IDE do Arduino usa o Avrdude.

Ao longo dos anos o bootloader do Arduino passou por alterações, a versão atual é o chamado Optiboot (bootloader "otimizado"). A otimização consistiu em reduzir o tamanho para caber em 512 bytes, aumentar a velocidade na serial para 19200 e receber os dados de uma página enquanto a apaga. O código pode ser baixado daqui; foram precisos alguns truques para reduzir o tamanho mas ainda dá para entender. Uma das reduções foi suportar somente um mínimo de comandos do STK-500; em particular não há suporte a operações sobre a EEProm ou os fusíveis.

Existe ainda um último ponto importante no bootloader: o seu disparo e o disparo da aplicação. Nas primeiras versões, o bootloader começava a sua execução quando era feito um reset e esperava por um certo tempo uma comunicação antes de iniciar a aplicação. Isto trazia dois inconvenientes: era preciso apertar o botão de reset antes de enviar um sketch e aguardar alguns segundos ao final da carga para ele começar a ser executado.

A primeira limitação foi contornada por hardware: ao detectar uma conexão na serial o microcontrolador é ressetado no Duemilinove e no Uno. Para o segundo inconveniente, o bootloader passou a distinguir a iniciação pelo sinal de reset da re-iniciação ao final da carga de um sketch. No segundo caso o bottoloader passa diretamente para a aplicação, não tentando estabelecer comunicação.

Com estas alterações podem ocorrer problemas quando a aplicação do Arduino utiliza comunicação serial. De um lado pode ocorrer uma re-iniciação devido a uma conexão (retirando o controle da aplicação e passando ao bootloader) e por outro o bootloader pode ficar tentando tratar uma comunicação destinada à aplicação e nunca passar o controle para ela. Provavelmente veremos estes problemas quando eu for tentar usar o Arduino como um gravador de AVR.

5 comentários:

Tadeu Aldrigue disse...

Parabens pelos posts. Muito útil sua página.

Daniel Quadros disse...

Obrigado, fico feliz que esteja sendo útil.

Bruno Dermario disse...

Muito bom seu blog, parabens!

Algumas vezes, quando estou me comunicando serialmente com o Arduino, a conecção trava e os dois led's Tx e Rx ficam acessos initerruptamente. Para resolver o problema tenho que resetar o Arduino. Vc achedita que isso seja causado pelo BootLoader?

Obrigado pela atenção!

Daniel Quadros disse...

Bruno,

Não me parece muito provável, já que o bootloader só é ativado por Reset. Eu examinaria primeiro se não existe algum erro no programa rodando no Arduino.

Ronaldinho disse...

Muito bom o texto. Alias parabéns pelo blog, não conhecia e vim parar aqui a procura de uma informação melhor sobre bootloader, acabei achando um mundo de informações uteis.