Forum: Compiler & IDEs [avr-libc 1.6.2] [avr-gcc 4.3.2] eeprom_write_block nicht für einzelnes Byte nutzbar?


von Heiko (Gast)


Lesenswert?

Moin moin,

bevor ich jetzt ins Wochenende gehe, hätte ich gerne von euch noch ein 
"Wie blöd bist du denn" gehört ;)

Ich habe - neben vielem anderen - in meinem Code folgende Schnipsel:
1
#include <inttypes.h>
2
3
#include <avr/io.h>
4
#include <avr/eeprom.h>
5
6
uint8_t eeLCDBacklight EEMEM = 50;
7
8
uint8_t LCDBacklight;
9
10
void sendToEEPROM(void)
11
{
12
   // funktioniert nicht
13
   // eeprom_write_block(&LCDBacklight, &eeLCDBacklight, 1);
14
   // funktioniert
15
   eeprom_write_byte(&eeLCDBacklight, LCDBacklight);
16
}

Die "umgekehrte Reihenfolge" der Parameter ist mMn richtig (andererseits 
sitze ich auch schon länger hier vor dem Rechner) - siehe 
http://www.gnu.org/savannah-checkouts/non-gnu/avr-libc/user-manual/group__avr__eeprom.html 
(oder wurde das erst zwischen 1.6.2 und heute geändert?)

Wo könnte noch ein Fehler liegen, der eeprom_write_block fehlschlagen 
lässt, wo eeprom_write_byte an derselben Stelle mit denselben Adressen 
einwandfrei funktioniert? (Funktion bzw. Nichtfunktion nachgewiesen 
durch avrdude -t ... und dann am Prompt "r eeprom")

Kompiliert wird das ganze (über WinAVR-Makefile) mit
avr-gcc -c -mmcu=atmega32 -I. -g -Os -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=myeeprom.lst -std=gnu99 -DF_CPU=16000000 
-MD -MP -MF .dep/myeeprom.o.d myeeprom.c -o myeeprom.o

Meine Version der avr-libc und des avr-gcc stehen oben.

Fällt einem von euch irgendwas typisches ein, das ich vergessen haben 
könnte? EEPROM-Waitstates bei 16MHz, die von der einen Funktion 
automatisch eingefügt werden, von der anderen nicht, oder sowas? Oder 
ist das gar ein bekannter Bug, den ich nur beim googlen nicht gefunden 
habe?

Vielen Dank für alle Anregungen,

MfG, Heiko

(Das ganze soll in eine Funktion, die eine Queue von ins EEPROM zu 
schreibenden Daten zyklisch abarbeitet - um die Latenzen kürzer zu 
halten, kann ich nicht sofort nach Änderung die Änderung ins EEPROM 
schreiben - ansonsten könnte ich wunderbar mit eeprom_write_byte leben)

von Heiko (Gast)


Lesenswert?

Ich mach mal die Ingrid: Heute habe ich dann auch den Bugtracker für 
avr-libc gefunden - und damit den folgenden Bug 
http://savannah.nongnu.org/bugs/?22828

Naja, Volltreffer, würde ich mal sagen. Bei 16kB Hex-File muss man ja 
mal einen Bug erwischen...

Gibt es einen sinnvollen Weg, doch eeprom_write_block zu nutzen, ohne 
dass mir das dann beim nächsten Update um die Ohren fliegt? So in der 
Art eines
1
#ifdef AVR_LIBC_1.6.2
2
eeprom_write_block(&eeLCDBacklight, &LCDBacklight, 1);
3
#else
4
eeprom_write_block(&LCDBacklight, &eeLCDBacklight, 1);
5
#endif

Ich weiß, dass dieses Beispiel nicht geht, da der Präprozessor wohl kaum 
weiß, welche Version der libc der Linker am Ende einlinken will... aber 
fällt euch eine halbwegs geschickte Variante außer einer BIG FAT WARNING 
ein?

(Gentoo crossdev bietet derzeit noch keine avr-libc >1.6.2 an und ich 
habe wenig Lust, sie manuell zu installieren, wenn es sich vermeiden 
lässt - vermutlich wohl nicht, dank des eeprom_read_byte-Bugs, in den 
ich ja sonst auch laufen werde)

MfG, Heiko

von Werner B. (werner-b)


Lesenswert?

Doch, weiss er
1
#if (__AVR_LIBC_VERSION__ == 10602UL)
2
...

Ob jetzt v1.6.2 wirklich "10602" ist weiss ich nicht, kannst du dir aber 
ausgeben lassen ;-)

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


Lesenswert?

Heiko wrote:

> (Gentoo crossdev bietet derzeit noch keine avr-libc >1.6.2 an und ich
> habe wenig Lust, sie manuell zu installieren, wenn es sich vermeiden
> lässt - vermutlich wohl nicht, dank des eeprom_read_byte-Bugs, in den
> ich ja sonst auch laufen werde)

Naja, Gentoo crossdev ist mittlerweile nicht mehr sonderlich gut
gepflegt, leider.  Unter Linux bietet sich derzeit wohl Bingo600's
Script als beste Variante an:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=42631

von Heiko (Gast)


Lesenswert?

Vielen Dank Werner, damit hätte ich überhaupt nicht gerechnet.

1.6.2 ist tatsächlich 10602 :)

Jörg, du hast Recht, crossdev schläft wohl seit einer Zeit recht tief 
und fest. Um Alternativen kümmere ich mich aber erst nach meiner 
Studienarbeit...

MfG, Heiko

von Werner B. (werner-b)


Lesenswert?

> Unter Linux bietet sich derzeit wohl Bingo600's Script als beste Variante an:

Man braucht im Script getfiles.sh und buildavr-no-insight.sh nur die 
1.6.2  durch 1.6.4 ersetzen. Compiliert fehlerfrei und man bekommt die 
AVRLibC 1.6.4

Werner

von Heiko (Gast)


Lesenswert?

Nur nochmal als Rückmeldung: Ich habe crossdev wohl doch ein wenig 
Unrecht getan, seit gestern Abend (auf einen Bugreport hin...) ist auch 
1.6.4 in den Repositorys.

MfG, Heiko

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.