STM32: LDREX/STREX vs Interruptsperre

Gast #4010927
Lesenswert?
• ▲
▼
Hallo zusammen,

ich habe auf meinem STM32 (Cortex-M3) einen externen Interrupt.
Wenn der Interrupt kommt, schalte ich ihn in der ISR aus und starte 
einen Timer. Wenn der Timer abgelaufen ist, wird in dessen ISR der 
externe Interrupt wieder freigegeben. Damit wird die maximale Frequenz 
des externen Interrupts begrenzt.

In der ISR des externen Interrupts zähle ich (u.a.) die Flanken. Diese 
will ich aus main() atomar auslesen und auf 0 setzen. Für den atomaren 
Zugriff müßte ich korrekterweise sowohl den externen Interrupt als auch 
den Timer-Interrupt abschalten und dabei berücksichtigen, ob der externe 
Interrupt gerade gesperrt oder erlaubt ist, ob der Timer gerade läuft 
usw.

Ich hab das der Einfachheit mit globaler Interruptsperre gemacht:
1
__disable_irq();
2
uint16_t temp_u16 = IsrFlankenzaehler_u16;
3
IsrSync.ctSeg_u16 = 0;
4
__enable_irq();  
5
return(temp_u16);

Nun hat aber der Cortex-M3 diesen schönen LDREX/STREX-Mechanismum, den 
ich aber noch nie benutzt hab. Ich stelle mir das so vor:
1
uint16_t temp_u16 = 0;
2
do {
3
    temp_u16 = __LDREXH(&IsrFlankenzaehler_u16);
4
} while (__STREXH(0, &IsrFlankenzaehler_u16) != 0);
5
return(temp_u16);

Würde das so funktionieren, oder hab ich etwas übersehen?

Und noch eine allgemeine Frage dazu:
Im Programming Manual steht:
1
The Cortex-M3 includes an exclusive access monitor, that tags the fact that the processor has executed a Load-Exclusive instruction.
2
The processor removes its exclusive access tag if:
3
• It executes a CLREX instruction
4
• It executes a Store-Exclusive instruction, regardless of whether the write succeeds.
5
• An exception occurs. This means the processor can resolve semaphore conflicts between different threads.
Sehe ich das so richtig:
Wenn ich also LDREX ausführe, wird der execlusive access monitor 
gesetzt. wenn nun ein Interrupt (Exception) kommt, wird er wieder 
gelöscht und STREX schlägt fehl?

Danke!
#4018413
Lesenswert?
• ▲
▼
Einfache Lese- und Schreibzugriffe von Integers mit 1/2/4 Bytes Grösse 
sind beim CM3 von Haus aus atomar, finden also ununterbrechbar statt. 
Solche Klimmzüge sind folglich nicht nötig. Nur "volatile" ist hier 
nötig.

Diese LDREX/STREX Befehle können dann relevant werden, wenn du im 
Hauptprogramm nicht nur lesen, sondern auch verändern willst.
#4018896
Lesenswert?
• ▲
▼
A. K. schrieb:
> Einfache Lese- und Schreibzugriffe von Integers mit 1/2/4 Bytes Grösse
> sind beim CM3 von Haus aus atomar, finden also ununterbrechbar statt.
> Solche Klimmzüge sind folglich nicht nötig. Nur "volatile" ist hier
> nötig.

Dann hast Du nicht richtig gelesen:

Der OP will atomar lesen und schreiben, beides zusammen geht bei 
Cortex M3 nicht ohne LDREX + STREX oder Interrupt Sperre. Der Code vom 
OP oben sollte tun.

Antwort schreiben

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.

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.