Forum: Mikrocontroller und Digitale Elektronik MSP430: Atomic für TI Compiler?


von Qdrat (Gast)


Lesenswert?

Wo kann ich herausfinden ob es für den TI Compiler eine ATOMIC Anweisung 
gibt? D.h. Interrupts sichern und deaktivieren..

von Christian R. (supachris)


Lesenswert?

Kannst du in der Anleitung des Compilers herausfinden.

von Qdrat (Gast)


Lesenswert?

Die ist hier zu finden: http://www.ti.com/lit/pdf/slau132 (leitet auf 
die aktuelle rev. E um). Aber wo muss ich suchen? Ist das nicht ein 
Makro-Block?
Oder reicht ab- und wieder anschalten der Interrupts aus?

von Christian R. (supachris)


Lesenswert?

Naja, beim Abschalten müsstest du dir den aktuellen Status des GIE Bits 
merken, denn wenn es aus war, musst/solltest du es nachher nicht wieder 
aktivieren. Beim GCC gibts für Funktionen das "critical" Attribut, was 
genau das macht. Eventuell gibts das beim CCE auch.

von Tim (Gast)


Lesenswert?

Christian R. schrieb:
> denn wenn es aus war, musst/solltest du es nachher nicht wieder
> aktivieren.

Warum sollte man GIE nicht beliebig deaktivieren und aktivieren?

von Christian R. (supachris)


Lesenswert?

Vielleicht war ja der GIE vor dem zu schützdenden Befehl oder Block 
nicht umsonst deaktiviert? Aber das weiß nur der Programmierer selber.

von Erik (Gast)


Lesenswert?

lösen EINT (enable Interrupt )und DINT (disable Interrupt)
das Problem ?
sehr komplex das Thema muss ich auch immer ins Buch gucken .
mfg Erik

von Christian R. (supachris)


Lesenswert?

Das ist eben nicht alles. Wie geschrieben, es kann sein, dass aus gutem 
Grund vorher die Interrupts aus waren. Dann wäre esfatal, wenn man sie 
einfach so aktiviert....

von Hans (Gast)


Lesenswert?

Geht's so?
1
unsigned short SR_save;
2
3
void cli( void )
4
{
5
  SR_save = _get_interrupt_state();
6
  _disable_interrupt();
7
}
8
9
void sei( void )
10
{
11
  _set_interrupt_state( SR_save );
12
  _enable_interrupt();
13
  __no_operation();
14
}

Siehe slau132 6.7.1   MSP430 Intrinsics

von Hans (Gast)


Lesenswert?

Wohl eher so:
1
unsigned short SR_save;
2
3
void cli( void )
4
{
5
  SR_save = _get_interrupt_state();
6
  _disable_interrupt();
7
}
8
9
void sei( void )
10
{
11
  _set_interrupt_state( SR_save );
12
//  _enable_interrupt();
13
  __no_operation();
14
}

von Hans (Gast)


Lesenswert?

Ach, dann kann das NOP auch wegbleiben..

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.