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

1

Estoy trabajando en un proyecto que lee y escribe de forma aleatoria grandes bloques de datos desde la EEPROM, en base a las aportaciones de los usuarios. He usado la EEPROM antes, pero realmente nunca pensé en esto. En las operaciones descritas en el archivo eeprom.h estándar ( documentación ), siempre tiene para 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 la transmisión de tipo no tiene nada que ver con el tamaño del puntero, pero el tamaño de los datos que se escriben / leen ... Sé que funciona, me gustaría entenderlo mejor.

Espero que tenga sentido. Gracias de antemano!

    
pregunta Kurt E. Clothier

1 respuesta

3

En AVR, los punteros a la memoria normal (SRAM) son de 16 bits. Pero la memoria EEPROM no es regular. eeprom.h en AVR Libc lleva los punteros a diferentes tipos de datos, dependiendo de lo que en realidad 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 tienes razón: los punteros en sí son del mismo tamaño, solo el tamaño de lo que "señalan" es diferente. Puedes verificar esto por ti mismo comprobando qué sizeof(foo) devuelve cuando foo es uint8_t* contra uint32_t* .

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

    
respondido por el angelatlarge

Lea otras preguntas en las etiquetas