festes prozessorregister für Flags

Gast #549225
Lesenswert?

Hallo zusammen,

mal ne frage:
Ich schreibe an einem Programm, das überwiegend von Hard- und 
Softwareinterupts gesteuert wird. Das Program greift sehr oft auf 
verscchieden Flags zu, die ich so deklariert habe:

volatile struct Flags
  {
    uint8_t  Timer0Int   :1;
    uint8_t RXInt     :1;
    uint8_t KeyPressedInt   :1;
    uint8_t DataInInt  :1;
    uint8_t LCDchangedInt  :1;
    uint8_t MenuChangedInt  :1;
  }
  IntFlags;

Also eigentlich nur ein byte groß.

Kann ich dieses byte auch als Prozessorregister deklarieren? Dann müsste 
es nicht immer aus dem Speicher geholt werden...

Danke und Grüße
Ignaz
Gast #549321
Lesenswert?

Hallo.

Ich benutze eine Lösung, welche ich hier im Forum gefunden habe (dabei 
danke an die Konstrukteure). Man schreibe:

struct bits {
uint8_t b0:1;
uint8_t b1:1;
uint8_t b2:1;
uint8_t b3:1;
uint8_t b4:1;
uint8_t b5:1;
uint8_t b6:1;
uint8_t b7:1;
} _attribute_ ((_packed_));
#define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)

und kann dann mittels

#define TRIGGERFLAG   SBIT(TWDR, 2)
TRIGGERFLAG = 1;
if (TRIGGERFLAG == 1)

das Bit benutzen. Dabei lege ich das Bit bevorzugt in unbenutze 
R/W-Peripheriregister, welche noch mit einem Befehl zu erreichen sind. 
So kann der Compiler machen, was er will (falls er überhaupt R2ff 
benutzt).

Gruß
Marco

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren