mmm....le risate me le faccio volentieri, ma si tratta comunque di una macro, quindi una #define.
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;
Purtroppo io non posso provare.
Tutti gli altri errori sono dei warning che da bravo il compilatore emette e che è possibile farli scomparire usando il flag opportuno inserito nella variabile ambiente CXX_FLAGS, ma ovviamente non è la soluzione corretta, in quanto questi warning sono utili quando scriviamo codice che ancora non sappiamo lavori correttamente.
Ciao.