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
Ja, eigentlich schon. Manche Compiler kennen ein Schlüsselwort dafür, glaube ich.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.