LPC/ARM-Cortex-M0, atomarer Zugriff

Gast #5830609
Hallo liebe Gemeinde,

ich setze mich derzeit mit einer LPC-MCU auseinander, drin ist ein ARM 
Cortex M0.
Beim AVR hatte man über #include <util/atomic.h> eine schöne Möglichkeit 
eines atomic-Blocks. Ich wurde für den M0 leider nicht fündig, wie man 
einen atomaren Datenzugriff durchführt (außer eben manuell Interrupts 
AN/AUS machen). Gefunden habe ich in den libs von MCUXpresso einen 
stdatomic.h - leider kann ich nicht viel mit anfangen.

Könnte mir jemand zumindest einen Wink geben, in welche Richtung ich 
dabei schauen muss? Es geht darum einen volatile struct in einem 
Atomic-Block zu kopieren.

Grüße,
Note
Beitrag #5830634 wurde von einem Moderator gelöscht.
Gast
Welcher LPC/ARM-Cortex-M0? Die LPC 8xx z.B. haben Bit-adressierbaren 
Speicher und man kann einen Pin atomar schalten:

#define P0 0xA0000000 // Port 0 Adresse

...

__IO_REG8(P0_0, P0    , __READ_WRITE);
__IO_REG8(P0_1, P0 + 1, __READ_WRITE);

...

#define LED P0_0

LED ^= 1;

Funktioniert also genau wie beim 8051 es braucht hier keine AVR Tricks.
Gast
Soweit ich weiß kann man bei allen STM32 einzelne Pins atomar umschalten 
(mit Sicherheit weiß ich das für die F1, F3 und L0 Serie).

Was den atomaren Speicherzugriff angeht, das kannst du durch Sperren von 
Interrupts erreichen:
1
uint32_t backup = __get_PRIMASK();
2
__set_PRIMASK(1);
3
... do some work ...
4
__set_PRIMASK(backup);

Das mach ich so auf STM32, aber ich glaube das geht bei allen ARM 
Controllern so. Die PRIMASK sperrt alle Interrupts außer NMI und 
Hardfault.
Gast
Gut, ich habe gehofft, man kann das einfach nur ästethisch schöner 
gestalten - wie das eben der Fall mit dem ATOMIC_BLOCK beim AVR gewesen 
ist.

Aber vielleicht könnte man zumindest aus meinem aktuellen
1
__disable_irq();
2
TIME_T tm = *sysTime;
3
__enable_irq();

ein Makro machen? Dass man eben diese Interrupts-AN/AUS "in schöner 
schreibt"?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.