MSP430 atomic functions

#7374004
Lesenswert?

Hi, Ich möchte eine Funktion atomic machen, indem ich global interrupts aus und einschalte. Also zB.:

1
void func()
2
{
3
  _DEINT();
4
  _NOP();
5

6
  // EXECUTE ATOMIC OPERATION
7

8
  _EINT();
9
}

Muss man hier noch was beachten? Wird ein Interrupt, der während der atomic operation auftreten sollte, ab _EINT() behandelt oder "verliert" man den gänzlich?

#7374242
Lesenswert?

Es empfiehlt sich oft, den vorherigen Zustand hinsichtlich Interrupts vorsichtshalber wiederherzustellen, statt hart einzuschalten. Irgendwer verwendet später die Funktion vielleicht in einem Kontext mit bereits deaktivierten Interrupts, und dann gibts ab und zu seltsame und höllisch schwer erfassbare Effekte.

#7374270
Lesenswert?

(prx) A. K. schrieb:

Es empfiehlt sich oft, den vorherigen Zustand hinsichtlich Interrupts vorsichtshalber wiederherzustellen, statt hart einzuschalten. Irgendwer verwendet später die Funktion vielleicht in einem Kontext mit bereits deaktivierten Interrupts, und dann gibts ab und zu seltsame und höllisch schwer erfassbare Effekte.

Danke! Was ist gemeint mit "Zustand hinsichtlich Interrupts widerherstellen"? Gibt es beim MSP430 dafür einen Befehl? Oder muss man einfach das Status-Register auf den Stack werfen und nachher wieder einlesen?

#7374284
Lesenswert?

Tom M. schrieb:

Danke! Was ist gemeint mit "Zustand hinsichtlich Interrupts widerherstellen"? Gibt es beim MSP430 dafür einen Befehl?

Nein. Der MSP430 selber hat dafür keinen "Befehl".

Oder muss man einfach das Status-Register auf den Stack werfen und nachher wieder einlesen?

Typisch wird man für sowas nicht den Stack gebrauchen, sondern ein MCU-Register. Schon das ist ja teuer genug, zumal es in einer "Hochsprache" ohne weitere Maßnahmen erstmal keine freien Register gibt. Der bestmögliche Workaround in einer "Hochsprache" ist es, die dafür vorgesehenen Funktionen (oder auch: Makros) zu benutzen. Das ist aber Target-spezifisch. Muß man einfach die Doku des Compilers für das Target lesen. Oft ist sowas als "atomic" deklariert. Also einfach mal die (richtige!) Doku danach durchsuchen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren