probleme mit avr/eeprom.h

OP (Firma: --) #5235156
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
Persönliche Seite
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.
Persönliche Seite
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).
Persönliche Seite
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?
OP (Firma: --)
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'
Persönliche Seite
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.
OP (Firma: --)
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.
Gast
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! :-)
Gast
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

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.