[MAC] Aggiornamento IDE 1.0x all'ultima versione Atmel Toolchain

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.