Forum: Mikrocontroller und Digitale Elektronik LPC/ARM-Cortex-M0, atomarer Zugriff


von Note (Gast)


Lesenswert?

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

von mukel (Gast)


Lesenswert?


Beitrag #5830634 wurde vom Autor gelöscht.
von Lothar (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Stefanus F. schrieb:
> 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).

Beim Cortex M0 ist Bitbanding optional, da muss man also genauer 
hinsehen.

von Lothar (Gast)


Lesenswert?

A. K. schrieb:
> Beim Cortex M0 ist Bitbanding optional

Bitbanding ist nicht dasselbe wie Bit-adressierbarer Speicher oder SET / 
CLEAR / COMPLEMENT Register.

von Note (Gast)


Lesenswert?

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"?

von (prx) A. K. (prx)


Lesenswert?

Note schrieb:
> Aber vielleicht könnte man zumindest aus meinem aktuellen
> ein Makro machen?

Aber vielleicht könnte man zumindest den oben verlinkten Thread lesen.

von Stefan F. (Gast)


Lesenswert?

Note schrieb:
> TIME_T tm = *sysTime;

Wenn time_t und systime maximal 32bit sind, kannst du Dir den Aufwand 
sparen. Der ist nur bei 64bit nötig.

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.