Forum: Mikrocontroller und Digitale Elektronik festes prozessorregister für Flags


von Ignaz (Gast)


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

von Sebastian Eckert (Gast)


Lesenswert?

Ja, eigentlich schon. Manche Compiler kennen ein Schlüsselwort dafür, 
glaube ich.

von Robert W. (rweber)


Lesenswert?

Hallo,

das Schlüsselwort heist register. Es ist allerdings nur ein vorschlag
an den Compiler die Variable in einem Register zu halten.

http://www.phim.unibe.ch/comp_doc/c_manual/C/CONCEPT/storage_class.html#register


Gruss,
rweber

von Marco S (Gast)


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

von A.K. (Gast)


Lesenswert?

Neuere AVRs (ab Tiny2313) besitzen eigens zu diesem Zweck 3 freie Bytes 
im bitadressierbaren I/O-Bereich: GPIOR0-2. Damit fährt man besser als 
mit Prozessorregistern.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.