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

Aspetta Michele ... questa nuova 3.4.3 ... sembra aver risolto parecchi problemi delle precedenti ... facci finire di fare le prove (se vuoi seguirle, le stiamo facendo nel thread della Toolchain per Mac, ma tanto abbiamo dimostrato che è la stessa cosa) così poi hai una situazione aggiornata ;)

Guglielmo

OK Guglielmo, il problema sarà però mettere a punto la procedura per Windows, grazie.

[quote author=Michele Menniti link=topic=96976.msg1496093#msg1496093 date=1386281534] OK Guglielmo, il problema sarà però mettere a punto la procedura per Windows, grazie. [/quote]

In realtà NO ... la procedura ormai è praticamente identica sulle tre piattaforme ed è veramente molto semplice ;)

Guglielmo

Un piccolo appunto per chi scarica la AVR toolchain 3.4.3 per Windows. Sulla pagina ufficiale di ATMEL: http://www.atmel.com/tools/atmelavrtoolchainforwindows.aspx ci sono 2 link, uno alla 3.4.2 (avr8 e avr32) e funziona. Quella al 3.4.3, almeno fino a stamattina, è errato e si risolve in una pagina inesistente. Il link è errato nella parte iniziale. C'e' una scritta che non serve e manca il www. Corretto il link allora scarica senza problemi. Ho segnalato alla Atmel, attendo risposta.

"cmsw1prd.atmel.com" è la parte iniziale errata, deve essere "www.atmel.com"

EDIT: secondo atmel succede solo a me. Hanno provato a scaricare come guest, peccato che sono già registrato e che se uso il fill form mi ri-registra (ma non verificano che la email che gli dò è già registrata? Che sito del menga!!! ).

nid69ita: EDIT: secondo atmel succede solo a me.

No, no, succede anche a me da Safari su MAC ... hanno proprio il link sbagliato ... ;)

Guglielmo

Confermo il link errato.

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 

in modo che risulti

#define __PROG_TYPES_COMPAT__
#include 

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 (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. ;)

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