Forum: Compiler & IDEs avr, gcc: eigene eeprom-Routinen prgrammieren, Linkerkonflikt


von Harald P. (haraldp)


Lesenswert?

Ich arbeite mich gerade in den ATMEGA-Klon lgt8F328p ein. Dort werden 
die EE-Daten im Flash abgespeichert. Das funktioniert auch. Jetzt möchte 
ich EE-Prozeduren definieren, die genauso heißen wie in der avr-lib 
(/avr/eeprom.h), also z.B. eeprom_read_byte(). Das Übersetzen klappt, 
aber es gibt einen Fehler beim Linken, der besagt, daß es einen Konflikt 
mit libatmega328p gibt. Nun binde ich die AVR-Bibliothek (/avr/eeprom.h) 
gar nicht ein.
Gibt es eine Möglichkeit festzulegen, daß nur meine eigene 
eeprom_read_byte() Prozedur verwendet wird? Übrigens verwende ich hier 
noch AVR-Studio 4, aber das dürfte wohl keine Rolle spielen.
Harald

Fehlermeldung:
d:/prog/winavr/bin/../lib/gcc/avr/5.3.0/../../../../avr/lib/avr5\libatme 
ga328p.a(eewr_byte.o):  In function `eeprom_write_byte':
EEPROM_LGT.o:D:\Pes\AVR\Test_LGT\default/../EEPROM_LGT.c:22: first 
defined here

von leo (Gast)


Lesenswert?

Harald P. schrieb:
> Gibt es eine Möglichkeit festzulegen, daß nur meine eigene
> eeprom_read_byte() Prozedur verwendet wird?

Ich schaetze mal du musst in den Arduino-Sourcen herumwuehlen und dort 
die Funktionen als "weak" definieren.
Alternativ kannst du auch eine eigene HW anlegen.

leo

von leo (Gast)


Lesenswert?

leo schrieb:
> Alternativ kannst du auch eine eigene HW anlegen.

Sorry, ist ja schon: 
https://github.com/RalphBacon/LGT8F328P-Arduino-Clone-Chip-ATMega328P

Also dort die Anpassungen machen.

leo

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Harald P. schrieb:
> Nun binde ich die AVR-Bibliothek (/avr/eeprom.h) gar nicht ein.

Das ist keine "Bibliothek", das ist ein Header.

leo schrieb:
> Ich schaetze mal du musst in den Arduino-Sourcen herumwuehlen und dort
> die Funktionen als "weak" definieren.

Was hat das mit Arduino-Sourcen zu tun? Der TO spricht von "AVR-Studio 
4", das hat nun mal gar nichts mit Arduino zu tun. Es geht hier um die 
AVR-Libc.

Erst lesen, dann schreiben.

: Bearbeitet durch Moderator
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Harald P. schrieb:
> Gibt es eine Möglichkeit festzulegen, daß nur meine eigene
> eeprom_read_byte() Prozedur verwendet wird?

Irgendwer scheint irgendwas aufzurufen, was den Linker veranlasst, 
überhaupt erst die entsprechenden Module der avr-libc einzubinden. Das 
solltest du verhindern, aber vorher musst du rausfinden, was das 
verursacht.

(Der Linker bindet nur solche Objektmodule aus Bibliotheken ein, die 
eine bis zu diesem Zeitpunkt ungelöste externe Referenz auflösen 
helfen.)

> Übrigens verwende ich hier
> noch AVR-Studio 4, aber das dürfte wohl keine Rolle spielen.

In gewisser Weise schon, denn es ist ja offensichtlich deine IDE, die 
den Aufruf des Linkers zusammenbastelt, der genau zu diesem Problem 
führt.

von leo (Gast)


Lesenswert?

Frank M. schrieb:
>> Ich schaetze mal du musst in den Arduino-Sourcen herumwuehlen und dort
>> die Funktionen als "weak" definieren.
>
> Was hat das mit Arduino-Sourcen zu tun?

Sorry, verlesen. An "weak" aendert das aber nichts.

leo

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

leo schrieb:
> An "weak" aendert das aber nichts.

Doch.

weak wird überschätzt. Ist hier absolut nicht nötig, da die avr-libc 
modular genug ist, als dass deren Module eigentlich vom Linker gar nicht 
erst in Betracht gezogen werden sollten. Warum sie es trotzdem 
werden, muss der TE allerdings schon selbst rausfinden. Sich hinter 
einer IDE zu verstecken, die einem die entsprechenden Compileraufrufe 
generiert, ist da eher suboptimal, wenn man derartiges debuggen will.

von Harald P. (haraldp)


Lesenswert?

So (mein) Fehler gefunden: Ich hatte an anderer Stelle noch einige 
EE-Funktionen wie eeprom_read_block etc. verwendet - ohne den Header 
einzubinden. Der Linker scheint dann so schlau zu sein, daß er dann die 
Standard-EE-Routinen in Gänze einbindet. Er meckert also nicht, daß die 
Funktionen nicht definiert sind. Auf diese Weise gibt es dann den 
Konflikt.
Vielen Dank für eure Hilfe!
Harald

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Harald P. schrieb:
> Jetzt möchte ich EE-Prozeduren definieren, die genauso heißen wie
> in der avr-lib (/avr/eeprom.h), also z.B. eeprom_read_byte().
> Das Übersetzen klappt, aber es gibt einen Fehler beim Linken, der besagt,
> daß es einen Konflikt mit libatmega328p gibt.

Linken mit -nodevicelib, wird unterstützt ab v5:

http://gcc.gnu.org/gcc-5/changes.html#avr

http://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html#index-nodevicelib

In der lib<device>.a sind EEPROM-Routinen, ich weiß aber grad nicht ob 
da noch anderes Zeug drinne ist.  Also in die avr-libc Quellen gucken 
oder Jörg fragen.

Und in avr/eeprom.h sind nicht nur Prototypen, sondern auch Makros wie 
eeprom_busy_wait() oder eeprom_is_ready().

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Linken mit -nodevicelib, wird unterstützt ab v5:
>
> http://gcc.gnu.org/gcc-5/changes.html#avr
>
> http://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html#index-nodevicelib

Soweit ich weiß werden Device-Libs ebenfalls erst ab v5 unterstützt, 
vorher waren die entsprechenden Funktionen Teil der libc.a (avr-libc 
configure testet die Compilerversion ab).

Verfügbarkeit der Option ist also gegeben.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> vorher waren die entsprechenden Funktionen Teil der libc.a

Ist aber auch nicht wirklich tragisch. Wenn die Module aus der libc.a 
nicht referenziert werden (also nicht am Ende als "global undefined" 
auftauchen), weil sie halt zuvor bereits durch eigene eingebundene 
Routinen aufgelöst werden konnten, dann werden diese Module nicht aus 
der Standardbibliothek gelinkt – egal, ob libc.a oder separate device 
lib.

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.