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

gpb01: Non credo ... è semplicemente cambiata la sintassi ... ... la vecchia :

const prog_uint16_t pippo PROGMEM = 1;

diventa, nella nuova sintassi : :

const uint16_t pippo __attribute__ (( __progmem__ )) = 1;

Ma la PROGMEM non è una #define ? Se si, si potrebbe "aggiungere" o cambiare questa define come "attribute (( progmem )) " ?

nid69ita: Ma la PROGMEM non è una #define ? Se si, si potrebbe "aggiungere" o cambiare questa define come "attribute (( progmem )) " ?

Rimandato a Settembre, vai a studiare ... http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html ... XD XD XD

Guglielmo

gpb01: Rimandato a Settembre, vai a studiare ...

gpb01:

nid69ita: Ma la PROGMEM non è una #define ? Se si, si potrebbe "aggiungere" o cambiare questa define come "attribute (( progmem )) " ?

Rimandato a Settembre, vai a studiare ... http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html ... XD XD XD Guglielmo

Boh, forse non ho capito io ma al link che hai messo si vede che la PROGMEM è una define:

#define     PROGMEM   __ATTR_PROGMEM__

Perciò questo

const prog_uint16_t pippo PROGMEM = 1;

diventa con l'attuale toolchain

const prog_uint16_t pippo  __ATTR_PROGMEM__ = 1;

Ma se la nuova sitassi è questa:

const uint16_t pippo __attribute__ (( __progmem__ )) = 1;

modificare la #define in

#define     PROGMEM  (__attribute__ (( __progmem__ )))

Non porterebbe la sostituzione alla nuova sintassi ?

https://github.com/arduino/Arduino/pull/1448

(notare che spunta sempre fuori leo)

mmm…le risate me le faccio volentieri, ma si tratta comunque di una macro, quindi una #define.

L’attributo è “attribute (( progmem ))”.
Quando il parser di gcc incontra attribute sa che deve comportarsi in modo diverso in base all’attributo specificato dopo il token attribute. Di attributi oltre a progmem c’è n’è tanti altri alcuni dipendenti dalla architettura e/o piattaforma.

Allora la define PROGMEM sarà simile a:

#define PROGMEM             __attribute__ (( __progmem__ ))

Il problema con il core parte da qui:

//  WString.h - String library for Wiring & Arduino
class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

PSTR(s) ((const PROGMEM char *)(s)), è un cast di una literal string a puntatore in progmem, cioè:

((const PROGMEM char *)("miastringinprogmem"))

La define F totalmente espansa diventa:

(reinterpret_cast<const __FlashStringHelper *>(((const __attribute__ (( __progmem__ )) char *)("miastringinprogmem")))

Che equivale a dire: miastringinprogmem viene trasformata in un puntatore const PROGMEM char * il quale viene interpretato come puntatore a FlashStringHelper che è una forward declare di una classe inesistente. Tutto sto popò di cast solo per fare in modo che C++ sia in grado di scegliere il metodo corretto da chiamare.

La print da così:

size_t Print::print(const __FlashStringHelper *ifsh)
{
  const char PROGMEM *p = (const char PROGMEM *)ifsh;
  size_t n = 0;

dovrebbe diventare

size_t Print::print(const __FlashStringHelper *ifsh)
{
  const PROGMEM char *p = (const PROGMEM char *)ifsh;
  size_t n = 0;

Anche se p dovrebbe essere:

PGM_P p =  (const PROGMEM char *)ifsh;

PROGMEM dice:
Attribute to use in order to declare an object being located in flash ROM.

Mentre const __FlashStringHelper *ifsh è un puntatore e pertanto il cast dovrebbe essere ancora più semplice

PGM_P p =  (PGM)ifsh;

Purtroppo io non posso provare.

Tutti gli altri errori sono dei warning che da bravo il compilatore emette e che è possibile farli scomparire usando il flag opportuno inserito nella variabile ambiente CXX_FLAGS, ma ovviamente non è la soluzione corretta, in quanto questi warning sono utili quando scriviamo codice che ancora non sappiamo lavori correttamente.

Ciao.

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

Scaricate la 1.0.5 UFFICIALE con la SUA toolchain, nelle preferenze mettete "verbose" per la compilazione e compilate queste quattro righe :

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

void loop() {  
  Serial.print(F("Stringa di prova"));
}

... controllate cortesemente tutti i dettagli della compilazione e mi dite quali warning trovate ... :roll_eyes:

GRAZIE !

Guglielmo

MauroTec: ..... Mentre const __FlashStringHelper *ifsh è un puntatore e pertanto il cast dovrebbe essere ancora più semplice

PGM_P p =  (PGM)ifsh;

...

Ciao Mauro, te l'ho fatta io la prova :

/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.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 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.cpp:44:15: error: 'PGM' was not declared in this scope
   PGM_P p =  (PGM)ifsh;
               ^

Guglielmo

lesto: https://github.com/arduino/Arduino/pull/1448

(notare che spunta sempre fuori leo)

Faccio quel che posso per essere sempre al centro dell'attenzione ;)

Compilato per Arduino Leonardo

sketch_dec05a.ino: In function 'void loop()':
sketch_dec05a.ino:7: warning: only initialized variables can be placed into program memory area
F:\arduino-1.0.5\hardware\arduino\cores\arduino\wiring.c:264:3: warning: #warning Timer 2 not finished (may not be present on this CPU)
F:\arduino-1.0.5\hardware\arduino\cores\arduino\wiring.c:273:3: warning: #warning Timer 2 not finished (may not be present on this CPU)
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp: In function 'void store_char(unsigned char, ring_buffer*)':
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp:98: warning: comparison between signed and unsigned integer expressions
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp: In function 'void __vector_25()':
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp:153: warning: unused variable 'c'
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp: In member function 'void HardwareSerial::begin(long unsigned int, byte)':
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp:368: warning: unused variable 'current_config'
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp: In member function 'virtual size_t HardwareSerial::write(uint8_t)':
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp:467: warning: comparison between signed and unsigned integer expressions
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HID.cpp: In member function 'virtual size_t Keyboard_::write(uint8_t)':
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HID.cpp:514: warning: unused variable 'r'
F:\arduino-1.0.5\hardware\arduino\cores\arduino\Print.cpp: In member function 'size_t Print::print(const __FlashStringHelper*)':
F:\arduino-1.0.5\hardware\arduino\cores\arduino\Print.cpp:44: warning: '__progmem__' attribute ignored
F:\arduino-1.0.5\hardware\arduino\cores\arduino\Tone.cpp:210:12: warning: #warning this may not be correct
F:\arduino-1.0.5\hardware\arduino\cores\arduino\Tone.cpp:110: warning: only initialized variables can be placed into program memory area
Dimensione del file binario dello sketch: 4.366 bytes (su un massimo di 28.672 bytes)

Per la UNO

sketch_dec05a.ino: In function 'void loop()':
sketch_dec05a.ino:7: warning: only initialized variables can be placed into program memory area
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp: In function 'void store_char(unsigned char, ring_buffer*)':
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp:98: warning: comparison between signed and unsigned integer expressions
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp: In function 'void __vector_18()':
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp:127: warning: unused variable 'c'
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp: In member function 'void HardwareSerial::begin(long unsigned int, byte)':
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp:368: warning: unused variable 'current_config'
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp: In member function 'virtual size_t HardwareSerial::write(uint8_t)':
F:\arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp:467: warning: comparison between signed and unsigned integer expressions
F:\arduino-1.0.5\hardware\arduino\cores\arduino\Print.cpp: In member function 'size_t Print::print(const __FlashStringHelper*)':
F:\arduino-1.0.5\hardware\arduino\cores\arduino\Print.cpp:44: warning: '__progmem__' attribute ignored
F:\arduino-1.0.5\hardware\arduino\cores\arduino\Tone.cpp:119: warning: only initialized variables can be placed into program memory area
Dimensione del file binario dello sketch: 2.034 bytes (su un massimo di 32.256 bytes)

Con PGM_P p = (PGM)ifsh; dà errore e si ferma.

/Applications/Arduino 1.0.5 mod.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.cpp: In member function 'size_t Print::print(const __FlashStringHelper*)':
/Applications/Arduino 1.0.5 mod.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.cpp:46:15: error: 'PGM' was not declared in this scope
   PGM_P p =  (PGM)ifsh;
               ^

Con PGM_P p = (const PROGMEM char *)ifsh; dà warning ma compila :

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)); };
                                                                                                            ^

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