Forum: Compiler & IDEs STM32: LDREX/STREX vs Interruptsperre


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Bronco (Gast)


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!

von Bronco (Gast)


Lesenswert?

Keiner?

von (prx) A. K. (prx)


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.

: Bearbeitet durch User
von Jim M. (turboj)


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

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]
  • [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.