Forum: Mikrocontroller und Digitale Elektronik probleme mit avr/eeprom.h


von Timo T. (Firma: --) (grebnelloh)


Lesenswert?

Hallo,
Ich möchte in einem Projekt Daten im internen EEPROM eines Atmega32 
ablegen.
Dazu gibt es ja die Funktionen der avr/eeprom.h.

Zu testzwecken habe ich einfach dies einfache Programm erstellt:
1
#include <avr/io.h>
2
#include <avr/eeprom.h>
3
4
int main(void)
5
{
6
7
8
   eeprom_write_byte((uint8_t*)22,46);
9
   uint8_t Data;
10
   Data = eeprom_read_byte((uint8_t*)22);
11
12
    while(1)
13
    ;
14
15
    return 0;
16
}

Macht zwar nicht viel aber sollte ja Funktionieren.
Allerdings bekomme ich von Codeblocks immer diese Fehlermeldung zu den 
Funktionen:
undefined reference to `__eewr_byte_m32'
undefined reference to `__eerd_byte_m32'

Hab mir schon die Finger blutig gegoogelt aber nichts zu diesen Fehlern 
gefunden, vielleicht hat ja hier jemand eine Idee.
Vielen Dank schon mal

von pegel (Gast)


Lesenswert?

Hast du Codeblocks mitgeteilt das es sich um einen Atmega32 handelt?

Kenne mich mit CB nicht aus, aber wird ein Makefile erstellt?

von Timo T. (Firma: --) (grebnelloh)


Lesenswert?

Ja Codeblocks weiß was für ein Controller es ist und auch den Takt, ob 
ein Makefile erstellt wird kann ich nicht genau sagen da bin ich noch 
nie so ganz durchgeblickt was es damit auf sich hat.

von N. G. (newgeneration) Benutzerseite


Lesenswert?

Hallo,

ich kenne das Problem eigentlich nur bei einem Wechsel zwischen altem 
und neuem Compiler/avr-libc.

Ich vermute, dass du eine neuere libc-Version verwendest, die keinen 
inline-Assembler mehr nutzt, sondern Funktionen deklariert, die vom 
Linker hinzugefügt werden müssen.

Deshalb meine Gegenfrage: hast du mal versucht, das gesamt Projekt 
(mindestens jedes Source-File, das EEPROM-Funktionen nutzt) neu zu 
kompilieren?

Wenn das alles passt, dann poste bitte mal deinen Compiler-Aufruf und 
die Versionen von GCC/avr-libc.

Mit freundlichen Grüßen,
N.G.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Timo T. schrieb:
> Dazu gibt es ja die Funktionen der avr/eeprom.h.

Das ist eine Headerdatei. Darin sind die Deklarationen der Funktionen, 
die Du verwenden willst.

Der zugehörige Code (die Definition) der Funktionen aber ist entweder in 
einem Sourcefile, das Du eigens zu Deinem Projekt hinzufügen musst, oder 
in einer Library, deren Verwendung Du Deinem Linker mitteilen musst.

Nein, anders als in der "Arduino"-Welt ist eine Library kein Quelltext, 
sondern compilierter Code, üblicherweise in der Form einer Datei namens 
lib*.a (oder *.lib, je nach Toolchain).

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Timo T. schrieb:
> undefined reference to `__eewr_byte_m32'
> undefined reference to `__eerd_byte_m32'

Dann wird nichtz gegen die richtigen Libraries gelinkt.

Häufiger Fehler ist, avr-ld zum Linken zu verwenden anstatt avr-gcc, 
dito für andere Targets.

Wie sehen die Tool-Aufrufe aus, d.h. was ist die Ausgabe, wenn -v zu den 
jeweiligen Kommandozeilen-Argumenten hinzugefügt wird?

von Timo T. (Firma: --) (grebnelloh)


Lesenswert?

Der Compiler Aufruf sieht so aus:
1
avr-g++.exe -LC:\WinAVR-20100110\avr\lib -o bin\Debug\eeprom.elf obj\Debug\fuse.o obj\Debug\main.o  -mmcu=atmega32 -Wl,-Map=bin\Debug\eeprom.map,--cref
Den hat Codeblocks so ausgegeben. Wenn ich ihn manuell ausführe kommt 
die selbe fehlermeldung, Logischerweise.

Führe ich ihn mit der Option -v aus kommt diese Ausgabe:
1
ref -v
2
Using built-in specs.
3
Target: avr
4
Configured with: ../gcc-4.3.3/configure --enable-win32-registry=WinAVR-20100110 --with-gmp=/usr/local --with-mpfr=/usr/local --prefix=/c/WinAVR --target=avr --enable-languages=c,c++,objc --with-dwarf2 --enable-doc --disable-shared --disable-libada --disable-libssp --disable-nls --with-pkgversion='WinAVR 20100110' --with-bugurl='URL:http://sourceforge.net/tracker/?atid=520074&group_id=68108&func=browse'
5
Thread model: single
6
gcc version 4.3.3 (WinAVR 20100110)
7
COMPILER_PATH=c:/winavr-20100110/bin/../libexec/gcc/avr/4.3.3/;c:/winavr-20100110/bin/../libexec/gcc/;c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/
8
LIBRARY_PATH=c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5/;c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/;c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/;c:/winavr-20100110/bin/../lib/gcc/;c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/
9
COLLECT_GCC_OPTIONS='-LC:\WinAVR-20100110\avr\lib' '-o' 'bin\Debug\eeprom.elf' '-mmcu=atmega32' '-v'
10
 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe -m avr5 -o bin\Debug\eeprom.elf c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crtm32.o -LC:\WinAVR-20100110\avr\lib -Lc:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5 -Lc:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5 -Lc:/winavr-20100110/bin/../lib/gcc/avr/4.3.3 -Lc:/winavr-20100110/bin/../lib/gcc -Lc:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib obj\Debug\fuse.o obj\Debug\main.o -Map=bin\Debug\eeprom.map --cref -lgcc -lm -lgcc -lc -lgcc
11
obj\Debug\main.o: In function `main':
12
C:\Users\timot\Documents\eeprom/main.c:12: undefined reference to `__eerd_byte_m32'

von Timo T. (Firma: --) (grebnelloh)


Lesenswert?

Ahh Versionen Vergessen:

Codeblocks ist Version 16.01
Winavr ist Version 20100110
GCC ist version 4.3.3
Version der libc finde ich gerade nicht ?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Timo T. schrieb:
> -LC:\WinAVR-20100110\avr\lib

Du verwendest die falsche Multilib. Wo hast du das her?

Lass das weg!

von Timo T. (Firma: --) (grebnelloh)


Lesenswert?

Ohne das Ist der Fehler weg, ob es läuft kann ich gerade leider nicht 
testen. Der Befehl kommt so wie er ist von Codeblocks warum er diese 
Option mit rein nimmt kann ich nicht sagen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Timo T. schrieb:
> Der Befehl kommt so wie er ist von Codeblocks

Falsch ist die Option trotzdem.  Beim Link-Aurfuf, den der 
Compiler-Treiber "avr-g++" zusammenbastelt, kommt dieses -L vor denen, 
die der Treiber korrekt an den Linker übergibt.  Dies führt dazu, dass 
die falsche Library libc.a (und auch libm.a, sofern benötigt) verwendet 
wird.

Bei deinem Beispiel führt das zu einem Linkerfehler, weil die 
EEPROM-Unterstützung für's jeweilige Device nur in der entsprechenden 
Multilib-Variante der libc vorhanden ist.

Ohne eeprom-Routinen gäbe es zwar kein Linkerfehler, aber du würdest 
z.B. auch Code linken, der anstatt MUL die arschlahmen Routinen für 
Devices ohne MUL verwendet, sowie Code, der anstatt einem MOVW zwei 
MOV verwendet, solchen, der zu kurze Sprünge nutzt, was zu einem 
"relocation truncated to fit" Fehler führen könnte, etc.

> warum er diese Option mit rein nimmt kann ich nicht sagen.

Evtl. von einem Projekt übernommen oder eine Voreinstelling in C::B.  In 
letzerem Fall wäre ein Bug-Report gegen C::B fällig.

von Timo T. (Firma: --) (grebnelloh)


Lesenswert?

So hatte jetzt endlich zeit zum Testen und es funktioniert!
Vilen dank euch schonmal.

Ich habe mir jetzt auch nochmal die Einstellungen zum Compiler in 
Codeblocks angeschaut und da das eingestellte Verzeichnis für den Linker 
geändert jetzt funktioniert auch wieder das compilieren aus Coderblocks.

von Kuran (Gast)


Lesenswert?

in C::B Settings > Search directories > Linker settings:
C:\Program Files (x86)\WinAVR-20100110\avr32\lib

statt
C:\Program Files (x86)\WinAVR-20100110\avr\lib
je nachdem - wo Deine libs sind...
---> gelöst! :-)

von CK (Gast)


Lesenswert?

Kuran schrieb:
> in C::B Settings > Search directories > Linker settings:
> C:\Program Files (x86)\WinAVR-20100110\avr32\lib
>
> statt
> C:\Program Files (x86)\WinAVR-20100110\avr\lib
> je nachdem - wo Deine libs sind...
> ---> gelöst! :-)

Das ist komisch, den der ATmega32 (lass dich nicht vom Namen täuschen) 
ist ein 8-Biter, demnach wäre WinAVR-20100110\avr\lib richtig


das WinAVR-20100110\avr32\lib ist für die 32-Biter AVRs.  Die Heißen 
aber auch AVR32 und nicht ATmega/ATtiny/ATxmega

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.