Go Down

Topic: [WIN] Aggiornam. compilatore IDE 0022-0023-1.0 all'ULTIMA VERSIONE ATMEL (Read 174299 times) previous topic - next topic

testato

grazie della domanda menny e della risposta leo, non conosco questo concetto, quindi chiedo:
E' corretto fare un paragone con il cluster degli HD ? quindi dire che meno di una word non puo' essere occupata ?
se anche il dato che devo scrivere in flash fosse di solo 1 byte, in flash ne occupero' cmq 2, o meglio in quel byte libero occupato dal precedente dato non potro' scrivere ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Secondo me non è del tutto corretto il paragone, perché si parla comunque di indirizzare una coppia di byte che sono letti insieme ma che sono poi gestiti singolarmente perché esiste il concetto di byte alto/byte basso, cosa che in riferimento al cluster non c'è: non c'è il "mezzo cluster alto" e il "mezzo cluster basso".
Però qui non ho abbastanza conoscenze per affermare che ciò che ho detto sia giusto. Dovrei rileggermi il datasheet per dartene certezza assoluta.

menniti


La dimensione della word varia in base all'architettura. Sui micro Atmel ad 8 bit la word è "larga" 2 byte, 16 bit.
Però bisogna fare un distinguo fra la dimensione dello sketch sul tuo computer, che si misura in byte, e il firmware caricato nella flash, che è organizzata in word, ossia ha celle di 16 bit. Se ti ricordi, infatti, Fuse Calculator, nel menu che riserva lo spazio per il bootloader, indica proprio la dimensione dell'area in word: 256 word, 512 byte, sono il minimo che può essere riservato.

Il compilatore tradurrà i salti a 16 bit, ma questa operazione a te non interessa: fa parte della traduzione del programma dal C al linguaggio macchina.

Leo, devo capire bene questa cosa: il mio sketch che in basso sull'IDE mi dice di essere di 32768byte in che forma viene scritto sul mega328? e quanto occupa?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

leo72

Sono 2 misure della stessa grandezza. Come quando scrivi 0.1uF o 100nF che si equivalgono.
Occupa 32768 byte oppure 16384 word oppure 8192 long word oppure 65536 nibble (mezzo byte). Come preferisci  ;)

menniti


Sono 2 misure della stessa grandezza. Come quando scrivi 0.1uF o 100nF che si equivalgono.
Occupa 32768 byte oppure 16384 word oppure 8192 long word oppure 65536 nibble (mezzo byte). Come preferisci  ;)

OTTIMO e chiaro quindi su un mega328P è possibile caricare fino a 16384 word.
Prendiamo il 2560, che è dato per 256Kbyte, giusto? un tizio mi scrive e mi dice ho scritto un firmware di 75Kb e sul mega2560 non funziona, se lo porto a massimo 64Kb funziona, però Astro mi dice che il 2560 con il vecchio compilatore può ricevere fino a 64word, quindi 128byte, quindi?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

leo72

Tornando sulla memoria, questo è ciò che dice il datasheet:
Quote
The ATmega48A/PA/88A/PA/168A/PA/328/P contains 4/8/16/32Kbytes On-chip In-System
Reprogrammable Flash memory for program storage. Since all AVR instructions are 16 or 32
bits wide, the Flash is organized as 2/4/8/16K x 16.

Quindi si tratta, come ti ho detto, di "organizzazione" della memoria, cioè di come il micro accede al suo contenuto. A noi "utenti" non ce ne importa, tant'è che anche Atmel stessa dice che il 328 ha 32 kbyte di memoria.

Ora il bug. In realtà il bug dei 64 kB è... doppio.
Siccome per gestire il PC, il program counter, sono usati 2 registri da 8 bit, si possono indirizzare fino ad un massimo di 65536 valori. Siccome la memoria è organizzata in word, come detto, il bug si presenta nel caso di un salto che vada oltre i 128 kB, ossia oltre i 64kword. Per ovviare a questo bug il nuovo compilatore avr-gcc 4.7 usa infatti 3 registri.
Però c'è anche il bug che affligge il codice compilato: se il codice compilato sorpassa come dimensioni i 64 kbyte, va in blocco il micro: questo bug è causato invece da un altro bug del compillatore che non gestisce correttamente i dati allocati oltre i 64 kB,.

testato

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

brainbooster

@Leo però non ho capito la risposta alla domanda di Testato, anche se sfori di un bit occupi tutta una word successiva?
Nei cluster degli hdd non ci sono il "mezzo cluster alto" e il "mezzo cluster basso" ma ci sono comunque i settori, e un cluster può avere un occupazione parziale dei settori, e basta un settore scritto per far considerare al fs il cluster come occupato, è così anche per le memorie dei micro?.

menniti

BB: scusa se riprendo il discorso flash e tralascio volutamente la questione cluster, ma devo concludere  urgentemente.
@ Leo riepilogando, ma mi servono i riferimenti sui compilatori 4.3.2 (originale IDE) ed il nuovo 4.5.1, abbiamo che:
4.3.2: ha il limite della compilazione fino a 64kword (128kb) ma un altro bug impedisce il funzionamento per file >32kword (64kb).
4.5.1: sposta il limite della compilazione a 128kword (256kb) [oppure va oltre?] e non dovrebbe avere bug per far funzionare i file >64kb.
E' corretto questo riepilogo?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

astrobeed

#354
Mar 31, 2012, 08:28 am Last Edit: Mar 31, 2012, 09:03 am by astrobeed Reason: 1
Vediamo di fare chiarezza sulla questione word e byte.
Il byte, ovvero 8 bit, è l'unità di memoria minima indirizzabile, vale per tutte le mcu e i microprocessori, la word rappresenta la quantità di dati che l'unità di calcolo può trattare ad ogni ciclo macchina, quindi le dimensioni della word non sono un valore fisso perché dipendono dall'architettura hardware.
Sulle mcu AVR la word dati è un byte, sulle mcu con core ARM la word dati è quattro byte, su un processore X86 a seconda dei modelli e di come vengono utilizzati la word dati può essere sia di quattro byte che di otto byte (64 bit).
Quasi tutte le mcu esistenti sono di tipo risc e adottano l'architettura Harvard che prevede una distinzione tra memoria dati e memoria di programma con relativi bus separati.
Sugli AVR la memoria di programma è costituita da due byte quindi la relativa word è di 16 bit, il che ci porta a dover fare una distinzione tra word di programma e word dati, dato che il core degl avr è da 8 bit solitamente per i dati si fa semplicemente riferimento ai byte e non alle word mentre per la memoria di programma si può fare sia riferimento alle word che ai byte realmente impiegati.
Quando si compila un programma il risultato dell'occupazione di memoria viene sempre fornita in byte perché questa è l'unità di misura con la quale viene indicata la memoria totale disponibile nei vari micro, però l'occupazione di questa avviene di due byte in due byte per ogni istruzione assembly, alcune richiedono l'uso di due o tre word nel caso siano da specificare indirizzi estesi.
Per quanto riguarda l'occupazione della memoria di programma da parte dei dati anche in questo caso avviene per word di due byte sugli AVR, cioè se mettere un dato di un byte nella flash questo occupa lo stesso due byte, se inserite un vettore di tipo char composto da 8 elementi occupa quattro word, ovvero 8 byte, se ne mettete uno di 9 elementi occupa 5 word, ovvero 10 byte.
Potete facilmente verificare da voi come viene usata la flash dai dati creando un array con la progmem e controllate la dimensione del compilato ogni volta che aggiungete un carattere, noterete che o aumenta di due byte oppure rimane ferma al valore precedente a seconda se il nuovo carattere viene posto nel secondo byte della word oppure deve essere posto in una nuova word.

Scientia potentia est

astrobeed


4.3.2: ha il limite della compilazione fino a 64kword (128kb) ma un altro bug impedisce il funzionamento per file >32kword (64kb).


No, il limite è 64k word, ovvero 128kbyte di memoria, e i programmi funzionano perfettamente, però non è possibile introdurre dati nella flash oltre i primi 64k, se lo si fa i risultati sono imprevedibili, in linea di massima fino a che il software non tenta di accedere a questi dati funziona tutto, non appena cerca di farlo va in crash.

Quote

4.5.1: sposta il limite della compilazione a 128kword (256kb) [oppure va oltre?] e non dovrebbe avere bug per far funzionare i file >64kb.
E' corretto questo riepilogo?


La Toolchain Atmel, e non semplicemente avr-gcc 4.5.1 perché la versione Atmel è modificata rispetto all'originale, permette di compilare sicuramente fino a 256k, oltre non lo se ci va perché non esistono mcu AVR 8 bit con più di 256k, e i dati si possono mettere anche oltre il limite dei 64k, però farlo non è una cosa immediata e semplice perché è indispensabile creare una apposita data_section che deve essere gestita dal linker e per accedervi è necessario usare le relative funzioni di tipo "far" messe a disposizione dalla "progmem".
Detto in modo più semplice, da wiring è praticamente impossibile accedere ai dati in flash oltre i 64k, mentre è fattibile in C ANSI e ovviamente il relativo codice è inseribile in uno sketch di Arduino, però non è semplice da implementare.

Scientia potentia est

brainbooster

Grazie astrobeed per il chiarimento.
quindi l'esempio di Tesato ,più o meno era calzante.

menniti

Astro, il primo intervento è chiarissimo; sul secondo mi pare di cominciare a capire (scusa ma è materia nuova per me) che ci sia una differenza tra programma (inteso come istruzioni) e dati, per cui realizzando ipoteticamente un programma da 100K senza dati esso funzionerebbe senza problemi.

Ma la tua affermazione
Quote
...e i dati si possono mettere anche oltre il limite dei 64k, però farlo non è una cosa immediata e semplice...
può significare che il famoso sketch del mio amico potrebbe ancora non funzionare, nonostante tutto il lavoro che hai fatto, perché magari non ha gestito correttamente la creazione di una data_section?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

astrobeed


che ci sia una differenza tra programma (inteso come istruzioni) e dati, per cui realizzando ipoteticamente un programma da 100K senza dati esso funzionerebbe senza problemi.


Funziona fino a che i dati introdotti nella flash, e rammento che per farlo è necessario usare la progmem, non superano il limite di 64k, un programma composto da 60k di dati, a patto che si trovino sotto il limite, e altri 60k di codice funziona anche con il vecchio compilatore.
Attenzione non è che se definisci dati per tot k < 64k sei certo che si trovano nella parte bassa della flash, in linea di massima è così però non vi è nessuna garanzia che il compilatore non ti mette n k sotto i 64k e altri n k sopra i 64k.
Il brutto è che non ti accorgi dove stanno realmente i dati fino a che non fai girare il programma e tenti di accedere a quelli che si trovano oltre il limite a meno che non vai ad analizzare l'eseguibile tramite emulatore e puoi verificare prima dove si trovano i dati.

Quote

Ma la tua affermazione può significare che il famoso sketch del mio amico potrebbe ancora non funzionare, nonostante tutto il lavoro che hai fatto, perché magari non ha gestito correttamente la creazione di una data_section?


Si è possibile, però senza vedere fisicamente il suo software non posso dirti se è incappato in questo problema e come risolverlo.
Scientia potentia est

menniti

Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

Go Up