Ottimizziamo il codice del core di Arduino

Per chiarezza … in allegato i moduli che, ad oggi, occorre sostituire (grazie Mauro :wink: )…
… ora occorrerebbe fare qualche prova di “funzionamento” del codice generato e non solo di compilazione andata a buon fine :wink:

Guglielmo

Modifiche core e lib.zip (5.29 KB)

Io ho compilato con la toolchain standard o meglio con L'ide1.05 ma io sul sistema ho la vecchia toolchain 4.5.1 atmel patched.

Vediamo come va e se c'è altro si sistema in un modo o nell'altro.

Ok, ora mi merito un caffe e purtroppo me lo devo pure fare io. :~ Ciao.

No, io ho compilato [u]con l'ultima toolchain, la 3.4.3[/u] ... quindi, almeno per la compilazione, la cosa è OK ! :)

Ripeto ... ora qualcuno che ha le board WiFi ed Ethernet installate ... dovrebbe provare se, ricompilando con la nuova toolchain e quelle modifiche ... l'eseguibile funziona ancora come dovrebbe ... :grin: XD :grin: XD

Guglielmo

Andiamo avanti con :

/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/libraries/WiFi/utility/wifi_drv.cpp: In static member function 'static uint8_t WiFiDrv::getEncTypeNetowrks(uint8_t)': /Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/libraries/WiFi/utility/wifi_drv.cpp:432:10: warning: converting to non-pointer type 'uint8_t {aka unsigned char}' from NULL [-Wconversion-null] return NULL; ^ /Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/libraries/WiFi/utility/wifi_drv.cpp: In static member function 'static int32_t WiFiDrv::getRSSINetoworks(uint8_t)': /Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/libraries/WiFi/utility/wifi_drv.cpp:457:10: warning: converting to non-pointer type 'int32_t {aka long int}' from NULL [-Wconversion-null] return NULL; ^

NULL è un tipo particolare che si applica ai puntatori, come si vede dal codice viene ritornato NULL ma il tipo da ritornare non è un puntatore ma un intero. Per correggere questo ingenuo errore, ho bisogno di aiuto, perché tutto dipende dal codice esistente che usa wifi_drv. Una possibile e semplice modifica potrebbe essere:

int32_t WiFiDrv::getRSSINetoworks(uint8_t networkItem)
{
    if (networkItem >= WL_NETWORKS_LIST_MAXNUM)
        return 0;// no NULL is NULL pointer return NULL;

return 0 oppure return -1 o altro codice. Stessa cosa vale per uint8_t WiFiDrv::getEncTypeNetowrks(uint8_t networkItem)

Ciao.

gpb01: l'esempio di WebServer della Ethernet ... va in errore ... =( =( =(

Sulla 1.5.5 + TC 3.4.3 nessun errore e nessun warnings durante la compilazione. Non è che statecorreggendo cose già corrette nel passaggio tra la 1.0.5 e la 1.5.5. Mi pare un lavoro inutile. Non è meglio lavorare sul codice più recente e migliorarlo invece di inseguire codice più datato?

Ripeto che l'unica modifica che ho fatto è quella del #define per il workaround delle definizione deprecate in pgmspace.

Io ho scaricato la 1.5.x ma non riesco a trovare dentro il tree dei sorgenti la verisone precisa di ciò che ho scaricato. Comunque, il core di ciò che ho scaricato non contiene queste modifiche.

Se a te non da questi warning abilitando da preference vuol dire che hanno disabilitato i warning (forse).

Riguardo a questo:

l'esempio di WebServer della Ethernet ... va in errore ... smiley-cry smiley-cry smiley-cry

gpb01 aveva iniziato ad apportare la modifica a IPAddress in base al mio suggerimento iniziale ma non avevo modificato Ethernet.cpp per cui riceveva errori.

Ciao.

Paolo ... ho idea che stai sbagliando da qualche parte la verifica ... ... IPAddress per AVR è identico sulla 1.5.5 e sulla 1.0.5 ... e se da problemi da una parte, deve dare problemi anche dall'altra !!!

Quindi ... ... ricontrolla che effettivamente stai usando la toolchain 3.4.3 e che non l'hai messa nel posto sbagliato (e quindi continua a usare la vecchia), controlla di aver messo verbose nella compilazione, ecc. ecc.

Essendo il compilatore lo stesso .. ti rendi conto che NON può in un caso segnalare un problema ed in un altro no ... visto che i due sorgenti sono gli stessi ! ;)

Guglielmo

Edit : Su Mac ( ma su Win è simile) il percorso per il core AVR è :

/Applications/Arduino 1.5.5.app/Contents/Resources/Java/hardware/arduino/avr/cores/arduino

Confermo che sono quasi identici tra 1.0.5 e.1.5.5
C’e’ solo una differenza, nella 1.5.5 c’e’ all’inizio questo include che manca nella 1.0.5

#include <stdint.h>

Uso il programma BeyondCompare per trovare le differenze di codice tra stessi file in due cartelle.

Ok Paolo, effettivamente ho sostituito la toolchain nella 1.5.5 ed ho provato a compilare il WiFiServer e ... chiedo scusa, HAI RAGIONE !!! XD XD XD

Ma, controllando la compilazione ... mi sembra di NON vedere più usato IPAddress.cpp :astonished: :astonished: :astonished:

Ecco perché non ti da errore !!! Probabilmente hanno cambiato la libreria WiFi e la Ethernet per non includerlo più ... :roll_eyes: :roll_eyes: :roll_eyes:

Occorre una verifica delle lib ...

Guglielmo

Mi correggo di nuovo LO USA, ma con la seguente stringa di compilazione :

/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.5.5 TL 3.4.3.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=155 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -I/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.5.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/avr/cores/arduino -I/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.5.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/avr/variants/standard /Users/gpb01/Desktop/Prove Toolchain/Arduino 1.5.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/avr/cores/arduino/IPAddress.cpp -o /var/folders/td/xjbgg2n97rl9wsy40_rsj90h0000gn/T/build6874946970987828386.tmp/IPAddress.cpp.o

... Mauro .. ti dicono qualche cosa tutte quelle direttive ???? :astonished: :astonished: :astonished:

Guglielmo

@Guglielmo, nelle 2 cartelle del core 1.0.5 e 1.5.5 i file che mi risultano diversi sono: Arduino.h (aggiunta funzione void yield(void) come dichiarazione) CDC.cpp HardwareSerial.cpp e .h IPAddress.h USBAPI.h USBCore.cpp wiring.c (nella delay() richiama la yield() !?!) wiring_analog.c WString.cpp e .h (hanno aggiunto un pò di metodi per le stringhe in flash ram) (Eliminato malloc.c e aggiunto hooks.c) Tutto il resto è identico.

Si nid, ma ho fatto adesso la comparazione dei due IPAddress.h (utilizzando DeltaWalker, e non ad occhio) e, l’unica differenza, è appunto l’include :

#include <stdint.h>

Guglielmo

IPAddress è usata, e si è "spostata" nelle librerie core (o forse è sempre stata lì?) ora controllo...

BALORDI!!! -w è di default, ora nascondono tutti i warning!! MALOOO!!!! apro subito un bug

edit: nid prossima volta controlla bene, se metti su verbose vedesisubito il maledetto -w

/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=155 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -I/...

\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -MMD -mmcu=atmega328p -DF_CPU=16000000L  -DARDUINO=105 -DUSB_VID=null -DUSB_PID=null  -I/...

@Guglielmo ho messo anche la compilazione da me della 1.0.5 e la tua, togliendo dagli include in poi Han solo tolto "all" da -W Le altre define che fanno? I vari -D qualcosa ?

lesto: ... BALORDI!!! -w è di default, ora nascondono tutti i warning!! MALOOO!!!! apro subito un bug ...

Ma sono matti ??? E' vero, guarda la riga di copilazione che ho messo QUI ... nonostante il verbose ... c'è proprio il -w ... che Dio li fulmini !!!

@Paolo : ecco perché non vedi warning :grin: :grin: :grin:

Guglielmo

lesto: BALORDI!!! -w è di default, ora nascondono tutti i warning!! MALOOO!!!! apro subito un bug

:fearful:

Si risolve facilmente editando nel file platform.txt la riga

compiler.c.flags=-c -g -Os -w -ffunction-sections -fdata-sections -MMD

parlo sempre della versione 1.5.5

BALORDI!!! -w è di default, ora nascondono tutti i warning!! MALOOO!!!! apro subito un bug

:grin:

@PaoloP Si risolve facilmente editando nel file platform.txt la riga Ottimo, la 1.55 allora permette di modificare i flags, prova ad aggiungere -save-temps, ti tornerà utile in molte occasioni.

Ciao.

C’è comunque un problema … anche se metti verbose, non mette la -Wall … =( =( =(

Tocca metterla a mano …

Guglielmo

P.S. : Ovviamente, mettendola, saltano fuori TUTTI i warning che Mauro ha risolto :wink:

Si Mauro. E' altamente customizzabile e ci sono flag per tutti i gusti e tutte le situazioni

compiler.c.cmd=avr-gcc
compiler.c.flags=-c -g -Os -w -ffunction-sections -fdata-sections -MMD
compiler.c.elf.flags=-Os -Wl,--gc-sections
compiler.c.elf.cmd=avr-gcc
compiler.S.flags=-c -g -assembler-with-cpp
compiler.cpp.cmd=avr-g++
compiler.cpp.flags=-c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -MMD
compiler.ar.cmd=avr-ar
compiler.ar.flags=rcs
compiler.objcopy.cmd=avr-objcopy
compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0
compiler.elf2hex.flags=-O ihex -R .eeprom
compiler.elf2hex.cmd=avr-objcopy
compiler.ldflags=
compiler.size.cmd=avr-size
# this can be overriden in boards.txt
build.extra_flags=

Guglielmo hai fatto la modifica anche per il compilatore cpp?

grazie paolo, provvedo subito. In tatnochi ha account dia mano forte a far apparire il bug: https://github.com/arduino/Arduino/issues/1728

quanto tempo che perdete con la roba GNU!

con roba ARDUINO vorrai dire...