Ich speichere üblicherweise Statusflags auf dem AVR platzsparend in einer Variable vom Typ uint8, so dass jedes Flag ein Bit belegt, bekomme also 8 Booleans in ein Byte. Das sieht dann etwa so aus:
Code: Alles auswählen
const
E_rtc = 1 shl 0; // Flag Fehler RTC
E_twi = 1 shl 1; // Flag Fehler TWI
E_eeprom = 1 shl 2; // Flag Fehler EEPROM
E_sens = 1 shl 7; // Flag Fehler Sensor
var
error : uint8;
error := error or E_sens; // Fehler Sensor setzen
error := error and not E_sens; // Fehler Sensor löschen
if (error and E_rtc) = 0 then... // kein Fehler RTC
if (error and E_rtc) <> 0 then... // Fehler RTC
error := 0; // Fehler löschen
Alternativ kann man auch statt der Bitmaske die Bitstelle nehmen, man darf es halt nicht mischen:
Code: Alles auswählen
const
e_rtc = 0; // Flag Fehler RTC
e_twi = 1; // Flag Fehler TWI
e_eeprom = 2; // Flag Fehler EEPROM
e_sens = 7; // Flag Fehler Sensor
var
error : uint8;
error := error or (1 << e_sens); // Fehler Sensor setzen
error := error and not (1 << e_sens); // Fehler Sensor löschen
if (error and (1 << e_rtc)) = 0 then... // kein Fehler RTC
if (error and (1 << e_rtc)) <> 0 then... // Fehler RTC
error := 0; // Fehler löschen
Ist recht viel Schreibkram, da habe ich mir gedacht, es wäre doch schön, wenn es sowas gäbe:
Code: Alles auswählen
errtype = record
rtc : boolean; // Flag Fehler RTC
twi : boolean; // Flag Fehler TWI
eeprom : boolean; // Flag Fehler EEPROM
sens : boolean; // Flag Fehler Sensor
var
error : errtype;
Wobei jedes Element in error nur ein Bit belegt.
Dann könnte man das so ansprechen:
Code: Alles auswählen
error.sens := true; // Fehler Sensor setzen
error.sens := false; // Fehler Sensor löschen
if not error.rtc then... // kein Fehler RTC
if error.rtc then... // Fehler RTC
error := 0; // alle Fehler löschen => naja, das wäre ein Bonus
Ich weiss, dass es solche gepackten Booleans unter Ada gibt, geht das in Pascal vielleicht auch? Und wird das für die Embedded AVR umgesetzt?