mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik sinn dieser operation


Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.drtak.org/teaches/ARC/cisp299_bot/book/...

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

Autor: Verwirrter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Verwirrter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.