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.