Ich verwende einen Atmega32 , um verschiedene Sensoren mit seinem ADC zu lesen.
Mit digitaler Logik und einigen Multiplexern habe ich die gesamte PORTA gemultiplext, wobei PA0: 6 als Adresse und PA7 als Eingang verwendet wurden. Daher kann ich maximal 128 Eingänge von nur einem PORT haben.
Da der Benutzer das System nun über einen Computer (mit RS232) bedient, können Sensoren hinzugefügt oder entfernt werden. Das System muss daher nachverfolgen, welche Adressen zum Hinzufügen von Sensoren frei sind und von welchen Adressen gelesen werden kann.
Ich dachte daran, ein boolesches 128-Bit-Array als Flags zu verwenden, um anzuzeigen, ob sich an einer bestimmten Adresse ein Sensor befindet.
Während C keine native Unterstützung für Einzelbitvariablen bietet, ist es möglich, Bitfelder zu verwenden, um bis zu 8 "Bool-Variablen" in ein einzelnes vorzeichenloses Zeichen zu packen.
Also habe ich die folgende Struktur erstellt:
typedef struct bool_s{
uint8_t bit1:1;
}bool_t;
Dann habe ich ein Array vom Typ bool_t mit einer Größe von 128 erstellt, in der Hoffnung, dass alles gut zusammen gepackt wird, aber sizeof()
mir wird gesagt, dass die Arraygröße 128 Bytes anstelle der 16 Bytes beträgt, die ich erwartet hatte.
Technisch könnte ich eine einzelne Struktur mit 128 1-Bit-Variablen erstellen:
typedef struct Flag_s{
uint8_t F1:1;
uint8_t F2:1;
uint8_t F3:1;
[...]
uint8_t F128:1;
}Flag_t;
Das Problem bei diesem Ansatz ist, dass er zwar die Speichernutzung reduziert, aber nicht sehr praktisch ist und viel zu viel Platz im Code einnimmt.
Gibt es eine einfache Möglichkeit, eine große Anzahl von Flaggen zu erstellen, oder verlange ich zu viel? Ich meine, es ist nicht so, als würde das Speichern von 112 Bytes einen großen Unterschied machen, wenn 2 KB verfügbar sind, aber was ist, wenn ich noch mehr Flags benötige?