Esto no es realmente una pregunta de sistemas integrados o electrónicos.
Si usas C ++, puedes hacer múltiples funciones de escritura bajo un nombre, gracias a la sobrecarga:
#include <inttypes.h>
void store_data(void *addr, uint8_t data);
void store_data(void *addr, uint16_t data);
void store_data(void *addr, uint32_t data);
void store_data(void *addr, uint64_t data);
Cada sobrecarga sabe qué tan grandes son los datos del tipo de su argumento.
En C, podría tener una macro:
void store_data_sz(void *addr, size_t size, void *pdata);
/* data argument of macro must be an lvalue */
#define store_data(addr, data) store_data_sz(addr, sizeof (data), &(data))
También hay algo que decir para tener funciones separadas para tamaños comunes y luego una general para longitud variable:
void store_8(void *addr, int data);
void store_16(void *addr, int data);
void store_32(void *addr, unsigned long data);
void store_buf(void *addr, void *buf, size_t size);
Podemos tener una interfaz macro para esto, otra vez. Aquí tenemos algunas dependencias del sistema, como la suposición de que si algo es del tamaño 1, es una unidad de 8 bits, y así sucesivamente:
#define store_data(addr, data) do { \
switch (sizeof(data)) { \
case 1: store_8(addr, data); break; \
case 2: store_16(addr, data); break; \
case 4: store_32(addr, data); break; \
case 8: store_64(addr, data); break; \
default: store_buf(addr, &(data), sizeof (data)); \
} \
} while (0)
Dado que sizeof(data)
es una expresión constante (la excepción a esto son las matrices de longitud variable C99), sabemos en el momento de la compilación que solo uno de los casos de conmutación es alcanzable; Cualquier compilador decente tirará los casos imposibles. Verifique el código compilado y desmóntelo para estar seguro.