Go Down

Topic: Ottimizziamo il codice del core di Arduino (Read 28437 times) previous topic - next topic

Maurotec

Dalle mie parti si dice: Un uomo solo manco (nemmeno) buono per pisciare (fare la pipi) :smiley-mr-green:

Quindi non lasciatemi solo.
Se qualcuno è in grado di applicare la modifica alla classe IPAddress lo faccia, se non c'è nessuno, datemi almeno un pezzo di codice per testare, c'è nell'ide un esempio semplice che usa la classe IPAddress?

La modifica costa 5 minuti, nelle condizioni migliori.

Ciao.

nid69ita

#31
Dec 09, 2013, 04:16 pm Last Edit: Dec 09, 2013, 04:39 pm by nid69ita Reason: 1
Presumo venga usata negli sketch della ethernet shield.

Nel core la IPAddress.h viene richiamata da Client.h, Ethernet.h e da Udp.h
Tra gli esempi UdpNtpClient.ino chiama  EthernetUdp.h che a sua volta richiama Udp.h
my name is IGOR, not AIGOR

gpb01


Dalle mie parti si dice: Un uomo solo manco (nemmeno) buono per pisciare (fare la pipi) :smiley-mr-green:


:smiley-mr-green: :smiley-mr-green: :smiley-mr-green: ... moralmente siamo tutti con te !!! ;)



Quindi non lasciatemi solo.
Se qualcuno è in grado di applicare la modifica alla classe IPAddress lo faccia, se non c'è nessuno, datemi almeno un pezzo di codice per testare, c'è nell'ide un esempio semplice che usa la classe IPAddress?
La modifica costa 5 minuti, nelle condizioni migliori.


Qualunque esempio che è nell'IDE e che riguarda, ad esempio il WiFi, usa la classe IPaddress ... prova con il WebServer ...

Il sorgente IPaddress. cpp e IPaddress.h immagino li avrai già visti nella cartellina del core di Arduino ... ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

Esaminando bene il codice di IPAddress.h, vedo che" uint8_t _address[4];  // IPv4 address" è nella private della classe IPAddress ... questo immagino debba far ben sperare che quel _address[] non sia usato al di fuori ... e che quindi ci sia solo da modificare la classe ... giusto ???

Guglielmo
Search is Your friend ... or I am Your enemy !

lestofante

esatto. Facciamo una bella lista dei warning, così vediamo di smazzarceli a vicenda.
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

nid69ita


Presumo venga usata negli sketch della ethernet shield.

Nel core la IPAddress.h viene richiamata da Client.h, Ethernet.h e da Udp.h
Tra gli esempi UdpNtpClient.ino chiama  EthernetUdp.h che a sua volta richiama Udp.h


Confermo, quell'esempio in compilazione verbose mi compila e da warning sulla IPAddress
my name is IGOR, not AIGOR

Maurotec

#36
Dec 09, 2013, 05:08 pm Last Edit: Dec 09, 2013, 05:17 pm by MauroTec Reason: 1
Quote
Esaminando bene il codice di IPAddress.h, vedo che" uint8_t _address[4];  // IPv4 address" è nella private della classe IPAddress ... questo immagino debba far ben sperare che quel _address[] non sia usato al di fuori ... e che quindi ci sia solo da modificare la classe ... giusto ???


In teoria dovrebbe essere così ma per sbrigarsi e non chiamare un getThing si è preferito dichiarare alcune classi friend, tanto che nel codice originale c'è questo:

Code: [Select]

void EthernetClass::begin(uint8_t *mac, IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet)
{
 W5100.init();
 W5100.setMACAddress(mac);
 W5100.setIPAddress(local_ip._address);
 W5100.setGatewayIp(gateway._address);
 W5100.setSubnetMask(subnet._address);
 _dnsServerAddress = dns_server;
}

dove si vede accesso alla variabile _address fuori contensto se non ci fosse friend EthernetClass in IPAddress

Il codice dovrebbe essere così:
Code: [Select]

void EthernetClass::begin(uint8_t *mac, IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet)
{
 W5100.init();
 W5100.setMACAddress(mac);
 W5100.setIPAddress(local_ip.raw_address());
 W5100.setGatewayIp(gateway.raw_address());
 W5100.setSubnetMask(subnet.raw_address());
 _dnsServerAddress = dns_server;
}


dove si fa ricorso ad una funzione (metodo get) raw_address
Ok a me sembra funzionare mo allego lo zip, datemi un minuto.

PS: mi era scappata una z, se non l'avete vista non considerate per niente questo PS.

Nello zip c'è anche Ethernet.cpp
Rinominate gli originali in es IPAddress.h.orig
e poi estraete IPxx nel core ed Ethernet.cpp nella libreria.

Ciao.

gpb01

Vero ... bella porcata ...

... peccato perché, nel frattempo, avevo provato anche io a sistemare IPAddress.cpp e .h come avevi detto e ... il WiFiServer compilava senza warning (... per questa parte ... ci sono altre cose, ma a suo tempo).

Ovviamente invece ... l'esempio di WebServer della Ethernet ... va in errore ...  =( =( =(

Guglielmo
Search is Your friend ... or I am Your enemy !

Maurotec

#38
Dec 09, 2013, 05:21 pm Last Edit: Dec 09, 2013, 05:24 pm by MauroTec Reason: 1
Quote
Ovviamente invece ... l'esempio di WebServer della Ethernet ... va in errore ...  smiley-cry smiley-cry smiley-cry

Provato ora e funonzia.

In teoria si potrebbe evitare la union provando ad usare *(reinterpret_cast<uint32_t*>(_address)),
ma così mi sembra più leggibile.

Ciao.

gpb01

Si Mauro, confermo che con la modifica non solo dei due moduli del core, ma anche del Ethernet.cpp nella libreria ... COMPILA senza più quei warning (... svariati altri legati ad altre cose, ma un passo alla volta si dovrebbero risolvere) :D

C'è un'anima pia che collauda il codice generato ... per essere sicuri che continua a funzionare ?  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green:

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

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

Guglielmo
Search is Your friend ... or I am Your enemy !

Maurotec

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.

gpb01

No, io ho compilato con l'ultima toolchain, la 3.4.3 ... 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 ...  :smiley-mr-green: XD :smiley-mr-green: XD

Guglielmo
Search is Your friend ... or I am Your enemy !

Maurotec

Andiamo avanti con :
Quote

/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:
Code: [Select]

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.


PaoloP


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.




Go Up