Forum: Mikrocontroller und Digitale Elektronik Fehler bei Nutzung von <avr/eeprom.h>


von J. W. (jw-lighting)


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;

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Lasseben man ein map-file erzeugen und schau rein woher er diese 
Funktionen nehmen will.

Wozu setzt du denn --libdir im configure?

von J. W. (jw-lighting)


Angehängte Dateien:

Lesenswert?

Johann L. schrieb:
> Lasseben man ein map-file erzeugen und schau rein woher er diese
> Funktionen nehmen will.

Ist angehängt.

Johann L. schrieb:
> Wozu setzt du denn --libdir im configure?

Gute Frage :) Habe den so aus dem SuSE-Repository installiert.


Dank dir schonmal.

LG :)

von J. W. (jw-lighting)


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 = .

von J. W. (jw-lighting)


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 :)

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.