Qualcuno può spiegare come funziona il bootloader di Arduino ? Non sto cercando una risposta di alto livello qui, ho letto il codice e ne ho capito. Ho anche letto questo altro post (ero stato anche uno dei rispondenti).
Esiste una serie di interazioni di protocollo tra l'IDE di Arduino e il codice del bootloader, che alla fine si traducono in una serie di istruzioni di assemblaggio in linea che programmano automaticamente il flash con il programma trasmesso sull'interfaccia seriale.
Quello su cui non sono chiaro è sulla linea 270:
void (*app_start)(void) = 0x0000;
... che riconosco come dichiarazione e inizializzazione su NULL di un puntatore a funzione. Esistono chiamate successive a app_start in luoghi in cui il bootloader è destinato a delegare l'esecuzione del codice caricato dall'utente.
Sicuramente, in qualche modo ha app_start
bisogno di ottenere un valore non NULL ad un certo punto perché tutto questo si unisca. Non lo vedo nel codice del bootloader ... è magicamente collegato dal programma che viene caricato dal bootloader? Presumo che il principale del bootloader sia il punto di ingresso nel software dopo un reset del chip.
Avvolto nel 70 o giù di lì le linee di assemblaggio devono essere l'anello del decodificatore segreto che dice al programma principale dove si trova davvero app_start? O forse è una conoscenza implicita sfruttata dall'IDE di Arduino? Tutto quello che so è che se qualcuno non cambia app_start per puntare in un posto diverso da 0, il codice del bootloader girerebbe su se stesso per sempre ... quindi qual è il trucco?
In una nota a parte, sarebbe possibile che il codice del bootloader si basasse su interrupt o è un no-no?
modificare
Sono interessato a provare a trasferire il bootloader su un piccolo AVR (in particolare ATTiny44A) che non ha spazio di memoria separato per il codice del boot loader. Dato che mi sembra evidente che il codice del bootloader si basa su determinate impostazioni dei fusibili e sul supporto del chip, immagino che ciò che veramente mi interessa sapere sia cosa serve per portare il bootloader su un chip che non ha quei fusibili e hardware supporto (ma ha ancora capacità di autoprogrammazione)?
Pensavo di poter usare l'implementazione di AVR307 per usare l'USI come UART half-duplex (usa l'interrupt Timer0 e l'interrupt di cambio pin). Qualcuno può offrire indicazioni su come scrivere / eseguire il porting del codice del bootloader per un chip che non ha il supporto hardware per i bootloader?
Presumo che metterei il mio codice bootloader nella posizione normale per l'indirizzo main (es. 0x029e o ovunque il compilatore metta main). Vorrei quindi fare in modo che "indirizzo" nel codice del bootloader aggiungesse un offset che mi mettesse appena oltre la fine di main e che "app_start" fosse impostato su quell'indirizzo. Ci sto pensando correttamente o mi sto perdendo qualcosa? Grazie!
MODIFICA 2
FWIW, ho trovato un processo documentato su come caricare gli schizzi di Arduino su un ATTiny85 , che è dove stavo andando originariamente con questa domanda ... piuttosto pulito penso