Dettagli Arduino Bootloader


11

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_startbisogno 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


1
stackoverflow.com/questions/3652233/arduino-bootloader/… Mi chiedevo dove fosse finita la mia risposta ...
Nick T

Risposte:


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

Questo non è un puntatore NULL. Questo è davvero l'indirizzo dell'inizio del codice dell'applicazione, a cui salta il bootloader. Il linker organizza che il codice dell'applicazione inizi all'indirizzo 0. Vedere la tabella 26-6 nella scheda tecnica ATMEGA168.

Il codice del bootloader si avvia più in alto in flash. Esattamente dove dipende dai fusibili del bootloader.


dove risiede il codice principale del bootloader quindi ...
vicatcu,

1
@Joby, ah ok ... vedi l'aggiornamento alla mia domanda - Sono interessato a provare a trasferire il bootloader su un piccolo AVR che non ha spazio di memoria separato per il codice del boot loader.
vicatcu,

1
@Joby, quindi il codice del bootloader si basa su "... il fusibile di ripristino avvio può essere programmato in modo che il vettore di ripristino punti all'indirizzo di avvio Boot Flash dopo un ripristino. In questo caso, il caricatore di avvio viene avviato dopo un ripristino. "
vicatcu,

3
Volevi specificamente il bootloader di Arduino? Emula un programmatore STK500 e come tale è piuttosto voluminoso. Esiste una versione atmega8 nella directory bootloader che si compila sotto 1K con gcc-3, ma anche questo ti lascerà abbastanza corto sul flash disponibile.
Peter Gibson,

3
vorresti davvero un boot loader? sicuramente per un ATTiny è più probabile che valga la pena di programmare il dispositivo utilizzando un programmatore ICSP (come usbTinyISP)
SingleNegationElimination
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.