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

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.