Hi, Ich habe ein Interrupt basiertes Programm und möchte nicht, dass mir ein Interrupt dazwischenfunkt, wenn eine Variable beschrieben wird. Was genau ist die minimale atomare Funktion, wo ein Interrupt nicht unterbrechen kann? Das schreiben einer Variable gehört wahrscheinlich dazu, oder?
Wenn du ganz sicher gehen willst, "klammerst" du deine Operation in einen atomaren Block:
1 | __disable_orq(); |
2 | //some code
|
3 | __enable_irq(); |
Bert S. schrieb: > Was genau ist die minimale atomare Funktion, wo ein Interrupt nicht > unterbrechen kann? Das ist im C-Standard leider nicht beschrieben und hängt von deinem Compiler ab. (Es gibt erst neuerdings Bestrebungen sowas in C und C++ einzubringen.)
Ich würd mal sagen dass du dich da auf Assembler-Ebene bewegst und empfehle dir mal nach dem passenden Instruction Set für deinen Cortex M zu suchen. Ansonsten gibt es aber auch noch die Möglichkeit, dazwischenfunkende Interrupts kurz zu deaktivieren, oder aber kritischen Code in einem hochpriorisierten Interrupt auszuführen sodass der niederpriore nicht dazwischenfunken kann (dann hast du jedoch, je nach Aufgabe, das Problem entweder gelöst oder einfach nur umgedreht)
MaWin schrieb: > (Es gibt erst neuerdings Bestrebungen sowas in C und C++ einzubringen.) Naja… in C ist es bereits seit 10 Jahren drin, in C++ auch schon seit ein paar Jahren. Das ist dann doch etwas mehr als "neuerdings Bestrebungen, sowas einzubringen". Bert S. schrieb: > Was genau ist die minimale atomare Funktion, wo ein Interrupt nicht > unterbrechen kann? Das schreiben einer Variable gehört wahrscheinlich > dazu, oder? Nicht unbedingt. Im Falle von gcc kannst du das hier dir mal anschauen: https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html In Standard C gibt es zu atomaren Operationen folgendes: https://en.cppreference.com/w/c/atomic In Standard C++ gibt es noch folgendes: https://en.cppreference.com/w/cpp/atomic/atomic Inwieweit das für STM32 verfügbar ist, weiß ich aber nicht.
:
Bearbeitet durch User
Nicht unterbrechbar sind: - Lesen eines 32-Bit-Werts (zumindest wenn aligned; wenn nicht bin ich mir nicht sicher) - Ebenso das Schreiben von 32 Bit - Lesen oder Setzen eines Bits über bit banding Gefährdet ist demnach bspw. in C: i++ (da Lesen von Speicher in Register, ändern, zurückschreiben). Die Operation wäre ok, wenn man i in ein Register zwingt (register uint32_t i __asm("r0");).
:
Bearbeitet durch User
Rolf M. schrieb: > Naja… in C ist es bereits seit 10 Jahren drin, in C++ auch schon seit > ein paar Jahren. Das ist dann doch etwas mehr als "neuerdings > Bestrebungen, sowas einzubringen". 10 Jahre sind "neuerdings", bei so etwas wie Programmiersprachen. Denn die Neuerungen müssen 1) in den Compilern ankommen, die von den Leuten genutzt werden und 2) die Neuerungen müssen von den Leuten genutzt und verstanden werden. Was idR erst nach Schritt 1 passiert. In einer Welt, wo regelmäßig 10/20 Jahre alte Compiler verwendet werden (ich sage nur: "der ist aber zertigiziert! Da können wir nicht von weg!") und alte Standards zum Einsatz kommen (C89, um die Kompatibilität mit allem möglichen Scheiß zu bewahren), dauert so etwas halt lange.
MaWin schrieb: > 10 Jahre sind "neuerdings", bei so etwas wie Programmiersprachen. > Denn die Neuerungen müssen 1) in den Compilern ankommen, Es gibt noch einen Zwischenschritt. Es nützt wenig wenn das Front-End des Compilers (Parser) die neuen Funktionen versteht, aber wenn im Backend (Codegenerator) dafür kein Code generiert wird oder die Bibliotheksfunktionen nicht oder als leere Funktionen implementiert sind. Leider ist das besonders bei retargetable Compilern immer mal wieder der Fall, wenn schnell eine Anpassung einer neuen Version an einen Mikrocontroller vorgenommen wird. > (ich sage nur: "der ist aber zertigiziert! Da können wir nicht von > weg!") Was eine gute Sache ist wenn du schon mal mit einer nicht implementierten Funktion auf die Nase gefallen bist.
MaWin schrieb: > Rolf M. schrieb: >> Naja… in C ist es bereits seit 10 Jahren drin, in C++ auch schon seit >> ein paar Jahren. Das ist dann doch etwas mehr als "neuerdings >> Bestrebungen, sowas einzubringen". > > 10 Jahre sind "neuerdings", bei so etwas wie Programmiersprachen. Aber es ist eben schon lange keine Bestrebung mehr, es einzubringen, sondern es ist drin. Dass es teils lange dauern kann, bis das auch in einer signifikanten Zahl der Compiler angekommen ist und in manchen nie ankommen wird (wie ist eigentlich inzwischen der Stand von C99 in Visual Studio?), ist schon klar. Dymo Fond schrieb: >> (ich sage nur: "der ist aber zertigiziert! Da können wir nicht von >> weg!") > > Was eine gute Sache ist wenn du schon mal mit einer nicht > implementierten Funktion auf die Nase gefallen bist. Ja. Schade nur, dass man sich im Gegenzug dann mit Compilern auf dem Niveau von "vor dem Krieg" rumschlagen muss.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.