www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM7: Critical Section bzw. Mutex programmieren?


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich möchte Code absichern, so daß er nicht gleichzeitig vom 
Hauptprogramm und von Interrupt-Routinen betreten werden kann. Einfach 
Interrupts disablen und danach wieder einschalten wird nicht funzen, 
weil dir Funktionen selbst aus einer ISR aufgerufen werden könnten. 
Reicht es, wenn ich das CPSR zwischenspeichere und danach wieder 
restauriere?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interrupts abschalten. Ob alle, oder bloss den betreffenden, kannst du 
dir aussuchen.

Eine Mutex ist ein RTOS-Konstrukt und hindert Zugriff durch 
konkurrierende Prozesse indem ggf. der eine auf den anderen wartet. Bei 
Interrupts lässt sich das schlecht machen.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Interrupts abschalten. Ob alle, oder bloss den betreffenden, kannst du
> dir aussuchen.

Naja, aber was passiert wenn ich in einer ISR die Interrupts ab- und 
danach wieder einschalte. Das funktioniert doch nicht, oder. Beispiel:
// Diese Funktion darf nicht gleichzeitig betreten werden
void LockedFunction (void)
{
  __disable_interrupt();
  // ...
  // Weiterer Code
  // ...
  __enable_interrupt();
}

// Hauptprogramm
void main ()
{
  for (;;)
  {
    // ...
    LockedFunction();   // Wäre ja kein Problem
    // ...
  }
}

// Interrupt Routine
void ISR (void)
{
  // ...
  LockedFunction();   // Aber wie mache ich das?
  // ...
}

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, das funktioniert nicht. Drum sieht das auch eher so aus:
void LockedFunction (void)
{
  unsigned savedCPSR = __disable_interrupt();
  // ...
  // Weiterer Code
  // ...
  __restore_interrupt(savedCPSR);
}

Alternativ kann man nur der betreffende Interrupt abschalten. In der ISR 
ist es meist egal ob man den auch dort zeitweilig mal aus- und 
einschaltet. Hier am Beispiel LPC2000:
void LockedFunction (void)
{
  VICIntEnClr = 1<<UARTInterrupt;
  // ...
  // Weiterer Code
  // ...
  VICIntEnable = 1<<UARTInterrupt;
}
Wobei man dabei die Verzögerung der Interrupt-Pipeline und des 
Speicherbefehls beachten sollte, weshalb es nach VICIntEnClr einige 
wenige Takte dauern kann, bis das wirklich greift.

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.