Detalhes do carregador de inicialização do Arduino

11

Alguém pode explicar como o gerenciador de inicialização do Arduino funciona? Não estou procurando uma resposta de alto nível aqui, li o código e entendi a essência. Também li este outro post (eu até mesmo fui um dos respondentes).

Existe muita interação de protocolo que ocorre entre o Arduino IDE e o código do carregador de inicialização, resultando em várias instruções de montagem em linha que auto-programam o flash com o programa sendo transmitido pela interface serial.

O que não estou claro está na linha 270:

void (*app_start)(void) = 0x0000; 

... que reconheço como a declaração e a inicialização para NULL de um ponteiro de função. Existem chamadas subseqüentes para app_start em locais onde o carregador de inicialização se destina a delegar para a execução do código carregado pelo usuário.

Certamente, de alguma forma, é app_startnecessário obter um valor não NULL em algum momento para que tudo se reúna. Não estou vendo isso no código do carregador de inicialização ... ele está magicamente vinculado pelo programa que é carregado pelo carregador de inicialização? Presumo que o principal do gerenciador de inicialização seja o ponto de entrada no software após uma redefinição do chip.

Embrulhado em mais ou menos 70 linhas de montagem deve estar o anel decodificador secreto que informa ao programa principal onde o app_start realmente está? Ou talvez algum conhecimento implícito esteja sendo aproveitado pelo IDE do Arduino? Tudo o que sei é que, se alguém não alterar app_start para apontar para outro lugar que não 0, o código do gerenciador de inicialização giraria sobre si mesmo para sempre ... então qual é o truque?

Em uma nota separada, seria possível que o código do carregador de inicialização se baseie em interrupções ou isso é um não-não?

Editar

Estou interessado em tentar portar o carregador de inicialização para um AVR minúsculo (especificamente o ATTiny44A) que não possui espaço de memória separado para o código do carregador de inicialização. Como fica claro para mim que o código do carregador de inicialização se baseia em determinadas configurações de fusíveis e suporte a chips, acho que o que realmente me interessa é o que é necessário para portar o carregador de inicialização em um chip que não possui esses fusíveis e hardware suporte (mas ainda tem capacidade de auto-programação)?

Eu estava pensando que poderia usar a implementação do AVR307 para usar o USI como um UART half-duplex (usa interrupção Timer0 e interrupção de troca de pinos). Alguém pode oferecer orientações sobre como escrever / portar o código do gerenciador de inicialização para um chip que não possui suporte de hardware para os gerenciadores de inicialização?

Eu presumo que colocaria meu código do carregador de inicialização no local normal para o endereço principal (por exemplo, 0x029e ou onde quer que o compilador coloque o main). Em seguida, eu faria isso para que 'endereço' no código do carregador de inicialização adicionasse um deslocamento que me colocasse logo após o final do main e que 'app_start' estivesse definido para esse endereço. Estou pensando nisso corretamente ou estou totalmente perdendo alguma coisa? Obrigado!

EDIT 2

FWIW, eu encontrei um processo documentado de como carregar esboços do Arduino em um ATTiny85 , que é onde eu originalmente estava indo com essa pergunta ... bem legal, eu acho

vicatcu
fonte
1
stackoverflow.com/questions/3652233/arduino-bootloader/... Foi perguntando onde minha resposta foi ...
Nick T

Respostas:

12
void (*app_start)(void) = 0x0000; 

Este não é um ponteiro NULL. Este é realmente o endereço do início do código do aplicativo, para o qual o carregador de inicialização salta. O vinculador organiza para que o código do seu aplicativo comece no endereço 0. Consulte a tabela 26-6 na folha de dados do ATMEGA168.

O código do carregador de inicialização inicia mais alto no flash. Exatamente onde depende dos fusíveis do carregador de inicialização.

Toby Jaffey
fonte
onde faz bootloader reside código principal, então ...
vicatcu
1
@Joby, ah ok ... veja a atualização para minha pergunta - Estou interessado em tentar portar o gerenciador de inicialização para um AVR minúsculo que não possui espaço de memória separado para o código do gerenciador de inicialização.
vicatcu 6/09/10
1
@Joby, para que o código do carregador de inicialização dependa de "... o Fusível de Reinicialização da Inicialização pode ser programado para que o Vetor de Reinicialização aponte para o endereço de inicialização do Flash da Inicialização após uma reinicialização. Nesse caso, o Carregador de Inicialização é iniciado após uma reinicialização. "
vicatcu 6/09/10
3
Você queria especificamente o gerenciador de inicialização do Arduino? Emula um programador STK500 e, como tal, é um pouco volumoso. Há uma versão atmega8 no diretório dos gerenciadores de inicialização que compila abaixo de 1K com o gcc-3, mas mesmo isso deixará você bastante curto no flash disponível.
Peter Gibson
3
você realmente quer mesmo um gerenciador de inicialização? certamente para uma ATTINY vale a pena mais provável o seu esforço para programar o dispositivo usando um programador ICSP (como o usbTinyISP)
SingleNegationElimination