ARM7: Critical Section bzw. Mutex programmieren?

Gast #786186
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?
Gast #786226
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:
1
// Diese Funktion darf nicht gleichzeitig betreten werden
2
void LockedFunction (void)
3
{
4
  __disable_interrupt();
5
  // ...
6
  // Weiterer Code
7
  // ...
8
  __enable_interrupt();
9
}
10

11
// Hauptprogramm
12
void main ()
13
{
14
  for (;;)
15
  {
16
    // ...
17
    LockedFunction();   // Wäre ja kein Problem
18
    // ...
19
  }
20
}
21

22
// Interrupt Routine
23
void ISR (void)
24
{
25
  // ...
26
  LockedFunction();   // Aber wie mache ich das?
27
  // ...
28
}
#786264
Lesenswert?
• ▲
▼
Nö, das funktioniert nicht. Drum sieht das auch eher so aus:
1
void LockedFunction (void)
2
{
3
  unsigned savedCPSR = __disable_interrupt();
4
  // ...
5
  // Weiterer Code
6
  // ...
7
  __restore_interrupt(savedCPSR);
8
}

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:
1
void LockedFunction (void)
2
{
3
  VICIntEnClr = 1<<UARTInterrupt;
4
  // ...
5
  // Weiterer Code
6
  // ...
7
  VICIntEnable = 1<<UARTInterrupt;
8
}
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.