Forum: Mikrocontroller und Digitale Elektronik MSP430 atomic functions


von Tom M. (tomf9)


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?

von Max G. (l0wside) Benutzerseite


Lesenswert?

Nach meinen Verständnis bleibt der erhalten. Der Auslöser des Interrupts 
setzt ein Flag, und der Interrupthandler arbeitet die dann ab, wenn er 
darf.
Nur eine mehrfache Interruptauslösung würdest du verpassen.

von (prx) A. K. (prx)


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.

: Bearbeitet durch User
von Tom M. (tomf9)


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?

von (prx) A. K. (prx)


Lesenswert?

Ich stecke in den MSP430 nicht so tief drin.

von C-hater (c-hater)


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.

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.