Forum: Compiler & IDEs Code Blocks - undefined reference to __eerd_byte_m168


von Florian R. (leech666)


Angehängte Dateien:

Lesenswert?

Hallo,

ich weiß nicht ob ich hier im richtigen Forum bin, aber meine (leider 
erfolglosen) Recherchen zu diesem Problem haben einige Beiträge im 
Unterforum GCC angezeigt.

Mein Problem:

Ich möchte den angehängten Code mit Code:Blocks (Nightly Build 7789) + 
WinAVR-20100110 compilieren, erhalte aber folgende Fehlermeldungen im 
Build log bzw in den Build Messages.

Build log
1
-------------- Build: Release in AVRIS ---------------
2
3
Compiling: main.c
4
Linking native: bin\Release\AVRIS.elf
5
obj\Release\main.o: In function `main':
6
main.c:(.text+0x22): undefined reference to `__eerd_byte_m168'
7
main.c:(.text+0x1ca): undefined reference to `__eerd_byte_m168'
8
main.c:(.text+0x1da): undefined reference to `__eewr_byte_m168'
9
Process terminated with status 1 (0 minutes, 0 seconds)
10
3 errors, 0 warnings (0 minutes, 0 seconds)

Build Messages
1
obj\Release\main.o||In function `main':|
2
main.c:(.text+0x22)||undefined reference to `__eerd_byte_m168'|
3
main.c:(.text+0x1ca)||undefined reference to `__eerd_byte_m168'|
4
main.c:(.text+0x1da)||undefined reference to `__eewr_byte_m168'|
5
||=== Build finished: 3 errors, 0 warnings (0 minutes, 0 seconds) ===|

Ich hab jetzt bereits ein paar Stunden erfolglos gegoogelt und irgendwie 
keine Lösung für dieses Problem gefunden. Einige Threads hier und da 
besagen, dass sich die eeprom.h stark geändert hat und das libc.o nicht 
zusammenpasst oder so. Das alles sagt mir also Compiler/IDE Noob 
überhaupt nichts. Es bietet sich mir aus diesen Antworten kein 
Lösungsansatz, da ich die hinterlegte Technik und das Zusammenspiel 
zwischen Compiler, Linker und Tüdelüt nicht verstehe.

Kann mir jemand weiterhelfen?

Gruß,
Florian

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Versuch mal
>> Tüdelüt -mmcu=atmega168
anstatt
>> Tüdelüt

Wenn das nicht hilft: poste die Optionen, mit denen Tüdelüt und Täterä 
aufgerufen werden.

von Florian R. (leech666)


Lesenswert?

Ich nehme an du meinst das, was sich in Code:Blocks Compiler Flags
nennt.

So wie es aussieht nur:

Optimize generated code (for size) [Os]
und
ATmega168 [-mmcu=atmega168]

Fehlermeldung ist bleibt gleich, egal ob ATmega168 [-mmcu=atmega168]
angeklickt ist oder nicht.

Gruß,
Florian

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Florian R. schrieb:
> Ich nehme an du meinst das, was sich in Code:Blocks Compiler Flags
> nennt.

Nein.

Das, was Compiler, Linker, Assembler etc. an Optionen erhalten.

Das ist jeweils eine Zeile an Text.

Wie auch immer die GUI oder IDE oder make oder wer auch immer diesen 
Aufruf zusammenbasteln ist egal. Was zählt, ist das Resultat. 
Irdendwo/wie muss sich das doch anzeigen lassen?

von Florian R. (leech666)


Lesenswert?

Okay ich hab jetzt folgendes eingestellt:

Unter Settings -> Compiler and debugger -> Global compiler settins -> 
Reiter "Other Settings" -> Compiler Logging auf Full Command Line

Jetzt steht im Buildlog folgendes:
1
-------------- Build: Release in AVRIS ---------------
2
3
avr-g++.exe -LC:\C_Programming\AVRIS\ -LC:\WinAVR-20100110\avr\lib  -o bin\Release\AVRIS.elf obj\Release\main.o obj\Release\fuse.o   -mmcu=atmega168 -Wl,-Map=bin\Release\AVRIS.map,--cref  
4
obj\Release\main.o: In function `main':
5
main.c:(.text+0x22): undefined reference to `__eerd_byte_m168'
6
main.c:(.text+0x1ca): undefined reference to `__eerd_byte_m168'
7
main.c:(.text+0x1da): undefined reference to `__eewr_byte_m168'
8
Process terminated with status 1 (0 minutes, 0 seconds)
9
3 errors, 0 warnings (0 minutes, 0 seconds)

Hoffe das ist die von dir gewünschte Information.

Gruß,
Florian

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Florian R. schrieb:

> -LC:\WinAVR-20100110\avr\lib

Lass das weg. Demit überschreibst du den (richtigen) Libpfad der Tools.

Wenn du ins erzeugte Map reinschaust siehst du, daß die falsche 
Bibliotheksversion verwendet wird. Die richtige für ATmeha168 ist avr5.

> -LC:\C_Programming\AVRIS\

Wozu brauchst das? D.h. welche (nicht gelinkten) Libs flottieren dort 
rum?

von Florian R. (leech666)


Lesenswert?

Danke, es geht jetzt. (Nach Entfernen des Pfads 
C:\WinAVR-20100110\avr\lib).
1
-------------- Build: Release in AVRIS ---------------
2
3
avr-gcc.exe -Wall -mmcu=atmega168 -DF_CPU=16000000UL  -mmcu=atmega168 -Os  -Os   -IC:\C_Programming\AVRIS\  -c main.c -o obj\Release\main.o
4
avr-g++.exe -LC:\C_Programming\AVRIS\  -o bin\Release\AVRIS.elf obj\Release\fuse.o obj\Release\main.o   -mmcu=atmega168 -Wl,-Map=bin\Release\AVRIS.map,--cref  
5
Output size is 3.30 KB
6
Running project post-build steps
7
cmd /c "avr-objdump -h -S bin\Release\AVRIS.elf > bin\Release\AVRIS.lss"
8
avr-objcopy -R .eeprom -R .fuse -R .lock -R .signature -O ihex bin\Release\AVRIS.elf bin\Release\AVRIS.hex
9
avr-objcopy --no-change-warnings -j .eeprom --change-section-lma .eeprom=0 -O ihex bin\Release\AVRIS.elf bin\Release\AVRIS.eep
10
avr-objcopy --no-change-warnings -j .lock --change-section-lma .lock=0 -O ihex bin\Release\AVRIS.elf bin\Release\AVRIS.lock
11
avr-objcopy --no-change-warnings -j .signature --change-section-lma .signature=0 -O ihex bin\Release\AVRIS.elf bin\Release\AVRIS.sig
12
avr-objcopy --no-change-warnings -j .fuse --change-section-lma .fuse=0 -O ihex bin\Release\AVRIS.elf bin\Release\AVRIS.fuse
13
srec_cat bin\Release\AVRIS.fuse -Intel -crop 0x00 0x01 -offset  0x00 -O bin\Release\AVRIS.lfs -Intel 
14
srec_cat bin\Release\AVRIS.fuse -Intel -crop 0x01 0x02 -offset -0x01 -O bin\Release\AVRIS.hfs -Intel 
15
srec_cat bin\Release\AVRIS.fuse -Intel -crop 0x02 0x03 -offset -0x02 -O bin\Release\AVRIS.efs -Intel 
16
Process terminated with status 0 (0 minutes, 1 seconds)
17
0 errors, 0 warnings (0 minutes, 1 seconds)

Ich glaub den Pfad hatte ich mal eingestellt, weil ich rumgetestet habe 
wie ich meine eigene .h-Datei einbinden kann. Kann aber auch default 
gewesen sein, weiß ich nicht mehr so genau.

Mittlerweile hab ich es hinbekommen die .h-Datei einzubinden, aber ich 
finde es unheimlich unintuitiv, dass wenn ich im Projektverzeichnis eine 
.h-Datei anlege und diese in den Project-Baum mit aufnehme, dass diese 
dann nicht ohne weitere Pfadeinstellungen (Search Directories) gleich 
mit includiert werden kann.

Ich hab's aus Frust zwischenzeitlich mal mit Eclipse + AVR Plugin 
probiert, aber da hat er dann schon die Standard includes (z.B. 
avr/io.h) nicht mehr finden können. Die Pfadeinstellungen waren für mich 
als Vollnoob gefühlt zehnfach so komplex ein zu stellen.

Aber vielleicht bin ich mit dieser Meinung ja ganz alleine und sollte 
lieber mal den Peter Nuhr machen. :)

In C:\C_Programming\AVRIS\ liegt die von mir selbst angelegte 
danni_debounce.h. Auf den enthaltenen Code habe ich keinen Anspruch. Der 
ist natürlich von Peter).

Danke nochmal für die Hilfe.

//EDIT:

Jo, man kann den C-Code auch direkt im Arduino-IDE compilieren, 
allerdings scheint die Arduino-IDE keine Kommentare oder excessive 
Leerzeichen-Orgien (wie sie manchmal zur Textformatierung ja ganz 
nützlich sind) in mehrzeiligen Makros zu mögen. Da regnet es auf jeden 
Fall hunderte von Fehlermeldungen.

Wenn der Makro-Code so:
1
/**************************************/
2
/* Not so powerful Debouncing Example */
3
/* No Interrupt needed                */
4
/* Author: Peter Dannegger            */
5
/**************************************/
6
#define debounce(port,pin)({\
7
    static uint8_t flag = 0;\
8
    uint8_t i = 0;\
9
    if( flag )\
10
    {\
11
        while(1)\
12
        {\
13
            if( !(port & 1<<pin) )\
14
            {\
15
                i = 0;\
16
                break;\
17
            }\
18
            _delay_us( 98 );\
19
            if( --i == 0 )\
20
            {\
21
                flag = 0;\
22
                i = 0;\
23
                break;\
24
            }\
25
        }\
26
    }\
27
    else\
28
    {\
29
        while(1)\
30
        {\
31
            if( (port & 1<<pin) )\
32
            {\
33
                i = 0;\
34
                break;\
35
            }\
36
            _delay_us( 98 );\
37
            if( --i == 0 )\
38
            {\
39
                flag = 1;\
40
                i = 1;\
41
                break;\
42
            }\
43
        }\
44
    }\
45
    i;\
46
})

formatiert ist, geht es allerdings.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Florian R. schrieb:

> Ich glaub den Pfad hatte ich mal eingestellt, weil ich rumgetestet habe
> wie ich meine eigene .h-Datei einbinden kann. Kann aber auch default
> gewesen sein, weiß ich nicht mehr so genau.
>
> Mittlerweile hab ich es hinbekommen die .h-Datei einzubinden, aber ich
> finde es unheimlich unintuitiv, dass wenn ich im Projektverzeichnis eine
> .h-Datei anlege und diese in den Project-Baum mit aufnehme, dass diese
> dann nicht ohne weitere Pfadeinstellungen (Search Directories) gleich
> mit includiert werden kann.

Weil:    #include <danni_debounce.h>
Anstatt: #include "danni_debounce.h"

danni_debounce.h ist kein Systemheader wie math.h

> Jo, man kann den C-Code auch direkt im Arduino-IDE compilieren,
> allerdings scheint die Arduino-IDE keine Kommentare oder excessive
> Leerzeichen-Orgien (wie sie manchmal zur Textformatierung ja ganz
> nützlich sind) in mehrzeiligen Makros zu mögen. Da regnet es auf jeden
> Fall hunderte von Fehlermeldungen.

Wenn es nur ein // Kommentar bis zum Zeilenende ist, ist das auch 
richtig so

> Wenn der Makro-Code so:

ogottogottogott

Das so als Makr reinzukloppen damit fängst du dir nur Probleme ein!
Warum? ZB fehlende Klammern um die Parameter, etc.

mach das als inline-Funktion. Ist zudem lesbarer und portabler da kein 
GNU-C erforderlich ist.

von Florian R. (leech666)


Lesenswert?

Das Makro kommst aus diesem Artikel:
http://www.mikrocontroller.net/articles/Entprellung#Debounce-Makro_von_Peter_Dannegger

Vorher hatte ich noch nie mit Makros zu tun. Inline Funktionen musste 
ich bisher auch noch nie verwenden, aber ich hab bisher halt auch nur so 
den normalen C Anfänger kram für die Kommandozeile programmiert.

Die Begründung warum das ganze als Makro realisiert wurde (in Peters 
Thread im Artikel) erschien mir irgendwie einleuchtend, von daher habe 
ich das nicht hinterfragt und einfach Stumpf übernommen.

Gruß,
Florian

//Edit, okay hab mal ein bischen über Inline Funktionen gelesen, scheint 
mir der bessere weg zu sein, ich werds mal ausprobieren ob ich das 
hinbekomme.

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.