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 vom Autor gelöscht.
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.
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.
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.
A. K. schrieb: > Beim Cortex M0 ist Bitbanding optional Bitbanding ist nicht dasselbe wie Bit-adressierbarer Speicher oder SET / CLEAR / COMPLEMENT Register.
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"?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.