[avr-libc 1.6.2] [avr-gcc 4.3.2] eeprom_write_block nicht für einzelnes Byte nutzbar?

Gast #1146782
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)
Gast
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
Moderator Persönliche Seite
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
Gast
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
> 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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.