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

Scusa, prova a compilare questo :

void setup() {
  
  delay(2000);
  Serial.begin(9600);
  
}

void loop() {
  
  Serial.print(F("pippo"));
  
}

... piuttosto banale direi, ma ... non digerisce la Serial.print(F());

prova.ino: In function 'void loop()':
prova.ino:10:16: error: variable '__c' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

... e non capisco bene che attributo occorre aggiungere per eliminare l'errore (... porca zozza più costante di una stringa fissa ... boh) e comunque ... non vorrei fosse legato a quel warning che segnalavo prima (... nella Print.cpp) ... :frowning:

Guglielmo

A me la Serial.print con l'F() funziona.

Piuttosto, se io apro il file Print.cpp e sostituisco la funzione Print::print dalla riga 42 alla riga 54 con la seguente:

size_t Print::print(const __FlashStringHelper *ifsh)
{
  //const char PROGMEM *p = (const char PROGMEM *)ifsh; <-- codice originale
  PGM_P p = (PGM_P)ifsh; //nuovo codice
  size_t n = 0;
  while (1) {
    unsigned char c = pgm_read_byte(p++);
    if (c == 0) break;
    n += write(c);
  }
  return n;
}

non ottengo più nessun warning relativamente al file Print.cpp ed a progmem.

PS: la soluzione l'ho trovata studiando il reference del file avr/pgmspace.h:
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

EDIT:
no, non va bene. PGM_P viene sostituito con const char *, manca PROGMEM. Sarebbe da usare PSTR ma mi dice che non è dichiarato... :roll_eyes:

Allora, ho sostituito la linea ed effettivamente la copilazione va a buon fine, ma i warning si sprecano ... possibile che tu non li abbia ???

/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void store_char(unsigned char, ring_buffer*)':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:98:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void __vector_25()':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:127:21: warning: unused variable 'c' [-Wunused-variable]
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void __vector_36()':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:153:21: warning: unused variable 'c' [-Wunused-variable]
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void __vector_51()':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:168:21: warning: unused variable 'c' [-Wunused-variable]
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void __vector_54()':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:183:21: warning: unused variable 'c' [-Wunused-variable]
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In member function 'void HardwareSerial::begin(long unsigned int, byte)':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:368:11: warning: unused variable 'current_config' [-Wunused-variable]
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In member function 'virtual size_t HardwareSerial::write(uint8_t)':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:467:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
In file included from /Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.cpp:3:0:
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h: In member function 'IPAddress::operator uint32_t()':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h:51:55: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h: In member function 'bool IPAddress::operator==(const IPAddress&)':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h:52:75: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h:52:108: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print copy.cpp: In member function 'size_t Print::print(const __FlashStringHelper*)':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print copy.cpp:44:23: warning: '__progmem__' attribute ignored [-Wattributes]

Quindi ... l'errore di prima SCOMPARE, ma i warning stanno sempre li ... :frowning:

Guglielmo

P.S. : Naturalmente "Show verbose output during compilation" ... altrimenti non li vedi :wink:

... i primi due gruppi credo siano sempre classificabili come "warning trascurabili" ma il terzo NO !!!

Nel senso ... compila, ma sembra che IGNORI l'attributo progmem e ... questo NON va bene :roll_eyes:

Guglielmo

  1. pare che copi dalla Flash.... la dimensione è identica al file compilato con la lib originale.

  2. quei warning li ho anch'io ma sono riferiti a HardwareSerial.cpp mentre ora stavamo parlando di Print.cpp :wink:
    Comunque a vederli sono sempre derivanti dal codice non riveduto, se noti sono segnalazioni di variabili non utilizzate o confronti fra tipi di dato differenti.
    Gli ultimi warning, quelli da IPaddress, come detto in precedenza, non li capisco proprio.

Aggiungo una piccola cosa a proposito dei warning sulla HardwareSerial.cpp
Li da anche con IDE 1.05 STANDARD, con toolschain non aggiornata:

H:\Arduino\STANDARD_arduino-IDE\hardware\arduino\cores\arduino\HardwareSerial.cpp:127: warning: unused variable 'c'

Dal mio percorso si vede che ho usato la versione originale che ho tenuto (non si sa mai)

leo72:
...
2) quei warning li ho anch'io ma sono riferiti a HardwareSerial.cpp mentre ora stavamo parlando di Print.cpp :wink:
Comunque a vederli sono sempre derivanti dal codice non riveduto, se noti sono segnalazioni di variabili non utilizzate o confronti fra tipi di dato differenti.
Gli ultimi warning, quelli da IPaddress, come detto in precedenza, non li capisco proprio.

Leo, naturamente stai usando l'IDE 1.0.5 ufficiale NON una tua night build vero ??? XD Perché dobbiamo fare una cosa generica per tutti, non per chi si compila anche l'IDE :wink:

Io parlavo del terzo gruppo di warning :

/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print copy.cpp: In member function 'size_t Print::print(const __FlashStringHelper*)':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print copy.cpp:44:23: warning: '__progmem__' attribute ignored [-Wattributes]

che riguarda proprio Print.cpp riga 44 in cui ... IGNORA l'attributo progmem (... ma almeno con la tua modifica arriva a fine compilazione) !!!

Guglielmo

Io ho una 1.0.5 che ho scaricato un mesetto fa da Github e ricompilato... :sweat_smile: non credo però abbia modifiche a questi file.

leo72:
Gli ultimi warning, quelli da IPaddress, come detto in precedenza, non li capisco proprio.

Nella classe IPAddress c'e' un membro private di nome _address e questa funzione sembra che ne ritorni il puntatore.

operator uint32_t() { return *((uint32_t*)_address); };

L'errore punta come colonna esattamente all'ultima s di _address
Secondo me si può ignorare come errore.

leo72:

size_t Print::print(const __FlashStringHelper *ifsh)

{ const char PROGMEM *p = (const char PROGMEM *)ifsh; <-- codice originale
...  return n;
}



PS: la soluzione l'ho trovata studiando il reference del file avr/pgmspace.h:

Ma scusate, la PROGMEM metterebbe la variabile nel memoria programma invece che in ram, giusto?
Capisco che si chieda di fare questo per una variabile globale, ma per una variabile interna ad una funzione?
Non è che ora il compilatore tende ad ignorare la PROGMEM perchè, oltre a const vuole anche che si dichiari static, qualificazione
che prima faceva da solo ?

Difatti non sono sicuro al 100% del mio fix.
Probabile che facendo come dici tu sia meglio.

Mettendo static in quella funzione il warning di ignorato progmem sparisce

size_t Print::print(const __FlashStringHelper *ifsh)
{ static const char PROGMEM *p = (const char PROGMEM *)ifsh; // qui static
  size_t n = 0;
  while (1) {
    unsigned char c = pgm_read_byte(p++);
    if (c == 0) break;
    n += write(c);
  }
  return n;
}

ma appare:

H:\Arduino\ArduinoERW105\hardware\arduino\cores\arduino\Print.cpp:44: warning: only initialized variables can be placed into program memory area

Che indendoi per "mettendo static" ??? Dove ???

Cortesemente riportiamo sempre il codice completo ... altrimenti è impossibile fare delle prove congrue tutti assieme :wink:

E comunque ... se vogliamo essere sicuri che la variabile venga messa VERAMENTE nella PROGMEM ... dobbiamo trovare il modo di far scomparire quel warning :slight_smile:

Guglielmo

P.S. : Anche perché, risolto quello, ho idea che ne risolveremo altri simili, in altri punti, mano mano che compariranno :wink:

Per inciso Leo, ho provato a modificare quella tua riga così :

//const char PROGMEM *p = (const char PROGMEM *)ifsh;
PROGMEM PGM_P p = (PROGMEM PGM_P)ifsh;

... la compilazione va a buon fine (come prevedibile) ma rimane questo warning :

/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL.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.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.cpp:45:17: warning: '__progmem__' attribute ignored [-Wattributes]

... ora, puoi verificare (... magari disassemblando il codice) se comunque, nonostante il warning, la stringa viene prelevata dalla Flash e non dalla RAM in fase di esecutione ??? Perché, in caso affermativo, diventerebbe un "warning trascurabile" :wink:

Guglielmo

Secondo me non cambia molto, PGM_P dovrebbe essere un alias per "const char *", quindi è senza PROGMEM. Compila senza warning perché appunto non usa l'attributo progmem.
Se aggiungi PROGMEM, torni alla condizione iniziale, ossia riottieni esattamente la linea di codice inizialmente commentata, per cui torna fuori il warning.

leo72:
Secondo me non cambia molto, PGM_P dovrebbe essere un alias per "const char *", quindi è senza PROGMEM. Compila senza warning perché appunto non usa l'attributo progmem.
Se aggiungi PROGMEM, torni alla condizione iniziale, ossia riottieni esattamente la linea di codice inizialmente commentata, per cui torna fuori il warning.

Si, Si, quello lo avevo visto ...
... quello che ti chiedevo se magari potevi dare un'occhiata al codice compilato e ... riuscire a capire se comunque usava la PROGMEM (... e quindi era un warning trascurabile) o meno (... e quindi era un vero problema) :wink:

Grazie,

Guglielmo

P.S. : Ho già effettuato anche io il disassembleggio con avr-objdump ma ... sono piuttosto arruginito con l'assembler e, di sicuro, non conosco quello Atmel di questi micro ... :grin:

Non lo conosco neanche io così a fondo, cosa credi :wink:
Ci darò un'occhiata... :smiley:

leo72:
Non lo conosco neanche io così a fondo, cosa credi :wink:
...

SICURAMENTE più di me :grin: :grin: :grin:

Guglielmo

P.S. : Parlassimo di quello Intel x86 sarebbe un'altra cosa ... :wink:

Compilando con la mia modifica:

PGM_P p = (PGM_P)ifsh;

Nel disassemblato si trova la stringa salvata in Flash:

00000068 <_ZZ5setupE3__c>:
  68:	4d 41 52 49 4f 00                                   MARIO.

Usando il codice originale, si trova la stringa in Flash:

00000068 <_ZZ5setupE3__c>:
  68:	4d 41 52 49 4f 00                                   MARIO.

Compilando senza usare la funzione F(), la stringa in Flash non c'è.

Non facciamo che quella è una variabile locale della funzione setup(), ma mi sembra strano trovarla li, anche perchè se no secondo l'esempio dovrebbe trovarsi in loop().

allega il disassemblato, please.

Ciao.