Zeigergröße mit eeprom.h mit ATmega328p in AVR-GCC

Ich arbeite an einem Projekt, das große Datenblöcke basierend auf Benutzereingaben zufällig aus dem EEPROM liest und schreibt. Ich habe das EEPROM schon einmal verwendet, aber ich habe nie wirklich darüber nachgedacht. Bei den in der Standarddatei eeprom.h ( Dokumentation ) beschriebenen Operationen müssen Sie immer eine Typumwandlung zu einer bekannten Adresse hinzufügen. Zum Beispiel:

DATA_BYTE = eeprom_read_byte((uint8_t*)LOCATION);

Das ist sinnvoll, aber was ich nicht verstehe, ist die Verwendung für größere Daten wie die folgenden:

DATA_DWORD = eeprom_read_dword((uint32_t*)LOCATION);

Beschreibt die Typumwandlung (unit32_t) die Zeigergröße oder die Größe der Daten, auf die verwiesen wird? Ich weiß, dass der ATmega328p 1 kByte EEPROM hat, was bedeutet, dass ein 16-Bit-Zeiger erforderlich wäre, um die Adresse für ein einzelnes Datenbyte zu speichern. Ich vermute also, dass die Typumwandlung nichts mit der Zeigergröße zu tun hat, sondern mit der Größe der geschriebenen/gelesenen Daten ... Ich weiß, dass es funktioniert, ich würde es nur gerne besser verstehen.

Ich hoffe das ergibt Sinn. Vielen Dank im Voraus!

Wenn es auch nur annähernd möglich ist, überlassen Sie die Zeiger dorthin, wo sie hingehören, eine Aufgabe des Compilers. Überprüfen Sie auf avrund EEMEM. Sie erhalten Aussagen wieuint8_t EEMEM eepromstring[5]={"Test\0"};

Antworten (1)

In AVR sind Zeiger auf regulären Speicher (SRAM) 16-Bit. Aber EEPROM ist kein normaler Speicher. Die eeprom.h in AVR Libc nimmt Zeiger auf verschiedene Datentypen, je nachdem, was Sie tatsächlich in das EEPROM schreiben: Wenn Sie ein Byte lesen/schreiben, nimmt es einen Byte-Zeiger, wenn Sie ein Wort lesen/schreiben, nimmt es einen Wort-Zeiger, usw. Daher der Unterschied in den verschiedenen Funktionen, die Sie zitieren. Und Sie haben Recht: Die Zeiger selbst sind gleich groß, nur die Größe dessen, worauf sie "zeigen", ist unterschiedlich. Sie können dies selbst überprüfen, indem Sie überprüfen, was sizeof(foo)wann zurückgegeben foowird uint8_t*versus uint32_t*.

Tatsächlich sind die Argumente, die Sie an die EEPROM-Funktionen von AVR Libc übergeben, nicht wirklich Zeiger im eigentlichen Sinne des Wortes: Sie können nicht auf die Daten zugreifen, auf die sie „zeigen“, außer über die EEPROM-Funktionen. Es wäre vielleicht klarer gewesen, wenn die EEPROM-Funktionen der AVR Libc einen uint16_tTyp namens eeprom_indexanstelle eines Zeigertyps angenommen hätten, IMHO.

Das macht auf jeden Fall Sinn. Ich habe wirklich erst vor ein paar Monaten Hinweise herausgefunden, daher kommt wahrscheinlich meine Verwirrung. Ich habe auch über Ihre zweite Aussage nachgedacht - sie sind nicht wirklich echte Zeiger, da auf eine andere Art von Speicher zugegriffen wird, aber ich hatte noch nicht herausgefunden, wie ich danach fragen sollte. Du hast sie beantwortet, bevor ich eine Chance hatte.