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!