Go Down

Topic: [Linux] Aggiornare la toolchain Avr (Read 17823 times) previous topic - next topic

leo72

Non ci siamo.... la toolchain Avr basata su avr-gcc 4.7 è un PACCO.
Oggi per caso, sviluppando la funzione delaySeconds, mi sono accorto che avr-binutils 2.22 è ancora affetta dal famigerato bug di delay/millis che non fa avanzare le funzioni temporali di Arduino. Pazzesco!  :0

Ho rimesso la toolchain con le patch Atmel.

Michele Menniti

Sei tanto ostinato che prima o poi ce la farai e leggeremo il tanto sospirato EUREKA! XD
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

PaoloP

#107
Sep 06, 2012, 12:59 pm Last Edit: Sep 06, 2012, 01:02 pm by PaoloP Reason: 1
Disponibile la nuova toolchian per Linux 3.4.1 --> http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx
Contiene:
AVR 32-bit GNU Binutils 2.22 - Binary utilities for AVR 32-bit target (including assembler, linker, etc.)
AVR 32-bit GNU Compiler Collection (avr32-gcc) 4.4.3 - C language and C++ language compiler for AVR 32-bit target.
Newlib (for AVR 32-bit) 1.16.0 - Standard C Library for AVR 32-bit

Codice sorgente disponibile qui --> http://distribute.atmel.no/tools/opensource/Atmel-AVR-Toolchain-3.4.1/avr32/

@Leo:
Binutils dovrebbe essere patchato.  :smiley-roll-sweat:

leo72

Uhm... non sapevo di questa nuova toolchain ufficiale Atmel... son curioso di provarla....

leo72

2 note dolenti:
1) il .tar.gz con i binari compilati è inscaricabile: arriva un archivio corrotto di un'ottantina di byte. Bisogna prelevare i sorgenti da
http://distribute.atmel.no/tools/opensource/Atmel-AVR-Toolchain-3.4.1/avr/
e poi compilarli (devo ancora finire il download)

2) resta il bug dell'accesso a dati posti oltre il limite dei 128 kB:
Quote
For Mega and Xmega devices, program memory images beyond 128KBytes have limitations and may not work
for few cases

leo72

Uhm... o sono io stanco oppure le istruzioni per compilare i sorgenti sono molto fumose.... qualcuno ha capito come fare?

MauroTec


Uhm... o sono io stanco oppure le istruzioni per compilare i sorgenti sono molto fumose.... qualcuno ha capito come fare?


Forse siamo stanchi entrambe, ma il SOURCES.README lascia a desiderare. Comunque mi pare di capire che puoi scaricare i sorgenti da loro (forse già patchati) oppure patchare i sorgenti vanilla dei rispettivi sviluppatori, cioè sarebbe a dire scaricare gcc-4.6.2 e applicare le patch di atmel, stessa cosa per tutti gli altri pacchetti sorgente vanilla. Come vedi le patch sono cresciute di numero quindi ci hanno lavorato parecchio, ma al momento potrebbe essereci ancora il problema dei 128kb. Quindi io dico che è meglio aspettare la nuova release, tanto quella precedente di atmel va bene almeno per me lavora tranquillamente.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

leo72

Aggiornamento.
Adesso sto usando la toolchain ufficiale Atmel 3.4.1. Quella precompilata da Atmel, però. Perché compilare i sorgenti è un calvario: ci sono diverse cose da aggiungere sul sistema, e non mi andava di installare centinaia di MB di roba  :smiley-sweat:
Ho aspettato 1 giorno ed i link ora funzionano, sia quelli a 32 che a 64 bit.

Riassumo come fare:

1) andare a questa pagina:
http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx

2) scegliere la toolchain AVR8 (l'AVR32 è per i micro a 32 bit) compatibile con l'architettura del proprio SO (a 32 o 64 bit)

3) riempire il form con i dati richiesti: mettete un indirizzo e-mail real perché altrimenti non vi arriva il link  :P. Per "Company" mettete quel che vi pare, io ho messo "MyHome"  :smiley-yell:

4) aprite il vostro client di posta. Dopo qualche minuto arriva un messaggio con un link da cliccare per confermare la registrazione. Questo vi porta alla pagina di download

5) una volta scaricato il pacchetto (sono circa 80 MB), scompattatelo.

6) Adesso va sostituita alla toolchain distribuita con l'IDE 1.x. Aprite la cartella dove avete l'IDE di Arduino (normalmente arduino-1.0.1) ed entrate in /hardware/tools

7) dentro a questa cartella ne trovate una denominata /avr: questa contiene la toolchain distribuita con l'IDE. Rinominatela in /avr.old.

8) create una nuova cartella /avr ed entrateci. E' vuota, in questo momento.

9) ora entrate nella cartella dove si sono scompattati i binari della toolchain che avete scaricato (punto 5) e copiate tutte le sottocartelle presenti nella nuova cartella /avr che avete creato al punto 8.

10) un'ultima modifica se usate il core Tiny. Entrate in /hardware/tiny/cores/tiny ed editate il file wiring.h. Intorno alla riga 136 commentate la riga che inizia con #define round(x) in modo che alla fine risulti così:
Code: [Select]
//#define round(x)     ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
Questa modifica (che forse dovrete replicare anche sui file wiring.h di altri core, se ne avete) serve per sistemare un bug sulla gestione di questa funzione matematica, funzione che si replica nel delay.h a causa dell'include della libreria matematica che c'è in questo file.

Un solo bug, per ora. Ancora non sono riuscito a compilare lo sketch di test del bug dei 64 kB che aveva preparato tempo fa astrobeed. Compilando per Atmega2560 ottengo:
Code: [Select]
avr-gcc: error: unrecognized option '-assembler-with-cpp'
Immagino che sia causato da qualche parametro passato dall'IDE ma non so come risolvere.

pelletta

Grazie per la guida Leo, proverò su un pc fresco di installazione (kubuntu 11.04).
Ho messo su un hard disk separato anche un'installazione di kubuntu 12.04 perchè dicono vale la pena di provarlo; ho visto che nei repository c'è l'ide 1.0.1 ma proprio non riesco a conviverci... che tu sappia c'è la possibilità di installarci anche l'ide 0022 senza conflitti vari?

lesto

leo, l'errore è che passi al compilatore il parametro "-assembler-with-cpp", togli quello e tutto fila liscio. Se stai usando l'ide arduino, forse trovi le opzioni al compilatore nel preferencies.txt
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

@pelletta:
Personalmente non uso gli IDE dei repo ma solo quelli scaricati dal sito di Arduino. Questo perché così non devo installare nulla, non ho pacchetti da gestire, scompatto solo l'archivio nei miei Documenti e poi creo un collegamento sulla scrivania. In questo modo posso tenere le 2 versioni dell'IDE senza problemi: esse condivideranno solo il file delle preferenze.
Devi tenere a mente che la 1.0.1 non necessita della toolchain installata sul sistema perché ce l'ha integrata mentre la 0022 la vuole. Però se la installi per la 0022 poi essa viene usata anche dalla 1.0.1: se non ricordo male, la 1.0.1 usa la toolchain integrata solo se non la trova sul sistema.

Un "nota bene".
Ultimamente la 0022 non la uso quasi più, alla 1.0.1 ormai hanno convertito quasi tutte le lib.

leo72


leo, l'errore è che passi al compilatore il parametro "-assembler-with-cpp", togli quello e tutto fila liscio. Se stai usando l'ide arduino, forse trovi le opzioni al compilatore nel preferencies.txt

Che sia errato il parametro lo so, l'ho scritto anch'io  XD
Ma lo passa l'IDE, non io. E, come ho detto, non so dove si editino le opzioni (non sono nel file preferences.txt).  :smiley-sweat:

lesto

hai ragione, è hardcopdato in "./app/src/processing/app/debug/Compiler.java", riga 550;

Code: [Select]

static private List getCommandCompilerS(String avrBasePath, List includePaths,
    String sourceName, String objectName, Map<String, String> boardPreferences) {
    List baseCommandCompiler = new ArrayList(Arrays.asList(new String[] {
      avrBasePath + "avr-gcc",
      "-c", // compile, don't link
      "-g", // include debugging info (so errors include line numbers)
      "-assembler-with-cpp",
      "-mmcu=" + boardPreferences.get("build.mcu"),
      "-DF_CPU=" + boardPreferences.get("build.f_cpu"),     
      "-DARDUINO=" + Base.REVISION,
      "-DUSB_VID=" + boardPreferences.get("build.vid"),
      "-DUSB_PID=" + boardPreferences.get("build.pid"),
    }));

    for (int i = 0; i < includePaths.size(); i++) {
      baseCommandCompiler.add("-I" + (String) includePaths.get(i));
    }

    baseCommandCompiler.add(sourceName);
    baseCommandCompiler.add("-o"+ objectName);

    return baseCommandCompiler;
  }



da combiare in

Code: [Select]
static private List getCommandCompilerS(String avrBasePath, List includePaths,
    String sourceName, String objectName, Map<String, String> boardPreferences) {
    List baseCommandCompiler = new ArrayList(Arrays.asList(new String[] {
      avrBasePath + "avr-gcc",
      "-c", // compile, don't link
      "-g", // include debugging info (so errors include line numbers)
      "-mmcu=" + boardPreferences.get("build.mcu"),
      "-DF_CPU=" + boardPreferences.get("build.f_cpu"),     
      "-DARDUINO=" + Base.REVISION,
      "-DUSB_VID=" + boardPreferences.get("build.vid"),
      "-DUSB_PID=" + boardPreferences.get("build.pid"),
    }));

    for (int i = 0; i < includePaths.size(); i++) {
      baseCommandCompiler.add("-I" + (String) includePaths.get(i));
    }

    baseCommandCompiler.add(sourceName);
    baseCommandCompiler.add("-o"+ objectName);

    return baseCommandCompiler;
  }
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

PaoloP

Se il comando c'è credo che serva, quindi toglierlo solo perchè da errore non mi sembra giusto.
Controllando qui (http://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html) mi sembra però che si siano dimenticati un pezzo.

il comando giusto dovrebbe essere
Code: [Select]
"-x assembler-with-cpp",

Potete provarlo e nel caso segnalare il bug?

MauroTec

Ci sono buone probabilità che ad Atmel non interessi il C++ e tanto meno C++/asm per cui non hanno curato questo aspetto e da qui l'errore.

Io continuo a preferire la creazione dei pacchetti nativi della distrò. Per fedora scarico la versione sorgente del pacchetto .srpms la installo nel build tree modifico il file .spec introducendo le nuove patch e poi avvio il builder di pacchetti rpmbuild attendo un po e il pacchetto è pronto per l'installazione/aggiornamento. Stessa cosa accade per ubuntu ma ovviamente i pacchetti sono .deb e il builder si chiama dpkg-buildpackage
http://manpages.ubuntu.com/manpages/lucid/man1/dpkg-buildpackage.1.html

Ovvio che il tempo necessario per ricostruire tutti i pacchetti della toolchain si allunga fino anche ad una settimana nel caso ci sia d'aggiustare qualcosa, ma ne vale la pena la maggior parte delle volte.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Go Up