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_start
necessá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