LinuxCNC Documentation

SYNTAX

#include <rtapi_atomic.h>
enum memory_order { ... };
#define atomic_store(obj, desired)...
#define atomic_store_explicit(obj, desired, order)...
#define atomic_load(obj)...
#define atomic_load_explicit(obj, order)...

ARGUMENTE

volatile A* obj

Ein Zeiger auf ein flüchtiges Objekt, welches das Ziel des Speichervorgangs oder die Quelle des Ladevorgangs ist. Der Zeiger muss einen geeigneten Typ und eine geeignete Ausrichtung haben, so dass der zugrundeliegende Speicher- oder Ladevorgang selbst atomar ist; zumindest kann ein korrekt ausgerichteter "int" als ein solcher Typ angenommen werden. Ungeeignete Größe oder Ausrichtung sind nicht diagnostizierte Fehler.

C desired

Der Wert, der in dem Objekt gespeichert werden soll: "*obj = desired" muss wohlgeformt sein.

memory_order order

Die erforderliche Speicherordnungssemantik.

BESCHREIBUNG

Dieser Header bietet zumindest die oben genannte Teilmenge von C11’s <+stdatomic.hE>+. Wenn es eine Ordnungsanforderung für mehrere Werte gibt, die von anderen Ausführungssträngen in gemeinsam genutzte RTAPI-Speicherbereiche gelesen oder geschrieben werden, einschließlich der Werte von HAL-Pins und -Parametern, sind diese Funktionen (oder funktionsähnliche Makros) die einzige Möglichkeit, um sicherzustellen, dass die Ordnungsanforderung befolgt wird. Andernfalls können Lade- und Speicheroperationen nach architekturspezifischen Regeln von ihrer normalen Quellcode-Reihenfolge abweichen.

Um beispielsweise eine Nachricht von einem Thread in einem gemeinsamen Speicherbereich zu belassen und sie von einem anderen Thread abzurufen, muss der Schreiber die Variable "Nachricht ist vollständig" atomar speichern und der Leser muss diese Variable atomar laden:

// producer
*message = 42;
atomic_store_explicit(message_ready, 1, memory_order_release);

// consumer
while(atomic_load_explicit(message_ready, memory_order_acquire) == 0) sched_yield();
printf("message was %d\n", *message); // must print 42

REALTIME CONSIDERATIONS

Kann aus jedem Code aufgerufen werden.

RETURN VALUE

atomic_load and atomic_load_explicit return the value pointed to by the obj argument.

atomic_store and atomic_store_explicit have no return value.

SIEHE AUCH

<stdatomic.h> (C11), <rtapi_bitops.h> (für andere von rtapi unterstützte atomare Speicheroperationen)