uint64_t direkt im EEprom eines AVRs möglich?

Gast #3053172
Lesenswert?

Hallo,

kurze Frage:

eine 64-Bit-Integer (uint64_t) direkt im EEprom eines AVRs 
ablegen/auslesen geht nicht, oder?

(wenn nein, mache ich es anders)



#include <avr/eeprom.h>
...
eeprominhalt = eeprom_read_dword(&eezahl);

funktioniert, aber nur mit 32 Bit.

Gibt es eine Alternative zu "..._dword(...", mit der 
64Bit-Unsigned-Integer direkt gelesen (bzw. vorher entsprechend 
abgelegt) werden können?

(benutze übrigens derzeit AVR-Studio 4.19, eventuell spielt das eine 
Rolle)
#3053178
Lesenswert?

hermy schrieb:

> Gibt es eine Alternative zu "..._dword(...", mit der
> 64Bit-Unsigned-Integer direkt gelesen (bzw. vorher entsprechend
> abgelegt) werden können?


Meines Wissens nicht. Aber mit Hilfe der eeprom_read_block Funktion ist 
es trivial sich eine entsprechende Funktion zu schreiben.
1
uint64_t eeprom_read_qword( uint64_t* addr )
2
{
3
  uint64_t value;
4
  eeprom_read_block( &value, addr, sizeof(uint64_t) );
5
  return value;
6
}

und die gegenteilige write Funktion ist auch nicht schwerer zu 
schreiben.
Gast #3053194
Lesenswert?

Karl Heinz Buchegger schrieb:
> Meines Wissens nicht. Aber mit Hilfe der eeprom_read_block Funktion ist
> es trivial sich eine entsprechende Funktion zu schreiben.

Danke für die Antwort! "Trivial" liegt in dem Fall wahrscheinlich im 
Auge des Betrachters...

Dir schwebt wahrscheinlich so etwas vor:

eeprom_read_block ( Ziel, Quelle, Länge)

?!?
#3053202
Lesenswert?

hermy schrieb:
> Dir schwebt wahrscheinlich so etwas vor:
>
> eeprom_read_block ( Ziel, Quelle, Länge)
>
> ?!?

genau.
Was anderes machen die anderen Funktionen (bis auf die Byte Funktion) ja 
auch nicht. Das ist einfach nur eine Anpassung der Datentypen der 
Parameter um sie letzten Endes mit dem entsprechenden sizeof in die 
Read/Write Block Funktion zu stecken.
Nix aufregendes.
Gast #3053253
Lesenswert?

Habe es so ausprobiert:

uint64_t eezahl EEMEM = 123456; //zahl frei gewählt

schreiben: eeprom_read_block( &value, &eezahl, sizeof(uint64_t) );

lesen:     eeprom_read_block( &value, &eezahl, sizeof(uint64_t) );

Nach dem Lesen ist value = 0

(Verwirrung)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren