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


von Bernhard N. (bernieserver)


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

von Lutz (Gast)


Lesenswert?

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

von Bernhard N. (bernieserver)


Lesenswert?

Ja nutze die eeprom_read & write funktionen aus der lib

von Bernhard N. (bernieserver)


Lesenswert?

Hallo,

ich konkretisiere das gane mal mit ein bisschen Code:
1
// Das Array aus DWORDs, Platz ist EEPROM:
2
uint32_t EEDesGraphsMemory[EEPARTSIZE] EEMEM;
3
4
// Das erste Byte von Doppelwort 13 soll ausgelesen werden
5
uint16_t ZeigeaufDWord13 = 13
6
7
// Der Zugriff: Problem: Big / Little Endian ?
8
uint16_t FirstByte = eeprom_read_word((uint8_t*)&EEDesGraphsMemory[ZeigeaufDWord13]);

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

Gruß
Bernhard

von Seltsam (Gast)


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
1
uint8_t header = eeprom_read_dword(&EEDesGraphsMemory[ZeigeaufDWord13]) & 0x7F;

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

von Bernhard N. (bernieserver)


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

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.