[MAC] Aggiornamento IDE 1.0x all'ultima versione Atmel Toolchain

N.B. : Questo thread fa seguito a tutta la serie di prove che si sono effettuate QUI per compilare l'ultima versione della Atmel Toolchain (3.4.2) su OS X Mountain Lion 10.8.4 e ne riassume i punti fondamentali.

La compilazione della Atmel Toolchain su OS X richiede una serie di prerequisiti :

prima di tutto l'installazione di Xcode (scaricabile gratuitamente dell'App Store per Mac), quindi, tramite Xcode, l'installazione dei "Command Line Tools" (... si può fare da dentro le preferenze di Xcode, bottone Downloads, tab Components), più l'installazione di tutta una serie di pacchetti indispensabili.

Se come me, non siete dei maghi di Linux, per facilitarvi la vita suggerisco, come prima cosa, l'installazione su OS X del pacchetto "Homebrew", che altro non è che un prodotto per semplificare l'installazione e la manutenzione di innumerevoli pacchetti disponibili per Linux su OS X.

Aperto il terminale, dal prompt dare il comando :

ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

... e l'installazione di Homebrew dovrebbe procedere senza intoppi. Al termine dell'installazione è suggerita una verifica con il comando, sempre da terminale :

brew doctor

che dovrebbe segnalare eventuali problemi da correggere (... o da ignorare se non rilevanti).

Terminata l'installazione e la verifica di Homebrew, si può passare all'installazione di tutti i pacchetti che sono propedeutici alla corretta compilazione della Atmel Toolchain. Per fare questo, sempre da terminale, useremo Homebrew secondo la seguente sintassi :

brew install nome_pacchetto

dove nome_pacchetto è il pacchetto che si desidera installare. I pacchetti da installare sono i seguenti :

autoconf            gmp           libmpdclient           libusb-compat           pkg-config
automake            jasper        libpng                 mpc                     texinfo
dfu-programmer      jpeg          libtiff                mpfr                    wget
git                 libmpc        libusb                 netpbm

... in realtà ce n'è qualche d'uno in più (es. git, libusb, dfu-programmer) che io già avevo installato ... ritengo comunque conveniente la loro installazione poiché tanto, prima o poi, servono :wink:

Terminata l'installazione di questi pacchetti con Homebrew, occorre installare un ulteriore pacchetto ... TeX per il quale, fortunatamente, esiste una distribuzione aggiornata per OS X : http://mirror.ctan.org/systems/mac/mactex/MacTeX.pkg ... fate attenzione, è un .pkg da oltre 2 GB quindi ... occorre un po' di tempo, ma almeno è ben fatto e si installa senza problemi :slight_smile:

A questo punto, l'ambiente per poter compilare la Atmel Toolchain è completo di tutti gli strumenti necessari e si può passare al scaricare la Toolchain dal sito di Atmel ed a mettere tutti i vari .tar.gz nelle giuste directory, dopo di che occorre modificare lo script che viene fornito da Atmel per la compilazione, per renderlo eseguibile, senza problemi, su OS X.

Per evitarvi problemi, ho già creato la struttura delle directory necessaria e vi ho già messo dentro i vari pacchetti e lo script modificato ... potete scaricare il tutto dal seguente link : http://www.phoenixsea.ch/downloads/AVR/AVR_Toolchain_v3.4.2.zip :smiley:

Scaricato e scompattato lo zip indicato, dovreste trovarvi con una cartella di nome "AVR Toolchain v3.4.2" che, al suo interno, contiene ulteriori tre cartelle : "bld", "src" e "install" nonché lo script di compilazione (già corretto) build-avr8-gnu-toolchain.sh .

Da terminale posizionatevi nella radice di detta cartella ed eseguite il comando :

sh build-avr8-gnu-toolchain.sh -b _vostro_percorso_/bld -p _vostro_percorso_/install -s _vostro_percorso_/src

dove vostro_percorso è il percorso completo alla cartella della Toolchain.

Dopo un tempo variabile, a secondo della potenza di calcolo del vostro Mac (... sul mio ha impiegato circa 40 minuti) la compilazione avrà termine e la Toolchain sarà tutta correttamente compilata e risiederà all'interno della cartella "install".

Per chi si vuole evitare l'installazione di Xcode, dei "Command Line Tools" e di tutti i pacchetti aggiuntivi necessari, nonché della compilazione, ho già predisposto uno .zip che contiene SOLO la Toolchain già compilata e già in una cartella di nome avr che, come vedremo, è quella che dobbiamo sostituire nel nostro IDE.

Tale zip, con la Toolchain già compilata per OS X è scaricabile da qui : http://www.phoenixsea.ch/downloads/AVR/avr.zip XD

===============================================================================
====== AGGIORNAMENTO DEL 05 DIC 2013 ======
===============================================================================

Atmel ha rilasciato una nuova Toolchain, versione 3.4.3. Grazie all'esperienza fatta con la precedente sono riuscito a ricreare la struttura per poter compilare questa nuova versione ... nuova posizione dei files nelle cartelle e nuovo script.

Dal link che segue potere scaricare detta struttura già pronta per la compilazione su OS X 10.9 (Mavericks) :

http://www.phoenixsea.ch/downloads/AVR/AVR_Toolchain_v3.4.3.zip (circa 135 MB)

mentre, chi volesse scaricare la cartella avr, già pronta da sostituire all'interno dell'IDE 1.0.5 versione OS X, può seguire questo link :

http://www.phoenixsea.ch/downloads/AVR/avr_3.4.3.zip (circa 50 MB).

Per la compilazione, valgono tutti i prerequisiti descritti per la precedente versione ... :wink:

=======================================================================================

Il passo successivo è ora aggiornare Arduino IDE per utilizzare la nuova Toolchain ...

Per fare questo, dovete andare nella cartella /Applications (... dove normalmente si trova Arduino.app), selezionare l'applicazione (Arduino.app), fare click con il tasto destro e selezionare la voce di menu "Show Package Contents" (... ho OS X in Inglese e quindi tutto quello che riporto è per l'inglese ... non dovreste comunque avere problemi ad identificare la voce nel caso lo abbiate in Italiano).

Questo aprirà una finestra del "Finder" sulla cartella "Contents" dell'applicazione.

Procedere nel seguente percorso :

Contents -> Resources -> Java -> hardware -> tools

... nella cartella "tools" si trova la cartella "avr" che è quella che dovremo sostituire.

Per il momento rinominate della cartella "avr" in "avr-old" e copiate nello stesso posto (dentro "tools") la nuova toolchain appena compilata (... o appena scaricata già compilata) :

Se avete compilato voi la toolchain allora :

  1. copiate la catella "install" della toolchain dentro "tools"
  2. rinominate la cartella copiata da "install" in "avr"
  3. copiate la cartella "etc" che si trova ancora in "avr-old" (... la vecchia toolchain che abbiamo salvato) in "avr" (... la nuova toolchain)
  4. copiate il file "avrdude" che si trova nella cartella "bin" dentro la "avr-old" (... la vecchia toolchain che abbiamo salvato) nella cartella "bin" che si trova in "avr" (... la nuova toolchain)

Se avete scaricato la toolchain già compilata :

  1. copiate la cartella "avr" estratta dalo zip dentro la cartella "tools"

A questo punto, volendo, potete anche cancellare la cartella "avr-old" (... la vecchia toolchain), oppure lasciarla li nel caso ... voleste tornare indietro :grin:

Questo è quanto e ... il vostro Arduino IDE contiene ora la nuova versione della Toolchain Atmel !!! :wink:

Ed ora iniziano i problemi ...
... il "core" arduino NON è al 100% compatibile con la nuova toolchain e occorrerà esaminare caso per caso le correzioni che sarà necessario applicare. faremo questa cosa assieme nei post a seguire.

Buon lavoro.

Guglielmo

gpb01:
Ed ora iniziano i problemi ... il "core" arduino NON è al 100% compatibile con la nuova toolchain e occorrerà esaminare caso per caso le correzioni che sarà necessario applicare. faremo questa cosa assieme nei post a seguire.

Scusa @Guglielmo, questi problemi ci sono indipendentemente dal S.O. in uso, giusto?

Si, ho verificato gli stessi problemi che riscontro su OS X anche su Windows usando la Toolchain già compilata da Atmel.

Direi che nei post successivi ne mettiamo uno per volta e li risolviamo così, alla fine, ci saranno tutte le modifiche da fare al "core" e le potremo raggruppare in uno zip da installare assieme alla nuova Toolchain :slight_smile:

Guglielmo

gpb01:
Si, ho verificato gli stessi problemi che riscontro su OS X anche su Windows usando la Toolchain già compilata da Atmel.

Direi che nei post successivi ne mettiamo uno per volta e li risolviamo così, alla fine, ci saranno tutte le modifiche da fare al "core" e le potremo raggruppare in uno zip da installare assieme alla nuova Toolchain :slight_smile:

Guglielmo

Grande Guglielmo,complimenti per il tuo instancabile lavoro e per la condivisione dei risultati.
Provvedo anch'io al'installazione dei pacchetti per poi riportare eventuali problemi che incontrerò durante l'utilizzo della nuova toolchain.

ibbba:
Grande Guglielmo,complimenti per il tuo instancabile lavoro e per la condivisione dei risultati.
Provvedo anch'io al'installazione dei pacchetti per poi riportare eventuali problemi che incontrerò durante l'utilizzo della nuova toolchain.

Grazie ibbba :wink:

Mi raccomando ... un problema alla volta ... apriamolo, risolviamolo ed archiviamo la soluzione così alla fine abbiamo la situazione aggiornata e valida per tutti gli OS (... tanto si tratta di correggere codice c/c++ nel core).

Guglielmo

gpb01:
ci saranno tutte le modifiche da fare al "core" e le potremo raggruppare in uno zip da installare assieme alla nuova Toolchain :slight_smile:

Non credo siano cambiate molte cose da quando ho fatto la stessa cosa per Windows, vedi articolo pubblicato su Elettronica In (http://www.open-electronics.org/arduino-full-memory-upgrade-to-the-last-atmel-toolchain-version/), non c'è da modificare nulla nel core, c'è da modificare vari file include della toolchain cambiando l'ordine di invocazione delle dipendenze, è questo che crea problemi a come lavora Arduino.

Grazie Astro, ma ... purtroppo credo che alcune cose siano cambiate, difatti, sia con l'include originale che con il tuo ... si hanno una serie di problemi.

Comunque, problema per problema, si verificherà se il tuo include risolve o se invece saranno necessarie altre modifiche :wink:

Guglielmo

Cominciamo con il più semplice dei programmi :

void setup() {
  
}

void loop() {
  
}

... più semplice di così si muore :grin:

Appaiono una serie di problemi ... cominciamo a vedere se i primi sono da correggere oppure li possiamo solo considerare dei warnings e li trascuriamo.

/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void store_char(unsigned char, ring_buffer*)':
/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:98:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void __vector_18()':
/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:127:21: warning: unused variable 'c' [-Wunused-variable]
/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In member function 'void HardwareSerial::begin(long unsigned int, byte)':
/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:368:11: warning: unused variable 'current_config' [-Wunused-variable]
/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In member function 'virtual size_t HardwareSerial::write(uint8_t)':
/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:467:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
In file included from /Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.cpp:3:0:
/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h: In member function 'IPAddress::operator uint32_t()':
/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h:51:55: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h: In member function 'bool IPAddress::operator==(const IPAddress&)':
/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h:52:75: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
/Users/gpb01/Desktop/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h:52:108: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]

... che vengono fuori sia con che senza la sostituzione della "include" fornita da Astro.

A me sembrano warnings trascurabili, ma preferirei avere conferma prima di passare ai successivi. :wink:

Guglielmo

Alcuni warning sono sintomo di cattiva abitudine e possono portare il programmatore a commettere errori e qui il compilatore viene in aiuto emettendo dei warning.

Di cosa si tratta nello specifico non lo, bisogna studiare nel dettaglio il codice di arduino in corrispondenza di quei warning.

Diciamo che per il momento si possono pure tralasciare.

Mentre i warning che avvisano che un direttiva è stata ignorata devono mettere in allarme, perchè ignorare una direttiva PROGMEM comporta malfunzionamenti al programma.

Ciò che è cambiato è:
Ora c'è una funzione builtin di avr-gcc che viene usata da _delay_ms() e _delay_us(), che prendono entrambe un double.
Tuttavia è possibile disabilitare l'uso della builtin definendo DELAY_BACKWARD_COMPATIBLE

Ora i puntatori a pgm devono essere "const" ed è cosa ovvia, ma adesso il compilatore avvisa o termina in errore?
Sono deprecate le SIGNAL, che diventano ISR.

Non ci sono più gli alias prog_char ecc, ma c'è da vedere il file header pgmspace.h.

Non mi pare ci sia altro.

Ciao.

x iscrizione

Gli errori su HardwareSerial.cpp derivano principalmente da errori di scrittura del codice :stuck_out_tongue_closed_eyes:
Sono segnalati dei confronti tra una variabile "i" di tipo "int" ed i membri di una struct che sono solo di tipo unsigned, quindi il compilatore segnala appunto l'incongruenza di tipi.
Altra cosa buffa, sono gli errori su variabili dichiarate ma non usate nella funzione indicata. Sarebbe da fare una ripulitura e revisione del codice.

Gli errori su IPAddress non li capisco, quel "dereferencing type-punned pointer will break strict-aliasing rules" non so bene cosa voglia dire.
Per ora, più che di errori di compatibilità del codice con la nuova toolchain, vedo errori di stesura del codice :wink:

leo72:
...
Per ora, più che di errori di compatibilità del codice con la nuova toolchain, vedo errori di stesura del codice :wink:

Già ... credo infatti che il nuovo compilatore sia solo ... più esigente e preciso e quindi, tutti quelli che saltano/salteranno fuori, sono essenzialmente "errori di stesura del codice" !!! ]:smiley: ]:smiley: ]:smiley:

Guglielmo

PS:
io per dire la verità non ho mai controllato i warning perché la compilazione non la tengo "verbosa" perciò non so mai cosa viene fuori compilando :sweat_smile:
Anzi, ieri facendo la prova, ho notato un altro warning, che tu non hai, nella compilazione di uno sketch vuoto. Ma ora è troppo presto per ricordarmi che problema era, e non sono a casa per controllare

leo72:
...
Anzi, ieri facendo la prova, ho notato un altro warning, che tu non hai, nella compilazione di uno sketch vuoto. Ma ora è troppo presto per ricordarmi che problema era, e non sono a casa per controllare

... ce l'ho, ce l'ho, ma ... quello è molto più grave e me lo tenevo per dopo. Deciso che questi che ho esposto sono solo "warning trascurabili", passiamo a quello che è più importante :stuck_out_tongue_closed_eyes:

Come ho detto ... una cosa per volta o non riusciamo a fare una collezione esatta dei problemi/soluzioni :wink:

Guglielmo

Ok, accettiamo allora che le due serie di "warning" sopra riportate siano "warning trascurabili" dovuti ad una ... non ottima stesura del codice di Arduino :wink:

Il problema seguente mi sembra invece più importante ed andrebbe risolto :

/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.cpp: In member function 'size_t Print::print(const __FlashStringHelper*)':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.cpp:44:23: warning: '__progmem__' attribute ignored [-Wattributes]

... il fatto che ignori l'attributo progmem non va proprio bene e quindi occorre vedere come correggere Print.cpp per risolvere questo problema.

Ogni aiuto e suggerimento è ovviamente ben accetto :wink:

Guglielmo

Se apro l'IDE e compilo lo sketch con solo void setup e void loop ricevo gli errori di cui stiamo discutendo.
Se però prendo ed inserisco anche un solo spazio vuoto nel file e ricompilo, spariscono TUTTI gli errori... :astonished:
Se aggiungo un'istruzione REALE, come ad esempio la stampa su seriale con la funzione F() (costringendo quindi l'uso di PROGMEM), non ho nessuna segnalazione di errore! :astonished: :astonished:

leo72:
...
Se aggiungo un'istruzione REALE, come ad esempio la stampa su seriale con la funzione F() (costringendo quindi l'uso di PROGMEM), non ho nessuna segnalazione di errore! :astonished: :astonished:

:astonished: :astonished: :astonished: peggio .. invece a me, se nell loop() metto Serial.print (F("pippo")); ... proprio non compila più e mi da un errore :

prova.ino: In function 'void loop()':
prova.ino:11:16: error: variable '__c' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

Tu hai un esempio che compila correttamente SENZA warning ed errori ?

Guglielmo

No. Ottengo sempre quei warning.
Ho fatto caso ad una cosa, la seconda volta che compilo, anche se modifico il sorgente, non mi da più warning perché usa le lib che ha già compilato in precedenza. Me ne sono accorto rileggendo l'output sul terminale e poi cambiando chip, costringendo quindi l'IDE a ricompilare tutto da capo.

Scusa, prova a compilare questo :

void setup() {
  
  delay(2000);
  Serial.begin(9600);
  
}

void loop() {
  
  Serial.print(F("pippo"));
  
}

... piuttosto banale direi, ma ... non digerisce la Serial.print(F());

prova.ino: In function 'void loop()':
prova.ino:10:16: error: variable '__c' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

... e non capisco bene che attributo occorre aggiungere per eliminare l'errore (... porca zozza più costante di una stringa fissa ... boh) e comunque ... non vorrei fosse legato a quel warning che segnalavo prima (... nella Print.cpp) ... :frowning:

Guglielmo