[WIN] Aggiornam. compilatore IDE 0022-0023-1.0 all'ULTIMA VERSIONE ATMEL

Aggiornando la 1.5.5 con la ToolChain 3.4.3 anche un semplice sketch vuoto

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

si interrompe in fase di compilazione e da errore:

D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp: In member function 'String& String::copy(const __FlashStringHelper*, unsigned int)':
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp: In member function 'String& String::copy(const __FlashStringHelper*, unsigned int)':
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:189:26: error: ISO C++ forbids declaration of 'type name' with no type [-fpermissive]
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:189:26: error: ISO C++ forbids declaration of 'type name' with no type [-fpermissive]
  strcpy_P(buffer, (const prog_char *)pstr);
  strcpy_P(buffer, (const prog_char *)pstr);
                          ^
                          ^
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:189:26: error: ISO C++ forbids declaration of 'type name' with no type [-fpermissive]
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:189:26: error: ISO C++ forbids declaration of 'type name' with no type [-fpermissive]
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:189:20: error: expected primary-expression before 'const'
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:189:20: error: expected primary-expression before 'const'
  strcpy_P(buffer, (const prog_char *)pstr);
  strcpy_P(buffer, (const prog_char *)pstr);
                    ^
                    ^
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:189:20: error: expected ')' before 'const'
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:189:20: error: expected ')' before 'const'
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp: In member function 'String& String::operator=(const __FlashStringHelper*)':
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp: In member function 'String& String::operator=(const __FlashStringHelper*)':
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:249:39: error: ISO C++ forbids declaration of 'type name' with no type [-fpermissive]
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:249:39: error: ISO C++ forbids declaration of 'type name' with no type [-fpermissive]
  if (pstr) copy(pstr, strlen_P((const prog_char *)pstr));
  if (pstr) copy(pstr, strlen_P((const prog_char *)pstr));
                                       ^
                                       ^
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:249:39: error: ISO C++ forbids declaration of 'type name' with no type [-fpermissive]
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:249:39: error: ISO C++ forbids declaration of 'type name' with no type [-fpermissive]
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:249:33: error: expected primary-expression before 'const'
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:249:33: error: expected primary-expression before 'const'
  if (pstr) copy(pstr, strlen_P((const prog_char *)pstr));
  if (pstr) copy(pstr, strlen_P((const prog_char *)pstr));
                                 ^
                                 ^
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:249:33: error: expected ')' before 'const'
D:\arduino-1.5.5-TC343\hardware\arduino\avr\cores\arduino\WString.cpp:249:33: error: expected ')' before 'const'

Hai applicato la modifica che ha suggerito Mauro nell'altro thread?
Io con quella ottengo solo un paio di avvisi ma la compilazione termina senza errori.

Ho trovato le modifiche suggerite da MauroTec

MauroTec:
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;

Adesso cerco di capire cosa bisogna modificare e poi provo.

Ho visto che la pgmspace.h, nelle due toolchain (la vecchia dell'IDE 1.0.5 e la nuova 3.4.3), è diversa.
Tutta una serie di typedef, tra cui prog_char, sono stati deprecati.

Non ho capito però cosa c'è da cambiare in WString.cpp per farlo compilare correttamente.

Risolto.

Ho aggiunto in WString.h nel core di Arduino per avr

#define __PROG_TYPES_COMPAT__

prima di

#include <avr/pgmspace.h>

in modo che risulti

#define __PROG_TYPES_COMPAT__
#include <avr/pgmspace.h>

In questo modo vengono ripescati i metodi deprecati e non bisogna modificare tutto il core di Arduino. :grin:

in teoria se metti la define prima di tutto nel tuo .ino non funziona lo stesso?

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

void loop() {
  Serial.println(F("Test"));
  delay(1000);
}

Compilato su IDE 1.0.5 originale per Arduino UNO

Dimensione del file binario dello sketch: 2.126 bytes (su un massimo di 32.256 bytes)

Compilato su IDE 1.5.5 originale

Lo sketch usa 2.050 byte (6%) dello spazio disponibile per i programmi. Il massimo è 32.256 byte.
Le variabili globali usano 187 byte (9%) di memoria dinamica, lasciando 1.861 byte liberi per le variabili locali. Il massimo è 2.048 byte.

Compilato su IDE 1.5.5 con TC 3.4.3 per Arduino UNO

Lo sketch usa 1.866 byte (5%) dello spazio disponibile per i programmi. Il massimo è 32.256 byte.
Le variabili globali usano 187 byte (9%) di memoria dinamica, lasciando 1.861 byte liberi per le variabili locali. Il massimo è 2.048 byte.

Interessante... no!! :grin: :grin:

EDIT: provato anche 1.5.5 originale.

lesto:
in teoria se metti la define prima di tutto nel tuo .ino non funziona lo stesso?

C'è scritto di metterlo prima dell'include... e così ho fatto

/**
\ingroup avr_pgmspace
\typedef prog_char
\note DEPRECATED

This typedef is now deprecated because the usage of the progmem
attribute on a type is not supported in GCC. However, the use of the
progmem attribute on a variable declaration is supported, and this is
now the recommended usage.

The typedef is only visible if the macro PROG_TYPES_COMPAT
has been defined before including <avr/pgmspace.h> (either by a
#define directive, or by a -D compiler option.)

Type of a "char" object located in flash ROM.
*/
typedef char PROGMEM prog_char;

Paolo, ciò che scrivi significa che hai trovato la sequenza esatta di operazioni per l'aggiornamento alla nuova toolchain?
Se è così ti spiacerebbe, basandoti sul primo post, implementare la procedura, in modo che sia chiara e fattibile da chiunque, perfino da me? :grin:

Domani testo qualche codice più lungo e complesso e ti aggiorno.

Paolo, uno sketch vuoto è un test ma non è IL test. Hai provato con l'esempio WiFiWebServer della libreria WiFi? Quella dà un sacco di problemi, se compili quella sei a posto. :wink:

leo72:
Paolo, uno sketch vuoto è un test ma non è IL test. Hai provato con l'esempio WiFiWebServer della libreria WiFi? Quella dà un sacco di problemi, se compili quella sei a posto. :wink:

Leo, con la 3.4.3, a parte un po' di warning del tipo :

/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.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 3.4.3.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)); };
                                                                           ^

... compila, come già ho avuto modo di dire nel thread del MAC, WiFiWebServer senza problemi :wink:

Per risolvere questo tipo di warning su IPaddress, ho visto che Mauro, nell'apposito thread, a proposto una possibile soluzione ... certo che tocca mettere le mai in vari punti del core relativo alla parte TCP/IP.

Guglielmo

Sì ma difatti io mi riallacciavo a QUELLA modifica. Io l'ho apportata e compila anche il WiFiWebServer SENZA errori. :smiley:
Solo un paio di alert su qualcos che trova incongruente (confronti fra tipi, se non ricordo male). Ma con quel fix, fatto in Print.cpp e non in WString come ha fatto Paolo, l'errore scompare. Su Mac, su altri SO non so. :*

Certo, c'è da dire che una cosa è la modifica per il problema di PGMSPACE da fare in Print.cpp, modifica che è abbastanza semplice ed indolore, un'altra è quella proposta QUI per il problema dei warning su IPaddress ... mi sembra piuttosto più complessa da gestire e credo richieda una serie di modifiche a vari files ... :roll_eyes:

Guglielmo

leo72:
Su Mac, su altri SO non so. :*

non capisco perchè pensate che la stessa tool-chian, su differenti arch abbia comportamenti diversi.
Avreste regione se usaste risorse fornite dal SO come socket o driver vari, ma invece sono scollegati se non per la gestione delle risorse ram e cpu per l'esecuzione del compilatore

lesto:
non capisco perchè pensate che la stessa tool-chian, su differenti arch abbia comportamenti diversi.

SI, infatti, mi sembra ormai provato che, a parità di modifiche, il comportamento è esattamente lo stesso (... e sarebbe grave il contrario ... stiamo parlando di uguali sorgenti semplicemente compilati su diverse piattaforme) :wink:

Guglielmo

Lesto, hai ragione. La toolchain è la stessa versione per i 3 SO, mi scordo sempre di questa cosa. sorry sorry :sweat_smile:

lock:
...
e con la roba GNU non ti deve affatto stupire, non hai idea di quante volte mi sia successo, stesso identico codice comportamento del compilato diverso, e ai fatti in prima istanza cosa era cambiato ?

  • l'environment
  • un sacco di macro nel codice attivato dall'environment con possibili sviste/bachi e mal configure, inside
  • altri casini legati alle lib linkate (a volte banali casini di endian, tipico nei casi x86 vs ppc, a volte cose peggiori)
    ...

Mmmm ... effettivamente ...

Comunque, al momento, per quello che abbiamo verificato, fortunatamente il comportamento è uguale su tutte e tre le piattafome :wink:

Guglielmo

PaoloP:
Domani testo qualche codice più lungo e complesso e ti aggiorno.

Ok, ho provato a compilare diversi esempi allegati alle librerie dell'IDE 1.5.5 con la TC 3.4.3.
A parte qualche warnigs nascosto dalle impostazioni di default, la compilazione avviene sempre con successo.
Non ho fatto l'upload del codice su Arduino, non ho la WiFi shield.
Se riesco, recupero la Ethernet shield che ho nel cassetto la monto sulla UNO R3 e faccio qualche prova.

La cosa che mi rallegra è che, finalmente, la dimensione del codice decresce invece di aumentare. :wink:

PaoloP:
La cosa che mi rallegra è che, finalmente, la dimensione del codice decresce invece di aumentare. :wink:

Io uso quella Atmel da 1 anno buono e di questo "beneficio" me ne sono accorto anche con le toolchain precedenti (3.4.1 e 3.4.2).