Fehler bei Nutzung von <avr/eeprom.h>

OP #2556763
Lesenswert?
• ▲
▼
Moin!

Folgende Funktionen werfen bei mir Fehler, genauer genommen dir Aufrufe 
der EEPROM-Makros darin:
1
void check_eemem(void){
2
  
3
  uint8_t temp;
4
  temp = eeprom_read_byte(&chip_erase_check);
5
  
6
  #define CHECK_NEGATIVE 0xAA
7
  if(temp == CHECK_NEGATIVE){
8
    return;
9
  }
10
  
11
  PROG_ACTIVE_PORT |= (1<<PROG_ACTIVE); // indicate EEPROM default writing
12
  
13
  eeprom_write_byte(&prog_speed_eemem, 175);
14
  eeprom_write_byte(&prog_wait_eemem, 175);
15
  eeprom_write_word(&powerleda_on_eemem, POWERLED_ON);
16
  eeprom_write_word(&powerledb_on_eemem, POWERLED_ON);
17
  
18
  eeprom_write_byte(&chip_erase_check, CHECK_NEGATIVE);
19
  
20
}
21

22
void init_variables_from_eeprom(void){
23
  
24
  prog_speed = eeprom_read_byte(&prog_speed_eemem);
25
  prog_wait = eeprom_read_byte(&prog_wait_eemem);
26
  powerleda_on = eeprom_read_word(&powerleda_on_eemem);
27
  powerledb_on = eeprom_read_word(&powerledb_on_eemem);
28
  
29
}


Die Fehlermeldung:
1
avr-gcc-462 -mmcu=attiny4313 -Os -o vitrinencontroller.o 
2

3
/tmp/ccHdXgBX.o: In function `check_eemem':
4
vitrinencontroller.c:(.text+0x6c): undefined reference to `__eerd_byte_tn4313'
5
vitrinencontroller.c:(.text+0x7a): undefined reference to `__eewr_byte_tn4313'
6
vitrinencontroller.c:(.text+0x82): undefined reference to `__eewr_byte_tn4313'
7
vitrinencontroller.c:(.text+0x8c): undefined reference to `__eewr_word_tn4313'
8
vitrinencontroller.c:(.text+0x96): undefined reference to `__eewr_word_tn4313'
9
vitrinencontroller.c:(.text+0x9e): undefined reference to `__eewr_byte_tn4313'
10
/tmp/ccHdXgBX.o: In function `init_variables_from_eeprom':
11
vitrinencontroller.c:(.text+0xa6): undefined reference to `__eerd_byte_tn4313'
12
vitrinencontroller.c:(.text+0xb0): undefined reference to `__eerd_byte_tn4313'
13
vitrinencontroller.c:(.text+0xba): undefined reference to `__eerd_word_tn4313'
14
vitrinencontroller.c:(.text+0xc8): undefined reference to `__eerd_word_tn4313'
15
collect2: ld returned 1 exit status

Ich habe leider keinen Schimmer woher der Fehler kommt oder wie ich ihn 
beheben kann.
GCC-Version ist 4.6.2 (für Linux)

Wäre euch für einen Tipp oder sogar eine Lösung sehr dankbar!
Ist es vielleicht schlauer, die Funktionen zum Lesen und Schreiben auf 
den EEPROM selbst zu schreiben?

LG :)

PS: Hier nochmal die verbose-Ausgabe und Variablendeklaration:
1
avr-gcc-462 -mmcu=attiny4313 -Os -o vitrinencontroller.o vitrinencontroller.c -v
2

3
Using built-in specs.
4
COLLECT_GCC=avr-gcc-462
5
COLLECT_LTO_WRAPPER=/opt/cross/avr/lib64/gcc/avr/4.6.2/lto-wrapper
6
Target: avr
7
Configured with: ../gcc-4.6.2/configure -v --prefix=/opt/cross/avr --exec-prefix=/opt/cross/avr --libdir=/opt/cross/avr/lib64 --libexecdir=/opt/cross/avr/lib64 --mandir=/opt/cross/avr/share/man --infodir=/opt/cross/avr/share/info --with-gnu-ld --with-gnu-as --target=avr --enable-languages=c,c++ --program-prefix=avr- --program-suffix=-462 --with-sys-root=/opt/cross/avr --disable-nls --disable-libssp --with-dwarf2 --with-ppl --with-cloog
8
Thread model: single
9
gcc version 4.6.2 (GCC)
10
COLLECT_GCC_OPTIONS='-mmcu=attiny4313' '-Os' '-o' 'vitrinencontroller.o' '-v'
11
 /opt/cross/avr/lib64/gcc/avr/4.6.2/cc1 -quiet -v -imultilib avr25 vitrinencontroller.c -quiet -dumpbase vitrinencontroller.c -mmcu=attiny4313 -auxbase vitrinencontroller -Os -version -o /tmp/cc2CdcMf.s
12
GNU C (GCC) version 4.6.2 (avr)
13
  compiled by GNU C version 4.5.1 20101208 [gcc-4_5-branch revision 167585], GMP version 4.3.1, MPFR version 2.4.1, MPC version 0.8.2
14
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
15
ignoring nonexistent directory "/opt/cross/avr/lib64/gcc/avr/4.6.2/../../../../avr/sys-include"
16
#include "..." search starts here:
17
#include <...> search starts here:
18
 /opt/cross/avr/lib64/gcc/avr/4.6.2/include
19
 /opt/cross/avr/lib64/gcc/avr/4.6.2/include-fixed
20
 /opt/cross/avr/lib64/gcc/avr/4.6.2/../../../../avr/include
21
End of search list.
22
GNU C (GCC) version 4.6.2 (avr)
23
  compiled by GNU C version 4.5.1 20101208 [gcc-4_5-branch revision 167585], GMP version 4.3.1, MPFR version 2.4.1, MPC version 0.8.2
24
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
25
Compiler executable checksum: ac8561fadc0ef465e608e5307f37bf40
26
COLLECT_GCC_OPTIONS='-mmcu=attiny4313' '-Os' '-o' 'vitrinencontroller.o' '-v'
27
 /opt/cross/avr/lib64/gcc/avr/4.6.2/../../../../avr/bin/as -v -mmcu=attiny4313 -o /tmp/ccCyvqfh.o /tmp/cc2CdcMf.s
28
GNU assembler version 2.22 (avr) using BFD version (GNU Binutils) 2.22
29
COMPILER_PATH=/opt/cross/avr/lib64/gcc/avr/4.6.2/:/opt/cross/avr/lib64/gcc/avr/4.6.2/:/opt/cross/avr/lib64/gcc/avr/:/opt/cross/avr/lib64/gcc/avr/4.6.2/:/opt/cross/avr/lib64/gcc/avr/:/opt/cross/avr/lib64/gcc/avr/4.6.2/../../../../avr/bin/
30
LIBRARY_PATH=/opt/cross/avr/lib64/gcc/avr/4.6.2/avr25/:/opt/cross/avr/lib64/gcc/avr/4.6.2/../../../../avr/lib/avr25/:/opt/cross/avr/lib64/gcc/avr/4.6.2/:/opt/cross/avr/lib64/gcc/avr/4.6.2/../../../../avr/lib/
31
COLLECT_GCC_OPTIONS='-mmcu=attiny4313' '-Os' '-o' 'vitrinencontroller.o' '-v'
32
 /opt/cross/avr/lib64/gcc/avr/4.6.2/collect2 -m avr25 -o vitrinencontroller.o /opt/cross/avr/lib64/gcc/avr/4.6.2/../../../../avr/lib/avr25/crttn4313.o -L/opt/cross/avr/lib64/gcc/avr/4.6.2/avr25 -L/opt/cross/avr/lib64/gcc/avr/4.6.2/../../../../avr/lib/avr25 -L/opt/cross/avr/lib64/gcc/avr/4.6.2 -L/opt/cross/avr/lib64/gcc/avr/4.6.2/../../../../avr/lib /tmp/ccCyvqfh.o -lgcc -lc -lgcc
33

34
/tmp/ccCyvqfh.o: In function `check_eemem':
35
vitrinencontroller.c:(.text+0x6c): undefined reference to `__eerd_byte_tn4313'
36
vitrinencontroller.c:(.text+0x7a): undefined reference to `__eewr_byte_tn4313'
37
vitrinencontroller.c:(.text+0x82): undefined reference to `__eewr_byte_tn4313'
38
vitrinencontroller.c:(.text+0x8c): undefined reference to `__eewr_word_tn4313'
39
vitrinencontroller.c:(.text+0x96): undefined reference to `__eewr_word_tn4313'
40
vitrinencontroller.c:(.text+0x9e): undefined reference to `__eewr_byte_tn4313'
41
/tmp/ccCyvqfh.o: In function `init_variables_from_eeprom':
42
vitrinencontroller.c:(.text+0xa6): undefined reference to `__eerd_byte_tn4313'
43
vitrinencontroller.c:(.text+0xb0): undefined reference to `__eerd_byte_tn4313'
44
vitrinencontroller.c:(.text+0xba): undefined reference to `__eerd_word_tn4313'
45
vitrinencontroller.c:(.text+0xc8): undefined reference to `__eerd_word_tn4313'
46
collect2: ld returned 1 exit status
1
/// EEPROM variables
2
uint8_t chip_erase_check EEMEM;
3
uint8_t prog_speed_eemem EEMEM;
4
uint8_t prog_wait_eemem EEMEM;
5
uint16_t powerleda_on_eemem EEMEM;
6
uint16_t powerledb_on_eemem EEMEM;
OP #2557976
Lesenswert?
• ▲
▼
J. W. schrieb:
>> und schau rein woher er diese
>> Funktionen nehmen will.
>
> Ist angehängt.

Achso, sorry. Ich sollte ja selber schauen. Das habe ich auch, aber 
leider werde ich nicht wirklich schlau draus.
Die Suche hier bringt übrigens auch nichts, was hilft.

LG :)

Nachtrag: Im Map-File findet sich nur dieser Abschnitt zum EEPROM. Aber 
da steht ja nirgens, woher er die Funktionen nehmen will? Ist das 
überhaupt das Problem, was mit 'undefined reference' gemeint ist?
Im Mapfile finde ich, wenn ich das richtig deute, wohl nur die 
Speicheradressen der EEPROM-Variablen.
1
.eeprom         0x0000000000810000        0x7
2
 *(.eeprom*)
3
 .eeprom        0x0000000000810000        0x7 /tmp/cc835xwu.o
4
                0x0000000000810000                powerledb_on_eemem
5
                0x0000000000810002                powerleda_on_eemem
6
                0x0000000000810004                prog_wait_eemem
7
                0x0000000000810005                prog_speed_eemem
8
                0x0000000000810006                chip_erase_check
9
                0x0000000000810007                __eeprom_end = .
OP #2558112
Lesenswert?
• ▲
▼
Entwarnung!

Meine eigenen Nachforschungen in Richtung fehlende Implementierung in 
der avr-libc von SuSE für den ATtiny4313 waren erfolgreich.
Ich kenne das ja schon: Beitrag "Für ATtiny4313 kompilieren?"

Auch hier hat es wieder geholfen, die Datei .../avr/avr/lib/avr25/libc.a 
aus dem Fedora-Repository zu "klauen" und die bestehende aus dem 
SuSE-Repo damit zu ersetzen.

Läuft alles!

LG :)

Antwort schreiben

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.

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.