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


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.

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.