boot loader: come funziona

Ciao, volevo fare una domanda a tempo perso, che potrebbe rivelarsi utile in seguito.

Esattamente come lavora il boot-loader? so che comunica con avr-dure, ma esattamente cosa si dicono? esiste un modo per redirigire l'output di avrdude su un file per analizzarlo? o esiste una documentazione dalla quale partire a capirci qualcosa?

C'hai una domanda di riserva? Nel pacchetto IDE c'é il Bootloader solo come file HEX oppure anche il sorgente in assembler? Ciao Uwe

speravo più che fosse una documentazione di avr-dude... so dove posso trovare il sorgente del boot-loader e quello di avr-dude, ma sarebbe un bello sbattimento e non si concilia bene con il fatto di essere una domanda "a tempo perso". Però se venisse risposta permetterebbe di scrivere boot-loader per qualsiasi tipo di micocontrollore supportato da avr-gcc, e modificando l'ide pure oltre...

alcuni sono già supportati, altri no. e comunque sto parlando anche di differenti architetture; persino i pic potrebbero essere candidati! bisognerebbe probabilmente cambiare il compilatore, ma una volta generato l’hex avr-dude se non erro uppa in RAW mode, e quindi se ne frega del contenuto di ciò che uppa. l’importante è che ci sia un boot-loader pronto a caricare.

ora sto leggendo il boot loader della maple che va direttamente di USB: maple-bootloader/dfu.c at d329633e1c886e89514092cb97f3058d2acc9696 · leaflabs/maple-bootloader · GitHub

quì quello ufficiale di arduino 168 e co: http://code.google.com/p/arduino/source/browse/trunk/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168.c

e CREDO arduino UNO: http://code.google.com/p/arduino/source/browse/trunk/hardware/arduino/bootloaders/bt/ATmegaBOOT_168.c

però quello di arduino non capisco come mai un pezzo (che se non erro scrive sulla flash i dati ricevuti) sia fatto in ASM, quando tutto il resto è in C

Sti giovini dovevano nascere quando c'era lo Z80, così capivano cosa vuol dire risparmiare anche solo una singola istruzione, altro che righe di codice... :D

Bella scoperta!

Lo Z80 era una ALU, una manciata di registri, un Timer e un Bus dati morto di sonno.

Un Processore odierno di media complessità ha una ALU, una FPU, una pipeline, convertitori analogico digitali, comparatori analogici, diversi Timer, porte USART, I2C, SPI, gestori di memoria e memorie di diverso tipo integrate, e magari anche un oscillatore interno.

@lesto: scusami ma avrdude non comunica con il bootloader. avrdude è un programma che accede in lettura/scrittura alle varie memorie di un micro Atmel. Per memoria intendo la flash, la eeprom o i registri interni (fuse). Quando avrdude deve programmare il micro, non si interfaccia con il bootloader ma con l'HW stesso del chip. E' a lui che poi dice dove vuole andare a leggere/scrivere. Difatti puoi usare avrdude anche con un micro che non contiene un bootloader.

Il bootloader è un programma come un altro che diversamente da uno sketch normale risiede in una zona di memoria particolare che il micro può proteggere da sovrascritture indesiderate. Questo bootloader può contenere qualunque codice, anche un blink per 1 led.

Nell'Arduino è stato scelto di scrivere un software che possa interfacciarsi con una comunicazione seriale in arrivo dall'esterno e verificare l'arrivo di uno sketch. Nel caso l'IDE voglia inviare inviare uno sketch, il bootloader sfrutta una proprietà dei micro, ossia la possibilità di scrivere sulla flash in runtime, e può quindi programmare lo sketch senza usare un programmatore esterno.

Ciò detto, il bootloader sfrutta porzioni in assembly per le operazioni che immagino siano time-critical come appunto la scrittura in flash in tempo reale.

bonsai: la flash a bordo dei micro non si programma allo stesso modo non puoi fare a basso livello un bootloader universale

il mio scopo non è creare un boot-loader universale, ma capire cosa devo fare per scriverne uno io per un altro micro, e lasciare una spiegazione per chiunque altro voglia cimentarsi a creare un boot-loader

scusami ma avrdude non comunica con il bootloader. avrdude è un programma che accede in lettura/scrittura alle varie memorie di un micro Atmel. Per memoria intendo la flash, la eeprom o i registri interni (fuse). Quando avrdude deve programmare il micro, non si interfaccia con il bootloader ma con l'HW stesso del chip. E' a lui che poi dice dove vuole andare a leggere/scrivere. Difatti puoi usare avrdude anche con un micro che non contiene un bootloader.

non so, quando uppi uno sketch arduino richiama avr-dude con il comando:

/home/mauro/arduino-0022/hardware/tools/avrdude -C/home/mauro/arduino-0022/hardware/tools/avrdude.conf -v -v -v -v -patmega328p -cstk500v1 -P/dev/ttyS0 -b115200 -D -Uflash:w:/tmp/build48443948887436630.tmp/Blink.cpp.hex:i

quindi è cmq avr-dude che carica lo sketch. che poi possa anche fare altro ci credo, ma credo che il boot-loader fornisca un set di comandi standard necessari da avr-dude.

Ciò detto, il bootloader sfrutta porzioni in assembly per le operazioni che immagino siano time-critical come appunto la scrittura in flash in tempo reale.

sì, confermo, è proprio la parte di scrittua e erase della flash, ma è strana, sembra combinare anche qualcos'altro. Il resto del codice sembra abbastanza semplice a dire la verità..

news: ho messo nel preferencies.txt upload.verbose=true... e sorpresa:

avrdude: Version 5.4-arduino, compiled on Oct 22 2007 at 13:15:12
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/

         System wide configuration file is "/home/mauro/arduino-0022/hardware/tools/avrdude.conf"
         User configuration file is "/home/mauro/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port            : /dev/ttyACM0
         Using Programmer      : stk500v1
         Overriding Baud Rate  : 115200
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
         AVR Part              : ATMEGA328P
         Chip Erase delay      : 9000 us
         PAGEL                 : PD7
         BS2                   : PC2
         RESET disposition     : dedicated
         RETRY pulse           : SCK
         serial program mode   : yes
         parallel program mode : yes
         Timeout               : 200
         StabDelay             : 100
         CmdexeDelay           : 25
         SyncLoops             : 32
         ByteDelay             : 0
         PollIndex             : 3
         PollValue             : 0x53
         Memory Detail         :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65     5     4    0 no       1024    4      0  3600  3600 0xff 0xff
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel STK500 Version 1.x firmware
avrdude: Send: A [41] . [80]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [03] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [81]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [04] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [82]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [04] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [98]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [03] 
avrdude: Recv: . [10] 
         Hardware Version: 3
         Firmware Version: 4.4
avrdude: Send: A [41] . [84]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [03] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [85]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [03] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [86]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [03] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [87]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [03] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [89]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [03] 
avrdude: Recv: . [10] 
         Vtarget         : 0.3 V
         Varef           : 0.3 V
         Oscillator      : 28.800 kHz
         SCK period      : 3.3 us

avrdude: Send: A [41] . [81]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [04] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [82]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [04] 
avrdude: Recv: . [10] 
avrdude: Send: B [42] . [86] . [00] . [00] . [01] . [01] . [01] . [01] . [03] . [ff] . [ff] . [ff] . [ff] . [00] . [80] . [04] . [00] . [00] . [00] . [80] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: E [45] . [05] . [04] . [d7] . [c2] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: P [50]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: AVR device initialized and ready to accept instructions

Reading | avrdude: Send: u [75]   [20] 
avrdude: Recv: . [14] . [1e] . [95] . [0f] . [10] 
################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f
avrdude: Send: V [56] . [a0] . [03] . [fc] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: V [56] . [a0] . [03] . [fd] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: V [56] . [a0] . [03] . [fe] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: V [56] . [a0] . [03] . [ff] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10]

parte di inizializzazione

ed ecco la parte importante… ho eliminato la parte di verica ma è praticamente la stessa

avrdude: reading input file "/tmp/build418400918562861286.tmp/Blink.cpp.hex"
avrdude: writing flash (1024 bytes):

Writing | avrdude: Send: U [55] . [00] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: d [64] . [00] . [80] F [46] . [0c] . [94] a [61] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] . [1f] . [01] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [0c] . [94] ~ [7e] . [00] . [00] . [00] . [00] . [07] . [00] . [02] . [01] . [00] . [00] . [03] . [04] . [06] . [00] . [00] . [00] . [00] . [00] . [00] . [00] . [00] . [01] . [02] . [04] . [08]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
######avrdude: Send: U [55] @ [40] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: d [64] . [00] . [80] F [46] . [10]   [20] @ [40] . [80] . [01] . [02] . [04] . [08] . [10]   [20] . [01] . [02] . [04] . [08] . [10]   [20] . [04] . [04] . [04] . [04] . [04] . [04] . [04] . [04] . [02] . [02] . [02] . [02] . [02] . [02] . [03] . [03] . [03] . [03] . [03] . [03] . [00] . [00] . [00] . [00] # [23] . [00] & [26] . [00] ) [29] . [00] . [00] . [00] . [00] . [00] % [25] . [00] ( [28] . [00] + [2b] . [00] . [00] . [00] . [00] . [00] $ [24] . [00] ' [27] . [00] * [2a] . [00] . [11] $ [24] . [1f] . [be] . [cf] . [ef] . [d8] . [e0] . [de] . [bf] . [cd] . [bf] . [11] . [e0] . [a0] . [e0] . [b1] . [e0] . [e0] . [e0] . [f4] . [e0] . [02] . [c0] . [05] . [90] . [0d] . [92] . [a0] 0 [30] . [b1] . [07] . [d9] . [f7] . [10] . [e0] . [a0] . [e6] . [b0] . [e0] . [01] . [c0] . [1d] . [92] . [a9] 6 [36] . [b1] . [07] . [e1] . [f7] . [0e] . [94] . [f7] . [01] . [0c] . [94] . [fe] . [01] . [0c] . [94] . [00] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
######avrdude: Send: U [55] . [80] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: d [64] . [00] . [80] F [46] . [8d] . [e0] a [61] . [e0] . [0e] . [94] . [c7] . [00] . [08] . [95] . [8d] . [e0] a [61] . [e0] . [0e] . [94] . [e8] . [00] h [68] . [ee] s [73] . [e0] . [80] . [e0] . [90] . [e0] . [0e] . [94] . [93] . [01] . [8d] . [e0] ` [60] . [e0] . [0e] . [94] . [e8] . [00] h [68] . [ee] s [73] . [e0] . [80] . [e0] . [90] . [e0] . [0e] . [94] . [93] . [01] . [08] . [95] . [83] 0 [30] q [71] . [f0] . [84] 0 [30] ( [28] . [f4] . [81] 0 [30] . [a1] . [f0] . [82] 0 [30] ! [21] . [f5] . [14] . [c0] . [86] 0 [30] . [b1] . [f0] . [87] 0 [30] . [d1] . [f0] . [84] 0 [30] . [e9] . [f4] . [04] . [c0] . [80] . [91] . [80] . [00] . [8f] w [77] . [03] . [c0] . [80] . [91] . [80] . [00] . [8f] } [7d] . [80] . [93] . [80] . [00] . [08] . [95] . [84] . [b5] . [8f] w [77] . [02] . [c0] . [84] . [b5] . [8f] } [7d] . [84] . [bd] . [08] . [95] . [80] . [91] . [b0] . [00] . [8f] w [77] . [80] . [93] . [b0] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
######avrdude: Send: U [55] . [c0] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: d [64] . [00] . [80] F [46] . [08] . [95] . [80] . [91] . [b0] . [00] . [8f] } [7d] . [80] . [93] . [b0] . [00] . [08] . [95] . [90] . [e0] . [fc] . [01] . [e4] X [58] . [ff] O [4f] $ [24] . [91] . [fc] . [01] . [e0] W [57] . [ff] O [4f] . [e4] . [91] . [ee] # [23] . [a9] . [f0] . [f0] . [e0] . [ee] . [0f] . [ff] . [1f] . [e8] T [54] . [ff] O [4f] . [85] . [91] . [94] . [91] . [dc] . [01] . [9f] . [b7] . [f8] . [94] . [8c] . [91] f [66] # [23] ) [29] . [f4]   [20] . [95] . [82] # [23] . [8c] . [93] . [9f] . [bf] . [08] . [95] . [82] + [2b] . [8c] . [93] . [9f] . [bf] . [08] . [95] . [0f] . [93] . [1f] . [93] . [cf] . [93] . [df] . [93] . [0f] . [92] . [cd] . [b7] . [de] . [b7] ( [28] / [2f] 0 [30] . [e0] . [f9] . [01] . [e8] Y [59] . [ff] O [4f] . [84] . [91] . [f9] . [01] . [e4] X [58] . [ff] O [4f] . [14] . [91] . [f9] . [01] . [e0] W [57] . [ff] O [4f] . [04] . [91] . [00] # [23] . [d1] . [f0] . [88] # [23]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
#######avrdude: Send: U [55] . [00] . [01]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: d [64] . [00] . [80] F [46] ! [21] . [f0] i [69] . [83] . [0e] . [94] . [9a] . [00] i [69] . [81] . [e0] / [2f] . [f0] . [e0] . [ee] . [0f] . [ff] . [1f] . [e2] U [55] . [ff] O [4f] . [85] . [91] . [94] . [91] . [dc] . [01] . [9f] . [b7] . [f8] . [94] . [8c] . [91] f [66] # [23] . [19] . [f4] . [10] . [95] . [81] # [23] . [01] . [c0] . [81] + [2b] . [8c] . [93] . [9f] . [bf] . [0f] . [90] . [df] . [91] . [cf] . [91] . [1f] . [91] . [0f] . [91] . [08] . [95] . [1f] . [92] . [0f] . [92] . [0f] . [b6] . [0f] . [92] . [11] $ [24] / [2f] . [93] ? [3f] . [93] . [8f] . [93] . [9f] . [93] . [af] . [93] . [bf] . [93] . [80] . [91] ` [60] . [00] . [90] . [91] a [61] . [00] . [a0] . [91] b [62] . [00] . [b0] . [91] c [63] . [00] 0 [30] . [91] h [68] . [00] # [23] / [2f] - [2d] _ [5f] - [2d] 7 [37]   [20] . [f4] . [01] . [96] . [a1] . [1d] . [b1] . [1d] . [05] . [c0] # [23] / [2f] * [2a] W [57] . [02] . [96] . [a1] . [1d]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
######avrdude: Send: U [55] @ [40] . [01]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: d [64] . [00] . [80] F [46] . [b1] . [1d]   [20] . [93] h [68] . [00] . [80] . [93] ` [60] . [00] . [90] . [93] a [61] . [00] . [a0] . [93] b [62] . [00] . [b0] . [93] c [63] . [00] . [80] . [91] d [64] . [00] . [90] . [91] e [65] . [00] . [a0] . [91] f [66] . [00] . [b0] . [91] g [67] . [00] . [01] . [96] . [a1] . [1d] . [b1] . [1d] . [80] . [93] d [64] . [00] . [90] . [93] e [65] . [00] . [a0] . [93] f [66] . [00] . [b0] . [93] g [67] . [00] . [bf] . [91] . [af] . [91] . [9f] . [91] . [8f] . [91] ? [3f] . [91] / [2f] . [91] . [0f] . [90] . [0f] . [be] . [0f] . [90] . [1f] . [90] . [18] . [95] . [0f] . [93] . [1f] . [93] . [9f] . [b7] . [f8] . [94] . [00] . [91] d [64] . [00] . [10] . [91] e [65] . [00]   [20] . [91] f [66] . [00] 0 [30] . [91] g [67] . [00] . [86] . [b5] . [a8] . [9b] . [06] . [c0] . [8f] ? [3f] ! [21] . [f0] . [0f] _ [5f] . [1f] O [4f] / [2f] O [4f] ? [3f] O [4f] . [9f] . [bf] 2 [32] / [2f]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
######avrdude: Send: U [55] . [80] . [01]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: d [64] . [00] . [80] F [46] ! [21] / [2f] . [10] / [2f] . [00] ' [27] . [08] . [0f] . [11] . [1d] ! [21] . [1d] 1 [31] . [1d] B [42] . [e0] . [00] . [0f] . [11] . [1f] " [22] . [1f] 3 [33] . [1f] J [4a] . [95] . [d1] . [f7] . [b8] . [01] . [c9] . [01] . [1f] . [91] . [0f] . [91] . [08] . [95] . [cf] . [92] . [df] . [92] . [ef] . [92] . [ff] . [92] . [cf] . [93] . [df] . [93] k [6b] . [01] | [7c] . [01] . [0e] . [94] i [69] . [01] . [dc] . [01] . [cb] . [01] . [ec] . [01] . [0f] . [c0] . [0e] . [94] i [69] . [01] l [6c] . [1b] } [7d] . [0b] . [83] . [e0] h [68] > [3e] x [78] . [07] 8 [38] . [f0] . [08] . [94] . [c1] . [08] . [d1] . [08] . [e1] . [08] . [f1] . [08] . [c8] Q [51] . [dc] O [4f] . [c1] . [14] . [d1] . [04] . [e1] . [04] . [f1] . [04] a [61] . [f7] . [df] . [91] . [cf] . [91] . [ff] . [90] . [ef] . [90] . [df] . [90] . [cf] . [90] . [08] . [95] x [78] . [94] . [84] . [b5] . [82] ` [60] . [84] . [bd]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
######avrdude: Send: U [55] . [c0] . [01]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: d [64] . [00] . [80] F [46] . [84] . [b5] . [81] ` [60] . [84] . [bd] . [85] . [b5] . [82] ` [60] . [85] . [bd] . [85] . [b5] . [81] ` [60] . [85] . [bd] . [ee] . [e6] . [f0] . [e0] . [80] . [81] . [81] ` [60] . [80] . [83] . [e1] . [e8] . [f0] . [e0] . [10] . [82] . [80] . [81] . [82] ` [60] . [80] . [83] . [80] . [81] . [81] ` [60] . [80] . [83] . [e0] . [e8] . [f0] . [e0] . [80] . [81] . [81] ` [60] . [80] . [83] . [e1] . [eb] . [f0] . [e0] . [80] . [81] . [84] ` [60] . [80] . [83] . [e0] . [eb] . [f0] . [e0] . [80] . [81] . [81] ` [60] . [80] . [83] . [ea] . [e7] . [f0] . [e0] . [80] . [81] . [84] ` [60] . [80] . [83] . [80] . [81] . [82] ` [60] . [80] . [83] . [80] . [81] . [81] ` [60] . [80] . [83] . [80] . [81] . [80] h [68] . [80] . [83] . [10] . [92] . [c1] . [00] . [08] . [95] . [0e] . [94] . [bc] . [01] . [0e] . [94] . [80] . [00] . [0e] . [94] . [85] . [00] . [fd] . [cf] . [f8] . [94] . [ff] . [cf]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
####### | 100% 0.20s
[...]

avrdude done.  Thank you.

inizio io: la lettera serve solo per identificare i comandi. la parte importante è quella tra , ovvero il valore esadecimale inviato.
ogni riga sono 130 caratteri esadecimali, ovvero 130 byte… sono esclusi il carattere F e il comando D (4byte che indicano la pagina da scrivere)
secondo me ci sono 2 byte che vogliono dire qualcos’altro, ma non so cosa.

in teoria questi 128 byte corrispondono ad una pagina di flash

viene ripetuto per 8 volte, ovvero 128*8=1024byte, guarda caso proprio la dimensione dello sketch.

ora mi tocca decodificare l’hex in esadecimale e capire da dove saltino fuori i 2 byte aggiuntivi, ad occhio sono alla fine e rappresentano l’indirizzo della prossima pagina da scrivere

accidenti ma proprio la parte in asm mi tocca tradurre?!?!

bonsai:

lesto:
il mio scopo non è creare un boot-loader universale, ma capire cosa devo fare per scriverne uno io per un altro micro, e lasciare una spiegazione per chiunque altro voglia cimentarsi a creare un boot-loader

boh, se parli di roba avr mi sembra di capire che vorresti coprire quei micro che sono rimasti fuori dal bootloader attualmente implementato

xro’ poi hai parlato anche dei pic, che hanno gia’ il loro bravo sistemino per upparsi i file, e che quindi io lascerei fuori dal discorso

era un esempio… io sto cercando di tirare fuori le specifiche della comunicazione boot-loader <-> avr-dude, in modo che se un giorno dovessi prendere sotto mano un altro micro, volendo sarei in grado di scrivere un boot-loader arduino-compatibile. Forse è stupido, forse no.
nel frattempo credo di aver trovato la limitazione della mega sull’uso della flash: attualmente il registro indirizzi è a 2 byte, mentre dovrebbe essere a 3 per coprire tutta la flash… c’è un cmmento todo su questo…
infatti 128255(FF)=32640, il limite attuale degli sketch
invece 128
4095(FFF)=524160

il codice optiboot è molto più leggibile, ma lo guardo domani: http://code.google.com/p/optiboot/source/browse/optiboot/bootloaders/optiboot/optiboot.c

lesto:
era un esempio… io sto cercando di tirare fuori le specifiche della comunicazione boot-loader <-> avr-dude, in modo che se un giorno dovessi prendere sotto mano un altro micro, volendo sarei in grado di scrivere un boot-loader arduino-compatibile. Forse è stupido, forse no.

Meno male che ho ripetuto almeno 1000 volte che il bootloader di Arduino in realtà è una emulazione software di un programmatore hardware per Avr, in particolare l’AVRISP e/o STK500, in pratica avrdude crede di dialogare con un vero programmatore di AVR, p.e. l’AVRISP, e non può dialogare direttamente col micro.
Avevo pure puntualizzato la questione relativamente all’invio del ID del micro da parte del bootloader che lo prende da una tabella, nel caso dell’optiboot, o da una apposita stringa nel caso del 2009, invece di leggere quello reale del micro.
Se vuoi sapere tutto del dialogo basta che ti scarichi dal sito di Atmel le specifiche del protocollo STK500 dove trovi sia il set di comandi, completo e non quello parziale supportato dal bootloder, e come vanno formattati i dati.
Dal lato AVR l’emulazione non fa altro che leggere il paccheto inviata da AVRDUDE e inserire nella flash tutti i byte inviati alla locazione di memoria indicata nel pacchetto stesso che a sua volta lo legge dal file .hex al cui formato ti rimando per ulteriori informazioni su come vengono organizzati, e di conseguenza scritti, i dati nella flash.

@astro: è vero, ho dimenticato le tue "lezioni". Ma avrdude può comunque agire anche in assenza di un bootloader leggendo l'ID dai registri del micro. @lesto: non mi tornano i tuoi conti. Perché io posso usare un Atmega328 senza bootloader e senza area dedicata per cui avere tutti i 32768 byte a disposizione. Ma 32768 byte sono 128*256. Però tu fai 128*255 come limite max dimenticandoti però che 1 byte contiene 256 valori, perché c'è anche il caso "128*0"=0 come prima pagina. :P Il limite degli sketch per Arduino, poi, non è 32640 ma 32256 perché l'optiboot occupa 512 byte, 256 word, quindi 32768-512=32256

Altra cosa, i 128 byte sono la dimensione della pagina, come hai giustamente analizzato tu. Ma no è un valore fisso: per l'Atmega328 la pagina è di 128 byte (64 word), vedi datasheet a pagina 301, ma già un Atmega644, che contiene 64 kB di flash, ha le pagine da 256 byte. E 256*256=65536. Sicuramente per chip con più memoria (come quelli con 128 o 256 kB) saranno usati 3 byte ma penso che sia un meccanismo automatico interno ad avrdude, che viene settato in base al micro da programmare (tramite impostazioni nell'avrdude.conf?).

grazie astro che mi hai dato una buona dritta.

@leo: sì. ho sbagliato, è 256 non 255. Io chredo che il valore di byte da usare per la pagina sia nel board.txt o qualcosa di simile, perchè il vecchio boot-loader aveva la limitazione a causa di solo 2 byte fissi per l'indirizzo pagina e pagina fissa a 128byte. Quindio la limitazione non deriva dall'indirizzo pagina fisso a 2 byte, ma dalla lunghezza letta della pagina... Invece l'optiboot supporta più byte, anche se non so quanti, non ho ancora letto per bene il codice

No, il vecchio bootloader aveva un bug derivante dalla non inizializzazione di un registro prima di iniziare la flashatura che portava poi un registro in overflow con lo sketch che veniva riscritto a partire dalla pagina 0, sovrascrivendo la parte già memorizzata.

Nel file boards.txt c'è la memoria libera usabile per gli sketch, ossia il totale dei byte meno lo spazio occupato dal bootloader, se presente. Ma è un valore messo a mano, probabilmente viene usato dall'IDE per verificare con avr-size che lo sketch compilato non superi il massimo disponibile.

leo72: Ma avrdude può comunque agire anche in assenza di un bootloader leggendo l'ID dai registri del micro.

Avrdude è solo un software per pc, se non hai a disposizione un vero programmatore per AVR, o un AVR con bootloader che lo emula, non può fare assolutamente nulla. In realtà Avrdude fa una richiesta al programmatore tramite l'opportuno comando e poi è questo che va ad interrogare il micro tramite la modalità isp e la relativa connessione ai pin di programmazione del micro.