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

Cacchio ho sbagliato a scrivere, però penso che si capisse il senso no.

PGM_P p = (PGM_P)ifsh;

Quando si usa F o PSTR accadono due cose fondamentali: Si dice al compilatore di trattare una string literal in modo particolare, cioè scrivimela nella flash questa string. Inoltre si dice di ritornare un puntatore in flash (16bit) che punta al primo indirizzo in cui hai conservato la literal string e di castarlo ad un puntatore commestibile. Ora a rigor di logica PGM_P o const char * sono la stessa cosa e possono conservare benissimo un puntatore ad un indirizzo in flash, da notare che il puntatore in flash diventa tale quando lo usiamo come le funzioni pgm_ecc e gli possiamo far puntare qualunque indirizzo a 16bit anche in ram, tra l'altro "p" risiede in ram, ma il contenuto è un indirizzo della flash.

Ciao.

PaoloP: Compilato per Arduino Leonardo .... .... Per la UNO ....

... e non ti sembra di riscontrare ... gli STESSI problemi ??? E lo stesso warning sulla Print.cpp ??? :astonished: :astonished:

Quindi ... anche la 1.0.5 UFFICIALE sta ignorando l'attributo 'progmem' ??? :roll_eyes: :roll_eyes: :roll_eyes:

Guglielmo

dicono che non è vero che ognori... forse settano più volte l'attributo e solo uno viene ignorato, non so.

Però è facile da verificare, fai una stringa da mille caratteri e vedi se aumenta la flash o no se cambia l'uso di ram stimato :)

MauroTec: Cacchio ho sbagliato a scrivere, però penso che si capisse il senso no.

PGM_P p = (PGM_P)ifsh;

Ecco cosa dice:

In file included from /Applications/Arduino 1.0.5 mod.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.cpp:3:0:
/Applications/Arduino 1.0.5 mod.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h: In member function 'IPAddress::operator uint32_t()':
/Applications/Arduino 1.0.5 mod.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h:51:55: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
     operator uint32_t() { return *((uint32_t*)_address); };
                                                       ^
/Applications/Arduino 1.0.5 mod.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h: In member function 'bool IPAddress::operator==(const IPAddress&)':
/Applications/Arduino 1.0.5 mod.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h:52:75: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
     bool operator==(const IPAddress& addr) { return (*((uint32_t*)_address)) == (*((uint32_t*)addr._address)); };
                                                                           ^
/Applications/Arduino 1.0.5 mod.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h:52:108: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
     bool operator==(const IPAddress& addr) { return (*((uint32_t*)_address)) == (*((uint32_t*)addr._address)); };
                                                                                                            ^

Solo warning, compila.

gpb01: Però, scusate, c'è qualche cosa che non capisco ...

Certo che ti da tutte quelle warning, è normale, togli la F e vedrai che spariscono tutte, immagino che non devo spiegarti il motivo :D

Ho visto solo ora la discussione qui http://forum.arduino.cc/index.php?topic=96976.new;boardseen#new Continuo qui per non spezzare la discussione.

I passaggi che ho fatto ad alta voce sono appunto dei passaggi frutto di ragionamento logico, e non sono la soluzione. Il codice originale funziona anche se il compilatore emette dei warning, questo è sicuro perché il problema è nel cast in questione che ora sembra risolto stando al post di leo, dove mi sembra che sia sparito il warning.

Il fatto che il compilatore ignori PROGMEM è cosa buona e giusta perché PROGMEM viene usato solo per dire al compilatore: L'oggetto che ha l'attributo PROGMEM devi metterlo in flash. Mentre const char * è la dichirazione del tipo con il qualificatore const. Capite non ha senso castare a const PROGMEM char* perché manca l'oggetto a cui applicare l'attributo PROGMEM, cioè l'oggetto string literal, questa va comunque in flash grazie a F che ho mostrato in cosa si espande ed è comprensibile che PROGMEM si riferisce a string literal.

Quindi si possono lasciare le cose come stanno oppure per correttezza modificare il cast, perché ad essere ignorato è solo il secondo attributo inutile nel cast. Sono cosciente che in passato avevo detto che se ignora PROGMEM allora la string literal non va in flash, e mi sbagliavo evidentemente. Probabilmente mi sono confuso e per qualche motivo ho dimenticato PSTR o F che già contengono PROGMEM e questo non viene ignorato.

@gpb01 Tu avevi provato uno sketch che non compilava, ora non ricordo il programma ma aveva a che fare con il wifi, ecco quello è un errore più rognoso che non saprei proprio risolvere. Però mi pare di aver capito che l'errore è scomparso con la 3.4.3, o no?

Ciao.

astrobeed: Certo che ti da tutte quelle warning, è normale, togli la F e vedrai che spariscono tutte, immagino che non devo spiegarti il motivo :D

Ovvio Astro ... la mia sorpresa era dovuta al fatto che gli stessi warning li produce anche la toolchain originale inserita nell'IDE e da qui la mia sorpresa/domanda : "che ce stamo a sbatte a fa' se pure quella loro ce fa' la stessa cosa ???" :grin: :grin: :grin:

Guglielmo

MauroTec:
@gpb01
Tu avevi provato uno sketch che non compilava, ora non ricordo il programma ma aveva a che fare con il wifi, ecco quello è un errore più rognoso che non saprei proprio risolvere. Però mi pare di aver capito che l’errore è scomparso con la 3.4.3, o no?

Si, con la 3.4.3 almeno arriva fino in fondo … ho preso l’esempio della libreria WiFi “WiFi web Client” ed ecco il risultato (allegato come file di testo).

Mi sembrano tutti warning … diciamo “trascurabili” :wink:

Guglielmo

compilazione.txt (13.8 KB)

Ottengo gli stessi risultati. Quindi possiamo dire che il problema sia stato risolto grazie a Mauro :D

leo72: Ottengo gli stessi risultati. Quindi possiamo dire che il problema sia stato risolto grazie a Mauro :D

Si, anche se ... sembra NON fosse un problema ... ... visto che, come è dimostrato, gli stessi warning sulla Print.cpp esistono nell'IDE con la toolchain ufficiale e che quindi ... avendolo capito prima ... [u]ci saremmo evitati tutto lo sbattimento[/u] :grin: XD :grin: XD

Anzi, direi che per semplificare la vita agli utenti, nelle "istruzioni per installare la nuova toolchain" non parleremo proprio della modifica di Print.cpp ... ma solo di cosa sostituire e dove ;)

Guglielmo

Ciao a tutti e Buon Anno!!!..Volevo comunicare che grazie all’instancabile lavoro di Guglielmo(che ringrazio) sono riuscito a compilare lo sketch del mio sistema demotico basato su Arduino Mega passando da 63877 bytes a 60994 bytes grazie al nuovo compilatore!!!..lo sketch gira senza problemi,i soliti warming trascurabili in fase di compilazione ma per il resto tutto OK!!..

Benissimo. :grin:

Penso che ti meriteresti un maglietta --> https://groups.google.com/a/arduino.cc/forum/?fromgroups#!topic/developers/21G5w2HbUOg

Non sarebbe il caso di spostare questo topic in Megatopic dove ci sono gli altri due per gli aggiornamenti su Linux e Windows?

PaoloP: Penso che ti meriteresti un maglietta ...

... suggerisciglielo :grin: :grin: :grin: ... e ... visto mai che ... si accorgono anche di questo thread dove la metà dei problemi li avevamo già affrontati e risolti ]:D ]:D ]:D

PaoloP: Non sarebbe il caso di spostare questo topic in Megatopic dove ci sono gli altri due per gli aggiornamenti su Linux e Windows?

E' Leo che gestisce la cosa ... ;)

Guglielmo

Mi pare che si possa fare. ;)

ehm leo, ma per linux, scarichi il tar e dezippo? quale dei 3 tar che ci sono?domani vorrei buttarmici sopra un pò

Scusa Lesto, io sono un pò tardivo.... a cosa ti stai riferendo? :sweat_smile:

Il topic di Linux è questo --> http://forum.arduino.cc/index.php?topic=97237.0 @Leo Potresti rieditare il primo post creando una sorta di guida all'aggiornamento come è stato fatto da Michele e Guglielmo. Perchè altrimenti uno dovrebbe leggere tutti i post.

grazie paolo, è esattamente quell che cercavo. utilimamente sono abbastanza attivo, volevo codare un pò per la comunità, in particolare pulire i warning dalle librerie ufficiali :)