[Risolto] Errore di compilazione con ATtiny84

Ciao a tutti gli amici del forum, desidero sottoporvi un fastidiosissimo problema che si sta verificando scrivendo codice per ATtiny84. Mi capita, già in un paio di progetti, durante la compilazione di avere questo errore:

c:/program files (x86)/arduino sw/arduino-1.0/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn84.o:(.init9+0x2): relocation truncated to fit: R_AVR_13_PCREL against symbol `exit' defined in .fini9 section in c:/program files (x86)/arduino sw/arduino-1.0/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/avr25\libgcc.a(_exit.o)

il quale, ovviamente, fa fallire la compilazione.

Ho notato che il "diavolo" si manifesta tutte le volte che lo sketch oltrepassa circa il 50% dello spazio disponibile, (infatti per eliminare l'errore mi basta levare qualche riga di codice...qualunque tipo di riga e lo sketch compila correttamente).

Ho pensato che si potesse trattare di qualche problema di occupazione di memoria (soprattutto SRAM) allora ho fatto la prova con uno sketch con le seguenti caratteristiche: - nessuna libreria esterna - nessun array di dati da riempire dinamicamente - solo istruzioni "classiche" (assegnamenti, cicli for, digitalWrite, analogWrite, map)

Lo sketch fino a 4306 byte compila correttamente, dopo un ennesimo copia & incolla (non importa esattamente di quale istruzione, magari per un determinato tipo occorre incollarne più di una), si manifesta l'errore.

avr-size riporta questo:

AVR Memory Usage

Device: attiny84

Program: 4306 bytes (52.6% Full) (.text + .data + .bootloader)

Data: 108 bytes (21.1% Full) (.data + .bss + .noinit)

quindi non sembrano esserci problemi di memoria. Da cosa mai potrebbe dipendere l'errore? Fuse non correttamente settati? chip rovinato? :fearful:

Per completezza d'informazione posto le impostazioni presenti nella board per il micro (che funziona a 8Mhz)

###########################################################################

attiny84at8.name=ATtiny84 @ 8 MHz  (internal oscillator; BOD disabled)

# The following do NOT work...
# attiny84at8.upload.using=avrispv2
# attiny84at8.upload.using=Pololu USB AVR Programmer

# The following DO work (pick one)...
attiny84at8.upload.using=arduino:arduinoisp
# attiny84at8.upload.protocol=avrispv2
# attiny84at8.upload.using=pololu

attiny84at8.upload.maximum_size=8192

# Default clock (slowly rising power; long delay to clock; 8 MHz internal)
# Int. RC Osc. 8 MHz; Start-up time PWRDWN/RESET: 6 CK/14 CK + 64 ms; [CKSEL=0010 SUT=10]; default value
# Brown-out detection disabled; [BODLEVEL=111]
# Preserve EEPROM memory through the Chip Erase cycle; [EESAVE=0]

attiny84at8.bootloader.low_fuses=0xE2
attiny84at8.bootloader.high_fuses=0xD7
attiny84at8.bootloader.extended_fuses=0xFF
attiny84at8.bootloader.path=empty
attiny84at8.bootloader.file=empty84at8.hex

attiny84at8.bootloader.unlock_bits=0xFF
attiny84at8.bootloader.lock_bits=0xFF

attiny84at8.build.mcu=attiny84
attiny84at8.build.f_cpu=8000000L
attiny84at8.build.core=tiny

Confido insieme nella vostra esperienza e benevolenza ... :-)

ma i fuse per 8mhz non dovrebbero essere EA DF FF ?

Da un pò sto facendo esperimenti con un attiny44...tutto bene... Visto che sono in attesa di un attiny84, ho provato ad impostare come board l'attiny84, ed esattamente dopo 4306 byte mi esce l'identico errore!!! Temo sia un bug.....

@ivan64: Interessante...questo già mi fa sentire meno solo :-)

@BrainBooster: Ho visto in diverse versioni scaricabili dalla rete e i fuse hanno tutti la stessa sequenza, ovvero E2 DF FF. Mi consigli di provare a modificare questi valori ed eseguire il burn del bootloader?

Non credo sia una questione di fuse.... anche impostando l'attiny84 a 1mhz, coi fuse relativi, identico errore.... quasi uguale anche a 16mhz, lo sketch arriva fino a 4330byte circa, poi errore!

Che versione del core Tiny usate? Ho visto che l'ultima è la 0100-0012 del 27/02.

@brain: i fuse sono giusti. Con EA selezioni un cristallo esterno, per usare l'oscillatore interno ad 8 MHz va bene E2

@Leo è vero Edit: prova a cancellare il contenuto della cartella di build ...sembra un errore del linker https://savannah.nongnu.org/bugs/?14855

@Leo la versione è proprio quella, ma comunque l'errore si manifestava anche con una versione che usavo precedentemente.

@BrainBooster: provato a cancellare il contenuto della cartella di build e poi compilare...niente.

Ma quindi mi sembra di capire che ci sono persone che compilano tranquillamente fino a 8K? No perchè sarebbe un peccato avere un ATtiny84 e poterlo usare solo per la metà della sua capacità...

Io compilo senza problemi però uso l'IDE 0022 con relativo core Tiny 0022. Non uso l'IDE 1.0 per svariati motivi.

A questo punto ritengo sia un bug legato al nuovo IDE.

A me esce l’identico errore con tiny 0022, e l’ide 022, 023 e 1.0…

Questa, paradossalmente, mi suona come una "buona notizia", vuol dire che se il problema è indipendente dal tipo di IDE o core-tiny usato, allora forse bisogna cercarlo altrove, e quindi c'è ancora speranza di poter risolvere il problema.

Farò delle ricerche in rete...nel frattempo qualche idea? Suggerimenti?

perchè non postate entrambi il codice che provoca l'errore, così vediamo se hanno qualcosa in comune

BrainBooster: perchè non postate entrambi il codice che provoca l'errore, così vediamo se hanno qualcosa in comune

Qualsiasi codice uso, appena passo i 4306 byte esce l'errore.....

Io uso Linux come sistema operativo, nello specifico Kubuntu 11.04. Queste sono le versioni dei software della toolchain:

avr-gcc 4.3.5 binutils-avr 2.20.1 avr-libc 1.6.8

Fate come Leo e postate anche voi i componenti del vostro toolchain e relative versioni. Sembra che abbiamo escluso problemi di natura hardware (fuse ecc..), problemi legati al codice, e problemi legati alla versione dell'ide (forse).

avr-gcc 4.3.2 binutils-avr 2.19.? avr-libc 1.6.4 (ho trovato solo la versione dell'help)

Sinceramente non ho idea su come aggiornare..... ora vedo!

Ok, ho risolto! :-)

Grazie a questo prezioso link trovato in rete (e successivamente tradotto in italiano): http://translate.google.it/translate?hl=it&sl=en&tl=it&u=http%3A%2F%2Farduino.cc%2Fforum%2Findex.php%3Faction%3Dprintpage%3Btopic%3D60649.0&anno=2 Qui si parla di un bug del linker riguardo l'architettura "avr25" (alla quale appartengono 84/85) che sarebbero state "dimenticate" nei file di configurazione. Dice anche come aggiornare il toolset per risolverlo.

Pubblico le operazioni che ho eseguito dato che possono essere utili:

  • Scaricato e installato l'ultima versione di WinAVR
  • Copiato tutti i file di WinAVR in PathArduino/hardware/tools/avr (avendo prima cura di rinomirare quella originale come avr_OLD)
  • Creato una dir "etc" in PathArduino/hardware/tools/avr
  • Modificato il file "avrdude.conf" presente in PathArduino/hardware/tools/avr/bin aggiungendo nelle sezioni "ATtiny84" e "ATtiny85" ESCLUSIVAMENTE le righe:

pagel = 0xB3; bs2 = 0xB4;

Per chiarire meglio l'esatto punto di inserimento, ad esempio, la parte relativa a "ATtiny84" è diventata:

#------------------------------------------------------------
# ATtiny84
#------------------------------------------------------------

part
     id            = "t84";
     desc          = "ATtiny84";
     has_debugwire = yes;
     flash_instr   = 0xB4, 0x07, 0x17;
     eeprom_instr  = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,
                 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC,
                 0x99, 0xE1, 0xBB, 0xAC;
## no STK500 devcode in XML file, use the ATtiny45 one
     stk500_devcode   = 0x14;
##  avr910_devcode   = ?;
##  Try the AT90S2313 devcode:
     avr910_devcode   = 0x20;
     signature        = 0x1e 0x93 0x0c;
     reset            = io;
     chip_erase_delay = 4500;

# aggiunti per eliminare il bug di compilazione.
     pagel = 0xB3;
     bs2 = 0xB4;
     
 ...... altre impostazioni...continua sezione .....
  • Infine ho copiato il file "avrdude.conf" in PathArduino/hardware/tools/avr/etc (la directory creata precedentemente).

Riavviando l'IDE ho potuto compilare con successo fino a oltre 7K, quindi credo che il problema sia stato risolto.

L'autore del post dice che attualmente non c'è una fonte definitiva per le impostazioni di pagel e bs2. Cmq con i valori inseriti pare andare perfettamente. Inoltre non ho inserito le righe con "read" (indicate nel post) perchè le ho trovate già inserite e ho preferito non modificarle.

Per quanto riguarda la toolchain ho le stesse versioni di ivan64.

1000 grazie, risolto pure io!!

Quindi la toolchain AVR allegata all'IDE di Windows è buggata e non funziona correttamente se usata con i Tiny, né quella della 002x né quella della 1.0, mi confermate?