Forum: Compiler & IDEs AVR_ECLIPSE-undefined reference to `EEPROMClass


von goldeneyes1987 (Gast)


Lesenswert?

Hi,


ich hab wieder mal nen Problem  !
Ich benutze Eclipse mit dem AVR Plugin;
Libaray von Arduino, es funktioniert bis auf diese Fehlermeldung alles!

Ich wollte jetzt eine EEPROM ( EEPROM Libary von DAVID A. 
Mellis)schreibfunktion bereitstellen, aber das geht nicht!
1
// Memory.cpp
2
#include "Memory.h"
3
#include <EEPROM/EEPROM.h>
4
5
void writeEEPROM_Word(int value, int address)
6
{
7
  union storeINT{
8
    uint8_t intByte[2];
9
    int intVal;
10
  }intIn;
11
12
  intIn.intVal = value;
13
for (uint8_t i = 0; i < 2; i++)  EEPROM.write(address + i,intIn.intByte[i]);
14
  //SerPrLine("!!!!not implemented at the moment!!!!");
15
}

Leider endet dies ganze mit diesem Fehler:
1
/src/Utility/Memory/Memory.o: In function `writeEEPROM_Word(int, int)':
2
../src/Utility/Memory/Memory.cpp:80: undefined reference to `EEPROM'
3
../src/Utility/Memory/Memory.cpp:80: undefined reference to `EEPROM'
4
../src/Utility/Memory/Memory.cpp:80: undefined reference to `EEPROMClass::write(int, unsigned char)'
5
../src/Utility/Memory/Memory.cpp:80: undefined reference to `EEPROMClass::write(int, unsigned char)'
6
make: *** [FH_Copter.elf] Error 1

Kann jemand etwas mit diesem Fehler anfangen??

von Stefan E. (sternst)


Lesenswert?

Du musst auch die EEPROM.cpp deinem Projekt hinzufügen.


PS: Wow, was für eine "Library". Ist ja eine echte Sahneschnitte.
1
#ifndef EEPROM_h
2
#define EEPROM_h
3
4
#include <inttypes.h>
5
6
class EEPROMClass
7
{
8
  public:
9
    uint8_t read(int);
10
    void write(int, uint8_t);
11
};
12
13
extern EEPROMClass EEPROM;
14
15
#endif
1
...
2
#include <avr/eeprom.h>
3
#include "WConstants.h"
4
#include "EEPROM.h"
5
...
6
uint8_t EEPROMClass::read(int address)
7
{
8
        return eeprom_read_byte((unsigned char *) address);
9
}
10
11
void EEPROMClass::write(int address, uint8_t value)
12
{
13
        eeprom_write_byte((unsigned char *) address, value);
14
}
15
16
EEPROMClass EEPROM;

von goldeneyes1987 (Gast)


Lesenswert?

Ja ich habe doch die Datei EEPROM.h includiert, somit ist sie doch da!
Er erkennt auch die Include anweisung!

von Stefan E. (sternst)


Lesenswert?

goldeneyes1987 schrieb:
> Ja ich habe doch die Datei EEPROM.h includiert, somit ist sie doch da!

Dadurch ist aber noch nicht der eigentliche Code aus EEPROM.cpp in 
deinem Projekt vorhanden. Und das Fehlen dieses Codes ist genau das, was 
die Fehlermeldungen aussagen. Also nochmal:
Du musst auch die EEPROM.cpp deinem Projekt hinzufügen.

von Stefan E. (sternst)


Lesenswert?

Zusatztip:

Statt den Schrott auf komplizierte Art um Word-Varianten zu erweitern, 
solltest du besser gleich komplett was Eigenes auf der Basis der 
Funktionen/Makros aus <avr/eeprom.h> machen.

von goldeneyes1987 (Gast)


Lesenswert?

Ja das habe ich auch eigentlich versucht und zwa wie folgt:

1
// in Memory.cpp
2
#include <avr/eeprom.h>
3
#include <WConstants.h>
4
5
void writeToEEPROM(int value, int address)
6
{
7
8
  eeprom_write_block(value, (void*)(address), sizeof(value));
9
10
}

endete aber mit folgende Fehlermeldung
1
c:/documents and settings/administrator/desktop/arduino-0018/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h: In function 'void eeprom_read_block(void*, const void*, size_t)':
2
c:/documents and settings/administrator/desktop/arduino-0018/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:290: error: ISO C++ forbids incrementing a pointer of type 'void*'
3
c:/documents and settings/administrator/desktop/arduino-0018/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:290: error: ISO C++ forbids incrementing a pointer of type 'const void*'
4
c:/documents and settings/administrator/desktop/arduino-0018/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:290: error: invalid conversion from 'const void*' to 'const uint8_t*'
5
c:/documents and settings/administrator/desktop/arduino-0018/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:290: error:   initializing argument 1 of 'uint8_t eeprom_read_byte(const uint8_t*)'
6
c:/documents and settings/administrator/desktop/arduino-0018/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h: In function 'void eeprom_write_block(const void*, void*, size_t)':
7
c:/documents and settings/administrator/desktop/arduino-0018/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:398: error: ISO C++ forbids incrementing a pointer of type 'void*'
8
c:/documents and settings/administrator/desktop/arduino-0018/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:398: error: ISO C++ forbids incrementing a pointer of type 'const void*'
9
c:/documents and settings/administrator/desktop/arduino-0018/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:398: error: invalid conversion from 'void*' to 'uint8_t*'
10
c:/documents and settings/administrator/desktop/arduino-0018/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:398: error:   initializing argument 1 of 'void eeprom_write_byte(uint8_t*, uint8_t)'
11
../src/Utility/Memory/Memory.cpp: In function 'void writeToEEPROM(int, int)':
12
../src/Utility/Memory/Memory.cpp:87: error: invalid conversion from 'int' to 'const void*'
13
../src/Utility/Memory/Memory.cpp:87: error:   initializing argument 1 of 'void eeprom_write_block(const void*, void*, size_t)'
14
make: *** [src/Utility/Memory/Memory.o] Error 1

Also habe versuch über google was zu finden, ohne Erfolg. :-(

Evtl. habt Ihr ne Idee?

von Stefan E. (sternst)


Lesenswert?

goldeneyes1987 schrieb:
> Ja das habe ich auch eigentlich versucht und zwa wie folgt:

Und warum eeprom_write_block zum Schreiben eines einzelnen int?

von goldeneyes1987 (Gast)


Lesenswert?

Ich denke letzendlich ist das hier nicht das ausschlaggebende!?
1
void writeToEEPROM(uint16_t value, uint16_t address)
2
{
3
4
  eeprom_write_word((void*)(address), value);
5
6
}

Hier erhalte ich die gleiche Fehlermeldung!

von Simon K. (simon) Benutzerseite


Lesenswert?

Ich habe das Gefühl, dein Problem ist nicht die Fehlermeldung, sondern, 
dass du nicht genau weißt, was du eigentlich machen willst.

von goldeneyes1987 (Gast)


Lesenswert?

Simon K. schrieb:
> Ich habe das Gefühl, dein Problem ist nicht die Fehlermeldung, sondern,
> dass du nicht genau weißt, was du eigentlich machen willst.

?? Tja, wissen schon aber nicht ganz Wie?!

Ob ich jetzt ein Byte schreibe oder 2,4 ist letzenlich egal!! Ich kann 
dass immer wieder auf die ein Byte zurückführen!

Aber ich kann mit dieser Fehlermeldung nichts anfangen. Und dachte evtl. 
hatte jemand schon mal sowas ähnliches oder kann mir einen Tip geben?

von goldeneyes1987 (Gast)


Lesenswert?

Also besonders mit diesem Fehler:
1
ISO C++ forbids incrementing a pointer of type 'void*'

[http://talideon.com/weblog/2007/10/no-inc-voidp.cfm]: Beschreibt diesen 
Fehler, dennoch sehe ich keinen Grund hier für diese Fehlermeldung!
1
//eeprom.h
2
...
3
/** \ingroup avr_eeprom
4
    Write a byte \a __value to EEPROM address \a __p.
5
 */
6
static __inline__ void eeprom_write_byte (uint8_t *__p, uint8_t __value)
7
{
8
    do {} while (!eeprom_is_ready ());
9
10
#if  defined(EEPM0) && defined(EEPM1)
11
    EECR = 0;    /* Set programming mode: erase and write.  */
12
#elif  defined(EEPM0) || defined(EEPM1)
13
# warning "Unknown EECR register, eeprom_write_byte() has become outdated."
14
#endif
15
16
#if  E2END <= 0xFF
17
    EEARL = (unsigned)__p;
18
#else
19
    EEAR = (unsigned)__p;
20
#endif
21
    EEDR = __value;
22
23
    __asm__ __volatile__ (
24
        "/* START EEPROM WRITE CRITICAL SECTION */\n\t"
25
        "in  r0, %[__sreg]    \n\t"
26
        "cli        \n\t"
27
        "sbi  %[__eecr], %[__eemwe]  \n\t"
28
        "sbi  %[__eecr], %[__eewe]  \n\t"
29
        "out  %[__sreg], r0    \n\t"
30
        "/* END EEPROM WRITE CRITICAL SECTION */"
31
        :
32
        : [__eecr]  "i" (_SFR_IO_ADDR(EECR)),
33
          [__sreg]  "i" (_SFR_IO_ADDR(SREG)),
34
          [__eemwe] "i" (EEMWE),
35
          [__eewe]  "i" (EEWE)
36
        : "r0"
37
    );
38
}
39
...

von goldeneyes1987 (Gast)


Lesenswert?

Also ich habe meinen geschriebenen Code auskomentiert.
-> Der Fehler ist nachwievor da, sobald ich eeprom.h includiere!
-> Also muss doch irgendwie das Problem auch mit dem Inhalt dieser Datei 
zusammenhängen.
-> Wenn ich der Fehlermeldung von Eclpise folge, dann fürt er mich zu 
den Funktionen, die jeweils void-Pointer inkrementieren!
Aber es kann ja nicht sein dass es an der Datei liegt, denn wenn ich das 
in Arduino programmmiere funktioniert die Datei!
Also liegt das Problem, wie schon vermutet bei Eclips!

Wie aber behebe ich dies????

von Oliver (Gast)


Lesenswert?


von M. K. (avr-frickler) Benutzerseite


Lesenswert?

goldeneyes1987 schrieb:
> Also liegt das Problem, wie schon vermutet bei Eclips!

Also an Eclipse wird es sicher nicht liegen, denn Eclipse ist lediglich 
der böse Bub der den Compiler für dich aufruft und nett wie er ist dir 
dann die Fehlermeldungen des Compilers weiterreicht.

von goldeneyes1987 (Gast)


Lesenswert?

Oliver schrieb:
> http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1287507497

Ich hatte das auch gefunden und entsprechend die eeprom.h -Datei 
geändert, aber erst mit dem Core-File funktioniert es! Endlich, kann es 
weiter gehen!

Vielen Dank Oliver, und natürlich an ALLE anderen die mir Tips gaben!

Ich hätte noch ne Frage zwar hat diese nicht mit diesem Thread zu tuhn 
aber extra einen neuen aufzumachen???

Also wenn ich mehrere Software-Module habe (z.B. SensorModul,I2C-Modul, 
...).
Jetzt will ich die Option ermöglichen, dass ich in einer define.h 
einstellungen über #define auf die anderen Module/Dateien machen kann.

Als erste möglichkeit besteht natürlich einfach diese define.h in jedes 
Modul zu includieren. Ich finde das aber net ganz passend da ja in 
diesem define.h ja auch Sachen von I2C stehen, aber trotzdem ins 
SensorModul reinkopiert werden??

Gibt es hierfür bessere Lösungen?

von Oliver (Gast)


Lesenswert?

goldeneyes1987 schrieb:
> Gibt es hierfür bessere Lösungen?

Nein.

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.