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

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

A me la Serial.print con l'F() funziona.

Piuttosto, se io apro il file Print.cpp e sostituisco la funzione Print::print dalla riga 42 alla riga 54 con la seguente:

size_t Print::print(const __FlashStringHelper *ifsh)
{
  //const char PROGMEM *p = (const char PROGMEM *)ifsh; <-- codice originale
  PGM_P p = (PGM_P)ifsh; //nuovo codice
  size_t n = 0;
  while (1) {
    unsigned char c = pgm_read_byte(p++);
    if (c == 0) break;
    n += write(c);
  }
  return n;
}

non ottengo più nessun warning relativamente al file Print.cpp ed a progmem.

PS: la soluzione l'ho trovata studiando il reference del file avr/pgmspace.h:
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

EDIT:
no, non va bene. PGM_P viene sostituito con const char *, manca PROGMEM. Sarebbe da usare PSTR ma mi dice che non è dichiarato... :roll_eyes:

Allora, ho sostituito la linea ed effettivamente la copilazione va a buon fine, ma i warning si sprecano ... possibile che tu non li abbia ???

/Users/gpb01/Desktop/Prove Toolchain/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/Prove Toolchain/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/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void __vector_25()':
/Users/gpb01/Desktop/Prove Toolchain/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/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void __vector_36()':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:153:21: warning: unused variable 'c' [-Wunused-variable]
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void __vector_51()':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:168:21: warning: unused variable 'c' [-Wunused-variable]
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void __vector_54()':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:183:21: warning: unused variable 'c' [-Wunused-variable]
/Users/gpb01/Desktop/Prove Toolchain/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/Prove Toolchain/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/Prove Toolchain/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/Prove Toolchain/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/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.cpp:3:0:
/Users/gpb01/Desktop/Prove Toolchain/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/Prove Toolchain/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/Prove Toolchain/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/Prove Toolchain/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/Prove Toolchain/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]
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print copy.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 copy.cpp:44:23: warning: '__progmem__' attribute ignored [-Wattributes]

Quindi ... l'errore di prima SCOMPARE, ma i warning stanno sempre li ... :frowning:

Guglielmo

P.S. : Naturalmente "Show verbose output during compilation" ... altrimenti non li vedi :wink:

... i primi due gruppi credo siano sempre classificabili come "warning trascurabili" ma il terzo NO !!!

Nel senso ... compila, ma sembra che IGNORI l'attributo progmem e ... questo NON va bene :roll_eyes:

Guglielmo