Forum: Mikrocontroller und Digitale Elektronik sinn dieser operation


von daniel (Gast)


Lesenswert?

http://www.drtak.org/teaches/ARC/cisp299_bot/book/book/node46.html

unten ist im code ...
[ccode]
volatile unsigned long get_tick_counter(void)
{
  unsigned char oldSREG = SREG;
  unsigned long tmp;

  _CLI(); // disable interrupt
  tmp = tick_counter;
  if (SREG & (1 << SREG_I)) _SEI();
  return tmp;
}
[/ccode]

ich hätte anstatt
if (SREG & (1 << SREG_I)) _SEI();
einfach sei(); aufgerufen.
ausserdem wie sollte SREG_I gesetzt(1) sein,
wenn cli es gelöscht hat?

grüsse, daniel

von Verwirrter (Gast)


Lesenswert?

Der Programmierer wollte wahrscheinlich schreiben:

volatile unsigned long get_tick_counter(void)
{
  unsigned char oldSREG = SREG;
  unsigned long tmp;

  _CLI(); // disable interrupt
  tmp = tick_counter;
  if (oldSREG & (1 << SREG_I)) _SEI();
  return tmp;
}

Also nur dann den Interrupt wieder einschalten, wenn er vor dem Aufruf 
der Funktion auch ein war. Ansosnten würde auch die Variable oldSREG 
keinen Sinn machen.

von Kai G. (runtimeterror)


Lesenswert?

>ich hätte anstatt
>if (SREG & (1 << SREG_I)) _SEI();
>einfach sei(); aufgerufen.

Hmm...
if (I-Bit gesetzt) Setze I-Bit;

eigentlich macht die Zeile gar nichts, oder?

Ich kenne jetzt die CPU deren Eigenarten nicht. Wenn's ein 8 Bit AVR 
ist, dann ist das in meinen Augen Unsinn.

Auffällig ist auch
>  unsigned char oldSREG = SREG;
... danach wird der Wert aber nicht zur Wiederherstellung der 
Segmentregister verwendet - halte ich für nicht beabsichtigt.

von Kai G. (runtimeterror)


Lesenswert?

>Also nur dann den Interrupt wieder einschalten, wenn er vor dem Aufruf
>der Funktion auch ein war. Ansosnten würde auch die Variable oldSREG
>keinen Sinn machen.

Denke ich auch. Aber auch das wäre irgendwie bescheuert gelöst.
Was spricht gegen ein
SREG = oldSREG;
? Komisches Buch :)

von Verwirrter (Gast)


Lesenswert?

Ne, das würde schon Sinn machen, der Funktion ist's quasi egal ob VOR 
Aufruf der Funktion der Interrupt enabled war oder nicht, das kann in 
verzwickten Situationen schon mal vorkommen. Quasi ein push/pop des 
Intstatus. Allerdings halte ich es im Rahmen des Beispiels trotzdem für 
reinen Angebercode :-)

von daniel (Gast)


Lesenswert?

irgendwie hab ich die Zeile
unsigned char oldSREG = SREG;
total übersehen.
So macht es schon mehr Sinn
if (oldSREG & (1 << SREG_I)) _SEI();

werde mal dem Autor eine Mail schreiben.

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.