Go Down

Topic: problema libreria (Read 1 time) previous topic - next topic

leo72


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.

lesto

#16
Mar 25, 2013, 12:00 pm Last Edit: Mar 25, 2013, 12:02 pm by lesto Reason: 1
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 :)

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: [Select]
// 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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

sausim

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

MauroTec

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.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

lesto

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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

sausim

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

lesto

ma la prima che hai fatto funziona? puoi postare il codice (sia che funziona che no?)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

sausim

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???



lesto

leggiamo con calma l'errore:


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

Code: [Select]
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: [Select]
PIQ.cpp.o:PIQ.cpp:56: first defined here
ed ecco dove si trova la prima definizione di ip!

Code: [Select]
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 :)) 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.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up