www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [ATMega] Little / Big Endian und EEPROM


Autor: Bernhard N. (bernieserver)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mehrere 32 Bit Datenzellen, die je einen "Header" beinhalten, 
die ich zu Dutzenden ins EEPROM speichern will. Die Zelle ist wie gesagt 
4 Bytes lang, der Header nutzt dabei die Bits 0 bis 6. Ich will nun nur 
das Byte mit dem Header auslesen.

Wenn ich nun aufs erste Byte einer einzelnen Zelle über das Index des 
32Bit Arrays zugreifen will:

Betrifft mich dann überhaupt die Little / Big Endian - Problematik oder 
badet das der Compiler zuverlässig aus?


Ich programmiere in C mit AVR Studio, nutze die GCC Toolchain. Targets 
sind diverse ATMegas (32, 2561 1281 etc.)

Gruß
Bernhard

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mal sagen, daß die avr-libc Dir das abnimmt (sofern Du sie 
benutzt und auch beim Schreiben benutzt)

Autor: Bernhard N. (bernieserver)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja nutze die eeprom_read & write funktionen aus der lib

Autor: Bernhard N. (bernieserver)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich konkretisiere das gane mal mit ein bisschen Code:
// Das Array aus DWORDs, Platz ist EEPROM:
uint32_t EEDesGraphsMemory[EEPARTSIZE] EEMEM;

// Das erste Byte von Doppelwort 13 soll ausgelesen werden
uint16_t ZeigeaufDWord13 = 13

// Der Zugriff: Problem: Big / Little Endian ?
uint16_t FirstByte = eeprom_read_word((uint8_t*)&EEDesGraphsMemory[ZeigeaufDWord13]);

Geht das so? Wenn nein wie kann mans besser machen?

Gruß
Bernhard

Autor: Seltsam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> uint16_t FirstByte =
  ^^^^^^^^      ^^^^
> eeprom_read_word((uint8_t*)&EEDesGraphsMemory[ZeigeaufDWord13]);
              ^^^^  ^^^^^^^

Was für ein Doppelkuddelmuddel mit Byte und Word!

> ich habe mehrere 32 Bit Datenzellen, die je einen "Header" beinhalten,
> die ich zu Dutzenden ins EEPROM speichern will. Die Zelle ist wie gesagt
> 4 Bytes lang, der Header nutzt dabei die Bits 0 bis 6. Ich will nun nur
> das Byte mit dem Header auslesen.

Komplette Datenzelle lesen und Header (Bit0-Bit6) extrahieren
uint8_t header = eeprom_read_dword(&EEDesGraphsMemory[ZeigeaufDWord13]) & 0x7F;

Oder nur das niederwertigeste Byte lesen und Header (Bit0-Bit6) 
extrahieren
uint8_t header = eeprom_read_byte(&EEDesGraphsMemory[ZeigeaufDWord13])  & 0x7F;

Autor: Bernhard N. (bernieserver)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, der Kuddelmuddel ist mir beim Kopieren pasiert, das ist beim 
Programmieren alles korrekt ;)

Ich werde die "Optimierung" des etwas schnelleren Rauslesens also 
rausnehmen und das komplette DWORD rauslesen.

Gruß
Bernhard

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.