Tamaño del puntero usando eeprom.h con ATmega328p en AVR-GCC

Estoy trabajando en un proyecto que lee y escribe aleatoriamente grandes bloques de datos de EEPROM, según la entrada del usuario. He usado la EEPROM antes, pero realmente nunca pensé en esto. En las operaciones descritas en el archivo estándar eeprom.h ( documentación ), siempre debe agregar un encasillado a una ubicación de dirección conocida. Por ejemplo:

DATA_BYTE = eeprom_read_byte((uint8_t*)LOCATION);

Esto tiene sentido, pero lo que no entiendo es su uso para datos más grandes, como los siguientes:

DATA_DWORD = eeprom_read_dword((uint32_t*)LOCATION);

¿El typecast (unit32_t) describe el tamaño del puntero o el tamaño de los datos a los que se apunta? Sé que el ATmega328p tiene 1kBytes de EEPROM, lo que significa que se necesitaría un puntero de 16 bits para mantener la dirección en un solo byte de datos. Así que supongo que esto significa que el encasillado no tiene nada que ver con el tamaño del puntero, sino con el tamaño de los datos que se escriben/leen... Sé que funciona, solo me gustaría entenderlo mejor.

Espero que tenga sentido. ¡Gracias de antemano!

Si es remotamente posible, deje los punteros donde pertenecen, una tarea del compilador. Verifique en avry EEMEM. Recibe declaraciones comouint8_t EEMEM eepromstring[5]={"Test\0"};

Respuestas (1)

En AVR, los punteros a la memoria normal (SRAM) son de 16 bits. Pero la EEPROM no es una memoria normal. El eeprom.h en AVR Libc toma punteros a diferentes tipos de datos, dependiendo de lo que realmente escriba en EEPROM: cuando lee/escribe un byte, toma un puntero de byte, cuando lee/escribe una palabra toma un puntero de palabra, etc. De ahí la diferencia en las diferentes funciones que cita. Y tiene razón: los punteros en sí son del mismo tamaño, solo que el tamaño de lo que "apuntan" es diferente. Puede verificar esto por sí mismo comprobando qué sizeof(foo)devuelve cuando fooes uint8_t*versus uint32_t*.

Pero, de hecho, los argumentos que pasa a las funciones eeprom de AVR Libc no son realmente punteros en el sentido habitual de la palabra: no puede acceder a los datos que "apuntan" excepto a través de las funciones EEPROM. Podría haber sido más claro si las funciones AVR Libc EEPROM tomaran un uint16_ttipo llamado eeprom_indexen lugar de un tipo de puntero, en mi humilde opinión.

Eso definitivamente tiene sentido. Realmente solo descubrí los consejos hace un par de meses, así que probablemente de ahí viene mi confusión. También estaba pensando en su segunda declaración: en realidad no son indicadores verdaderos ya que se accede a un tipo diferente de memoria, pero aún no había descubierto cómo preguntar sobre eso. Lo respondiste antes de que tuviera la oportunidad.