Estoy usando un Atmega32 para leer varios sensores usando su ADC.
Usando lógica digital y algunos multiplexores, multiplexé la totalidad de PORTA, usando PA0: 6 para la dirección y PA7 como entrada. Por lo tanto, puedo tener un máximo de 128 entradas desde un solo PUERTO.
Ahora, dado que el usuario operará el sistema a través de una computadora (utilizando RS232), será posible agregar o eliminar sensores, por lo que el sistema debe mantener un registro de qué direcciones son libres de agregar sensores y cuáles direcciones leer de.
Estaba pensando en usar una matriz booleana de 128 bits como indicadores para indicar si hay un sensor en una dirección determinada.
Si bien C no tiene soporte nativo para variables de un solo bit, es posible usar campos de bits para agrupar hasta 8 "variables bool" en un solo carácter sin signo.
Entonces, he creado la siguiente estructura:
typedef struct bool_s{
uint8_t bit1:1;
}bool_t;
Luego, creé una matriz de tipo bool_t con un tamaño de 128, con la esperanza de que todo estuviera bien empaquetado, pero sizeof()
me dice que el tamaño de la matriz es de 128 bytes en lugar de los 16 bytes que esperaba.
Técnicamente, podría crear una estructura única con 128 variables de 1 bit:
typedef struct Flag_s{
uint8_t F1:1;
uint8_t F2:1;
uint8_t F3:1;
[...]
uint8_t F128:1;
}Flag_t;
El problema con este enfoque es que si bien reduce el uso de la memoria, no es muy práctico de usar y ocupa demasiado espacio en el código.
¿Hay alguna manera fácil de crear una gran cantidad de banderas o estoy pidiendo demasiado? Quiero decir, no es como si guardar 112 bytes suponga una gran diferencia cuando tengas 2K disponibles, pero ¿y si necesitara más banderas?