Taille du pointeur à l’aide de eeprom.h avec ATmega328p dans AVR-GCC

Kurt E. Clothier

Taille du pointeur à l’aide de eeprom.h avec ATmega328p dans AVR-GCC


Je travaille sur un projet qui lit et écrit au hasard de gros blocs de données à partir de l’EEPROM, en fonction de l’entrée de l’utilisateur. J’ai déjà utilisé l’EEPROM, mais je n’y ai jamais vraiment pensé. Dans les opérations décrites dans le fichier eeprom.h standard ( documentation ), vous devez toujours ajouter un transtypage à un emplacement d’adresse connu. Par exemple:

DATA_BYTE = eeprom_read_byte((uint8_t*)LOCATION);

Cela a du sens, mais ce que je ne comprends pas, c’est son utilisation pour des données plus importantes, telles que les suivantes:

DATA_DWORD = eeprom_read_dword((uint32_t*)LOCATION);

Le transtypage (unit32_t) décrit-il la taille du pointeur ou la taille des données pointées? Je sais que l’ATmega328p a 1 Ko d’EEPROM, ce qui signifie qu’il faudrait un pointeur de 16 bits pour conserver l’adresse sur un seul octet de données. Je suppose donc que cela signifie que le transtypage n’a rien à voir avec la taille du pointeur, mais la taille des données en cours d’écriture / de lecture … Je sais que cela fonctionne, je voudrais juste mieux le comprendre.

J’espère que cela à du sens. Merci d’avance!

jippie

Si même à distance possible, laissez les pointeurs à leur place, une tâche du compilateur. Vérifiez sur avret EEMEM. Vous obtenez des déclarations commeuint8_t EEMEM eepromstring[5]={"Test"};

Réponses


 angelatlarge

Dans AVR, les pointeurs vers la mémoire régulière (SRAM) sont 16 bits. Mais l’EEPROM n’est pas une mémoire régulière. Le fichier eeprom.h dans AVR Libc prend des pointeurs vers différents types de données, selon ce que vous écrivez réellement dans l’EEPROM: lorsque vous lisez / écrivez un octet, il prend un pointeur d’octet, lorsque vous lisez / écrivez un mot, il prend un pointeur de mot, etc. D’où la différence dans les différentes fonctions que vous citez. Et vous avez raison: les pointeurs eux-mêmes ont la même taille, juste la taille de ce qu’ils « pointent » est différente. Vous pouvez le vérifier par vous-même en vérifiant ce qui sizeof(foo)retourne quand fooest uint8_t*contre uint32_t*.

Mais, en fait, les arguments que vous passez aux fonctions eRepr AVC Libc ne sont pas vraiment des pointeurs au sens ordinaire du terme: vous ne pouvez pas accéder aux données vers lesquelles ils « pointent » sauf via les fonctions EEPROM. Il aurait pu être plus clair si les fonctions AVR Libc EEPROM prenaient un uint16_ttype appelé eeprom_indexau lieu d’un type de pointeur, à mon humble avis .

Kurt E. Clothier

Cela a vraiment du sens. Je n’ai vraiment compris que des pointeurs il y a quelques mois, c’est probablement de là que vient ma confusion. Je pensais également à votre deuxième déclaration – elles n’étaient pas vraiment de véritables pointeurs car c’est un type de mémoire différent, mais je n’avais pas encore compris comment poser des questions à ce sujet. Vous y avez répondu avant d’en avoir l’occasion.

 

#à, #de, ATmega328p, avec, AVR-GCC, dans, du, eeprom.h, l’aide, pointeur, taille

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *