Alcuni warning sono sintomo di cattiva abitudine e possono portare il programmatore a commettere errori e qui il compilatore viene in aiuto emettendo dei warning.
Di cosa si tratta nello specifico non lo, bisogna studiare nel dettaglio il codice di arduino in corrispondenza di quei warning.
Diciamo che per il momento si possono pure tralasciare.
Mentre i warning che avvisano che un direttiva è stata ignorata devono mettere in allarme, perchè ignorare una direttiva PROGMEM comporta malfunzionamenti al programma.
Ciò che è cambiato è:
Ora c'è una funzione builtin di avr-gcc che viene usata da _delay_ms() e _delay_us(), che prendono entrambe un double.
Tuttavia è possibile disabilitare l'uso della builtin definendo DELAY_BACKWARD_COMPATIBLE
Ora i puntatori a pgm devono essere "const" ed è cosa ovvia, ma adesso il compilatore avvisa o termina in errore?
Sono deprecate le SIGNAL, che diventano ISR.
Non ci sono più gli alias prog_char ecc, ma c'è da vedere il file header pgmspace.h.
Gli errori su HardwareSerial.cpp derivano principalmente da errori di scrittura del codice
Sono segnalati dei confronti tra una variabile "i" di tipo "int" ed i membri di una struct che sono solo di tipo unsigned, quindi il compilatore segnala appunto l'incongruenza di tipi.
Altra cosa buffa, sono gli errori su variabili dichiarate ma non usate nella funzione indicata. Sarebbe da fare una ripulitura e revisione del codice.
Gli errori su IPAddress non li capisco, quel "dereferencing type-punned pointer will break strict-aliasing rules" non so bene cosa voglia dire.
Per ora, più che di errori di compatibilità del codice con la nuova toolchain, vedo errori di stesura del codice
leo72:
...
Per ora, più che di errori di compatibilità del codice con la nuova toolchain, vedo errori di stesura del codice
Già ... credo infatti che il nuovo compilatore sia solo ... più esigente e preciso e quindi, tutti quelli che saltano/salteranno fuori, sono essenzialmente "errori di stesura del codice" !!! ] ] ]
PS:
io per dire la verità non ho mai controllato i warning perché la compilazione non la tengo "verbosa" perciò non so mai cosa viene fuori compilando
Anzi, ieri facendo la prova, ho notato un altro warning, che tu non hai, nella compilazione di uno sketch vuoto. Ma ora è troppo presto per ricordarmi che problema era, e non sono a casa per controllare
leo72:
...
Anzi, ieri facendo la prova, ho notato un altro warning, che tu non hai, nella compilazione di uno sketch vuoto. Ma ora è troppo presto per ricordarmi che problema era, e non sono a casa per controllare
... ce l'ho, ce l'ho, ma ... quello è molto più grave e me lo tenevo per dopo. Deciso che questi che ho esposto sono solo "warning trascurabili", passiamo a quello che è più importante
Come ho detto ... una cosa per volta o non riusciamo a fare una collezione esatta dei problemi/soluzioni
Ok, accettiamo allora che le due serie di "warning" sopra riportate siano "warning trascurabili" dovuti ad una ... non ottima stesura del codice di Arduino
Il problema seguente mi sembra invece più importante ed andrebbe risolto :
/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:44:23: warning: '__progmem__' attribute ignored [-Wattributes]
... il fatto che ignori l'attributo progmem non va proprio bene e quindi occorre vedere come correggere Print.cpp per risolvere questo problema.
Ogni aiuto e suggerimento è ovviamente ben accetto
Se apro l'IDE e compilo lo sketch con solo void setup e void loop ricevo gli errori di cui stiamo discutendo.
Se però prendo ed inserisco anche un solo spazio vuoto nel file e ricompilo, spariscono TUTTI gli errori...
Se aggiungo un'istruzione REALE, come ad esempio la stampa su seriale con la funzione F() (costringendo quindi l'uso di PROGMEM), non ho nessuna segnalazione di errore!
leo72:
...
Se aggiungo un'istruzione REALE, come ad esempio la stampa su seriale con la funzione F() (costringendo quindi l'uso di PROGMEM), non ho nessuna segnalazione di errore!
peggio .. invece a me, se nell loop() metto Serial.print (F("pippo")); ... proprio non compila più e mi da un errore :
prova.ino: In function 'void loop()':
prova.ino:11:16: error: variable '__c' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
Tu hai un esempio che compila correttamente SENZA warning ed errori ?
No. Ottengo sempre quei warning.
Ho fatto caso ad una cosa, la seconda volta che compilo, anche se modifico il sorgente, non mi da più warning perché usa le lib che ha già compilato in precedenza. Me ne sono accorto rileggendo l'output sul terminale e poi cambiando chip, costringendo quindi l'IDE a ricompilare tutto da capo.
... 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) ...
pare che copi dalla Flash.... la dimensione è identica al file compilato con la lib originale.
quei warning li ho anch'io ma sono riferiti a HardwareSerial.cpp mentre ora stavamo parlando di Print.cpp
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.
leo72:
...
2) quei warning li ho anch'io ma sono riferiti a HardwareSerial.cpp mentre ora stavamo parlando di Print.cpp
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
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) !!!
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 ?