Pages: 1 [2]   Go Down
Author Topic: problema libreria  (Read 1301 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 335
Posts: 23137
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao leo72, ho preso il tuo file zip con le tue correzioni ma mi dà il seguente errore:

Documenti/arduino-1.0.1/libraries/EEPROM_TCP_IP/EEPROM_TCP_IP.h:3:20: error: EEPROM.h: File o directory non esistente

A te non lo genera????
Non me n'ero accorto perché avevo messo l'inclusione di EEPROM.h anche nello sketch. Poi non l'avevo copiato.
Effettivamente è vero, lo fa. Pensavo fosse un problema mio.
Logged


0
Offline Offline
Shannon Member
****
Karma: 136
Posts: 10525
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
In effetti Serial non dovrebbe essere istanziabile dall'utente, quindi ci sarà il costruttore privato
Ma con solo il costruttore puoi istanziare più di una classe. Il sigleton invece serve proprio a fare in modo da poterne fare solo una. In pratica sopperisce alla classe statica

Quote
Comunque in merito all'esaurimento della memoria non vedo perchè debba accadere, il problema della frammentazione c'è quando allochi e liberi ripetutamente
no, se usi la prima volta un singleton all'interno di una funzione, o comunque dopo aver creato delle variabili la cui visibilità non è globale, hai creato frammentazione più o meno grave.

Quote
Non vedo controindicazioni, però c'è ci deveno essere buoni motivi per creare un sigleton, uno di questi è necessità di centralizzare un insieme di funzionalità.
è una questione di leggibilità. Arduino non usa i Signleton, si limita a inizializzare al posto tuo delle variabili di tipo classe globali (a fine del .cpp), proprio per evitare al minimo la frammentazione.

Quote
Si java a le classi statiche e quindi non vedo la necessità di un sigleton, ma io di java non ci capisco nulla e quindi sicuramente avrà il suo perchè.
in java una classe statica non può estendere o implementare una classe non statica. Con il Singleton aggiri il problema smiley

Quote
Se Serial è una classe preinstanziata e di questa non se ne può creare altra e questo è quello che cerchi puoi spulcire nel codice del core di Arduino al fine di apprendere come fare.
Invece si può fare, e faresti un sacco di casino (le due classi cercherebbero di accedere all'HW litigando tra loro, motivo per cui esitono i SO per i sistemi complessi)...
Solo che la classe si chiama HardwareSerial, ed ha un costruttore molto complesso, e quindi è improbbaile che un principiante riesca a farlo.
Includo il famoso codice, si nota bene come in base ai rgistri capisce la piattafroma target e quindi il numero di Serial da creare.
E una recente modifica che si usa al posto del nome del processore; atmel ha avuto la pensata di usare sempre gli stessi nomi di registri (salvo rarissimi casi), e quindi senza modifiche questo codice funziona anche su chip atmel che devono ancora essere creati o testati ma che seguono questo schema..

Code:
// Preinstantiate Objects //////////////////////////////////////////////////////

#if defined(UBRRH) && defined(UBRRL)
  HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR, RXEN, TXEN, RXCIE, UDRIE, U2X);
#elif defined(UBRR0H) && defined(UBRR0L)
  HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UCSR0C, &UDR0, RXEN0, TXEN0, RXCIE0, UDRIE0, U2X0);
#elif defined(USBCON)
  // do nothing - Serial object and buffers are initialized in CDC code
#else
  #error no serial port defined  (port 0)
#endif

#if defined(UBRR1H)
  HardwareSerial Serial1(&rx_buffer1, &tx_buffer1, &UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UCSR1C, &UDR1, RXEN1, TXEN1, RXCIE1, UDRIE1, U2X1);
#endif
#if defined(UBRR2H)
  HardwareSerial Serial2(&rx_buffer2, &tx_buffer2, &UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UCSR2C, &UDR2, RXEN2, TXEN2, RXCIE2, UDRIE2, U2X2);
#endif
#if defined(UBRR3H)
  HardwareSerial Serial3(&rx_buffer3, &tx_buffer3, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3);
#endif
« Last Edit: March 25, 2013, 06:02:46 am by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lesto mi aiuti a sviluppare la classe come hai in mente tu???
sono ancora lontano da te, però penso che sviluppato nel mio esempio avrò un modello da prendere spunto per la prox e sicuramente mi aiuta a capire!!

Grazie mille
Logged

0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Quote
Comunque in merito all'esaurimento della memoria non vedo perchè debba accadere, il problema della frammentazione c'è quando allochi e liberi ripetutamente
no, se usi la prima volta un singleton all'interno di una funzione, o comunque dopo aver creato delle variabili la cui visibilità non è globale, hai creato frammentazione più o meno grave

Qui non sono daccordo, se crei un puntatore così, questo è locale e si trova nello stack.
Qualunque blocco.
{
    MyClass *myClass = MyClass::getIstance(); // myClasse è un puntatore sullo stack che cessa di esistere fuori dal blocco
}

Un puntatore locale messo sullo stack, che punta ad un oggetto messo nello heap, a me non mi pare una cosa
malvaggia, sembra un uso efficiente, specie se la prima istanza la crei nel setup() sei apposto.

Certo la memoria impegnata lo sarà sempre per tutta la durata del programma, ma accade la stessa cosa con un
variabile globale o statica.

Comunque mi sembra una cosa da provare ma costringe l'utente a lavorare con l'operatore -> anziché "." e non è cosa
buona per il principiante.

Ciao.
Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

0
Offline Offline
Shannon Member
****
Karma: 136
Posts: 10525
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hai ragione, non crea garbage perchè finisce nell'heap, qu8ndi l'unico problema che può nascere è la mancanza di RAM ma questo è un altro paio di maniche
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lesto mi aiuti a sviluppare la classe come hai in mente tu???
sono ancora lontano da te, però penso che sviluppato nel mio esempio avrò un modello da prendere spunto per la prox e sicuramente mi aiuta a capire!!

Grazie mille
Logged

0
Offline Offline
Shannon Member
****
Karma: 136
Posts: 10525
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma la prima che hai fatto funziona? puoi postare il codice (sia che funziona che no?)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao lesto ti allego tutto.
Sembra tutto ok con uno sketch nuovo,
ma quando lo utilizzo nel mio sketch mi dà i seguenti errori:

EEPROM_TCP_IP/EEPROM_TCP_IP.cpp.o: In function `EEPROM_TCP_IP::loadDefaultAdress()':
Documenti/arduino-1.0.1/libraries/EEPROM_TCP_IP/EEPROM_TCP_IP.cpp:40: multiple definition of `ip'
PIQ.cpp.o:PIQ.cpp:56: first defined here
Documenti/arduino-1.0.1/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../avr/bin/ld: Warning: size of symbol `ip' changed from 4 in PIQ.cpp.o to 8 in EEPROM_TCP_IP/EEPROM_TCP_IP.cpp.o

Da che può dipendere???



* EEPROM_TCP_IP.cpp (5.68 KB - downloaded 10 times.)
* EEPROM_TCP_IP.h (0.31 KB - downloaded 13 times.)
* keywords.txt (0.11 KB - downloaded 11 times.)
Logged

0
Offline Offline
Shannon Member
****
Karma: 136
Posts: 10525
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

leggiamo con calma l'errore:


Code:
EEPROM_TCP_IP/EEPROM_TCP_IP.cpp.o: In function `EEPROM_TCP_IP::loadDefaultAdress()':
allora, il file .o è il file che è stato compilato (file oggetto) e viene linkato con gli altri file per generare  il programma completo. Quindi la classe di per se è è corretta. forse. (vedremo  smiley-grin)

Code:
Documenti/arduino-1.0.1/libraries/EEPROM_TCP_IP/EEPROM_TCP_IP.cpp:40: multiple definition of `ip'
quì intravediamo l'errore "multiple definition of `ip'", ovvero la variabile ip va a "cozzare" perchè in qualche altro file .o è presente una variabile globale ip:

Code:
PIQ.cpp.o:PIQ.cpp:56: first defined here
ed ecco dove si trova la prima definizione di ip!

Code:
Documenti/arduino-1.0.1/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../avr/bin/ld: Warning: size of symbol `ip' changed from 4 in PIQ.cpp.o to 8 in EEPROM_TCP_IP/EEPROM_TCP_IP.cpp.o

e quì infine ti riepiloga l'errore, in particolare ha provato a sovrescrivere il tipo di ip portandolo da 4 a 8 byte.

Come si risolve??  leggendo il mio PRIMO (conosco i miei polli smiley) intervento (sia tu che il creatore di PIQ.cpp)

Quote
Poi sposta tutte le variabili cglobali dal .cpp al .h;

se sono nel .cpp sono globali e visibili anche dal resto del codice, e quindi possono creare collizioni con altre variabili globali in altre parti del codice; se invece le metti nel .h, più precisamente all'interno della class{}, queste variabili sono della classe e quindi NON visibili direttamente dall'esterno, ma facendo nomeClasse.nomeVariabile (se sono pubbliche, se no sono invisibili) il che è lo scopo delle classi.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: 1 [2]   Go Up
Jump to: