Problem mit abfrage ob "I" in SREG gesetzt ist ...

Gast #180511
Lesenswert?
• ▲
▼
Mich würde mal interessieren, wozu man sowas braucht ?

Die einzige Anwendung, die ich mir vorstellen könnte, wäre das Kapseln
von nicht unterbrechbarem Code.

Aber dazu sichert man einfach das SREG komplett:

{
char savesreg = SREG;
cli();

// tue irgendwas

SREG = savesreg;
}


Peter
Gast #180512
Lesenswert?
• ▲
▼
Hallo Peter,

ich möchte das SREG_I Flag nutzen, um zu erkennen, das das Einlesen
eines Bitstroms ( geschieht per Interrupt ) abgeschlossen ist. Ich mach
das mit ner State-Machine und im letzten State wird am Ende das cli();
ausgeführt.

Das gelöschte SREG_I Flag ist soll quasi mein "Daten sind da - bitte
verarbeiten Flag" sein.

Grüße,

Stefan
Gast #180513
Lesenswert?
• ▲
▼
Du weißt aber schon, daß ein cli() innerhalb eines Interrupts
wirkungslos ist ?


Auch wenn es ein paar Bytes mehr kostet, würde ich ein Flag immer als
Variable anlegen, da es die saubere Lösung ist.

Man sieht oft, daß Programme so angefangen werden, als ob man
felsenfest davon überzeugt ist, nie eine Änderung oder Erweiterung
machen zu müssen.
Glaub mir, die Praxis sieht völlig anders aus, z.B. bleibt es bestimmt
nicht bei einem einzigen Interrupt.

Deshalb sollte man beim Vergewaltigen global wirkender Ressourcen sehr
vorsichtig sein, ob man die Seiteneffekte verkraftet oder später
überhaupt noch erinnert.


Peter
Gast #180514
Lesenswert?
• ▲
▼
Wenn es wirklich nur ein Bit sein soll (obwohl das vermutlich zwar RAM
spart, aber CPU-Zyklen kostet), dann empfiehlt sich ein globales bit
field:

volatile struct {
  uint8_t int1: 1;
  uint8_t int2: 1;
} intbits;

SIGNAL(SIG_ONE) {
  ...
  intbits.int1 = 1;
}

...
int
main(void)
{
  ...
  for (;;) {
    if (intbits.bit1) {
      intbits.bit1 = 0;
      ...
    }
  }
  return 0;
}
Gast #180515
Lesenswert?
• ▲
▼
Peter Dannegger Schrieb:

> Du weißt aber schon, daß ein cli() innerhalb eines Interrupts
> wirkungslos ist ?

Äh - nein - ?!

Schhhhh.... das hab ich dann wohl im Tutorial überlesen !?

@ Jörg:

Danke für den Code.  ... Schade das die AVRs keinen Bitaddressierbaren
bereich wie die 80C31 Familie haben ...

Ansonsten komme ich aber prima mit dem AVR's klar.

hab nur ca 4-6 Jahre nicht mehr aktiv Programmiert - das letzte war
Assembler auf der PIC Familie...

Grüße,

        Stefan
Gast #180517
Lesenswert?
• ▲
▼
So, nochmal nachgelesen, im Tutorial und in der Doku zur AVR-Lib hab ich
nichts "Ausdrückliches" dazu gefunden.

- aber -

Bei Verwendung von Signal(händler) {...} steht ja dabei, das die
Interrupts ( global ? ) disabled und hinterher wieder enabled werden
- im gegesatz zu Interrupt(händler) {...} ...

da wird dann das cbi(); gerade wieder von einem sbi(); überschrieben
...

da hab ich wohl nicht genug um die Ecke gedacht ... :-)

Grüße,

      Stefan

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.