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

Mi rifersico al punto 11 della guida che ho linkato che cita così : "A questo punto entrate nella cartella “MyPath\arduino-0022-tcnew\examples\”, eliminate la cartella ArduinoISP (e lo sketch che contiene) e aggiungete la cartella “ArduinoISP101”, che è la nuova versione di questo sketch, in dotazione all’IDE 1.0.1-rc1." eccetera, eccetera... Io la cartella non l'ho sostituita perchè ho il sentore che non serva più farlo, comunque domani dovrei rimediare un micro e provo se funziona l'ISP.

aaaah, ok, hai fatto bene; quell'operazione consisteva nell'adottare come sketch ArduinoISP quello scritto da Leo72 al posto dell'originale, che aveva delle problematiche, poi risolte, ecco perché non trovi più traccia della cosa nelle istruzioni, lo skecth ArduinoISP delle nuove versioni IDE funziona benissimo allo scopo, quindi il passaggio lo devi saltare; scusami ma proprio l'avevo "rimossa" questa cosa. :~

Ok, nessun problema e grazie della conferma :wink:

Sul topic relativo all'aggiornamento della TC per MAC si è trovato un errore riguardo PROGMEM.
Non ho provato ad aggiornare alla 3.4.3, qualcuno che l'ha fatto anche su Windows, ha notato lo stesso problema.

Confermo che le ultime release della toolchain Atmel non sono più utilizzabili con Arduino a meno di non mettersi a fare molte modifiche sia nella toolchain che nel core.

Ma se quello che scrive @MauoTec nel topic per [mac] è la soluzione ovvero

const char PROGMEM *p => const PROGMEM char  *p

l'inversione del qualificatore (tra le altre cose),
diventa impossibile da fare, perchè oltre al core bisognerebbe anche modificare librerie di terze parti, no !?!

esatto

nid69ita:
Ma se quello che scrive @MauoTec nel topic per [mac] è la soluzione ovvero

const char PROGMEM *p => const PROGMEM char  *p

l'inversione del qualificatore (tra le altre cose),
diventa impossibile da fare, perchè oltre al core bisognerebbe anche modificare librerie di terze parti, no !?!

Purtroppo NON è quella la soluzione ... prova e vedrai che continua a non andare bene ...

/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:23: warning: '__progmem__' attribute ignored [-Wattributes]
   const PROGMEM char *p = (const char PROGMEM *)ifsh;
                       ^

Guglielmo

astrobeed:
Confermo che le ultime release della toolchain Atmel non sono più utilizzabili con Arduino a meno di non mettersi a fare molte modifiche sia nella toolchain che nel core.

riesci a dirmi qual è l'ultima versione utilizzabile? Così aggiorno il primo post e metto un avviso in tal senso; anch'io avevo tentato di ripetere l'operazione con l'ultima TC ma mi ero già perso a livello di percorsi e cartelle :~

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 :wink:

Guglielmo

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

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

Guglielmo

Un piccolo appunto per chi scarica la AVR toolchain 3.4.3 per Windows.
Sulla pagina ufficiale di ATMEL:

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 ... :wink:

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