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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Timo T. (Firma: --) (grebnelloh)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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


Bewertung
3 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.