Login| Sign Up| Help| Contact|

Patent Searching and Data


Title:
METHOD AND DEVICE FOR PROCESSING DATA
Document Type and Number:
WIPO Patent Application WO/2021/053103
Kind Code:
A1
Abstract:
The invention relates to a method for processing data, comprising the following steps: providing a data structure having a first memory structure for at least temporarily storing first data and a second memory structure for at least temporarily storing second data, providing a first program function which is designed to receive specification data and to store in the data structure, wherein the first program function is further designed to store specification data, which have been transferred in a temporally successive manner to the first program function, alternatively in the first memory structure and in the second memory structure.

Inventors:
MOCKEN THOMAS (DE)
Application Number:
PCT/EP2020/076031
Publication Date:
March 25, 2021
Filing Date:
September 17, 2020
Export Citation:
Click for automatic bibliography generation   Help
Assignee:
BOSCH GMBH ROBERT (DE)
International Classes:
G06F9/52; G06F9/54
Domestic Patent References:
WO2019094072A12019-05-16
WO2018094509A12018-05-31
Foreign References:
US8533388B22013-09-10
Download PDF:
Claims:
Ansprüche

1. Verfahren zum Verarbeiten von Daten, aufweisend die folgenden Schritte: Bereitstellen (200) einer Datenstruktur (DS) mit einer ersten Speicherstruktur (SS1) zur zumindest zeitweisen Speicherung von ersten Daten und einer zweiten Speicherstruktur (SS2) zur zumindest zeitweisen Speicherung von zweiten Daten, Bereitstellen (210) einer ersten Programmfunktion (F1), die dazu ausgebildet ist, Vorgabedaten (VD1, VD2) zu empfangen und in der Datenstruktur (DS) zu speichern, wobei die erste Programmfunktion (F1) weiter dazu ausgebildet ist, der ersten Programmfunktion (F1) zeitlich aufeinanderfolgend übergebene Vorgabedaten (VD1, VD2) abwechselnd in der ersten Speicherstruktur (SS1) und in der zweiten Speicherstruktur (SS2) zu speichern.

2. Verfahren nach Anspruch 1, wobei die erste Programmfunktion (F1) dazu ausgebildet ist, zumindest eine der Datenstruktur (DS) zugeordnete Zustandsvariable zu verwenden, um begonnene oder erfolgte Schreibzugriffe auf die erste Speicherstruktur (SS1) und/oder die zweite Speicherstruktur (SS2) zu ermitteln und/oder zumindest zeitweise zu speichern.

3. Verfahren nach Anspruch 2, wobei die erste Programmfunktion (F1) dazu ausgebildet ist, als Zustandsvariable einen ersten Zähler (C1) zu verwenden, um eine Anzahl von Schreibzugriffen auf die Datenstruktur (DS) und/oder die erste und/oder zweite Speicherstruktur (SS1, SS2) zu ermitteln und/oder zumindest zeitweise zu speichern.

4. Verfahren nach Anspruch 3, wobei die erste Programmfunktion (F1) dazu ausgebildet ist, in Abhängigkeit des ersten Zählers (C1) a) zu ermitteln, ob der ersten Programmfunktion (F1) übergebene Vorgabedaten (VD1, VD2) in die erste Speicherstruktur (SS1) oder in die zweite Speicherstruktur (SS2) geschrieben werden sollen und/oder b) ihr übergebene Vorgabedaten (VD1, VD2) in die erste Speicherstruktur (SS1) oder die zweite Speicherstruktur (SS2) zu schreiben.

5. Verfahren nach wenigstens einem der vorstehenden Ansprüche, weiter aufweisend: Bereitstellen (220) einer zweiten Programmfunktion (F2), die dazu ausgebildet ist, in der Datenstruktur (DS) gespeicherte Daten zu lesen und/oder auszugeben.

6. Verfahren nach Anspruch 5, wobei die zweite Programmfunktion (F2) dazu ausgebildet ist, in der Datenstruktur (DS) gespeicherte Daten abwechselnd, insbesondere bezogen auf zeitlich aufeinanderfolgende Aufrufe der ersten Programmfunktion (F1), aus der ersten Speicherstruktur (SS1) und der zweiten Speicherstruktur (SS2) zu lesen.

7. Verfahren nach wenigstens einem der vorstehenden Ansprüche, wobei der erste Zähler (C1) der ersten Speicherstruktur (SS1) zugeordnet ist, und wobei ein zweiter Zähler (C2) vorgesehen ist, der der zweiten Speicherstruktur (SS2) zugeordnet ist, wobei die erste Programmfunktion (F1) dazu ausgebildet ist, bei einem Schreibzugriff auf die erste Speicherstruktur (SS1) den ersten Zähler (C1) zu erhöhen und bei einem Schreibzugriff auf die zweite Speicherstruktur (SS2) den zweiten Zähler (C2) zu erhöhen.

8. Verfahren nach Anspruch 7, wobei die zweite Programmfunktion (F2) dazu ausgebildet ist, a) vor dem Lesen der Daten zu ermitteln, aus welcher der beiden Speicherstrukturen (SS1, SS2) die Daten gelesen werden sollen, b) vor dem Lesen der Daten einen ersten Zählerwert desjenigen Zählers zu ermitteln, aus dessen zugeordneter Speicherstruktur (SS1, SS2) die Daten gelesen werden sollen, c) nach dem Lesen der Daten einen zweiten Zählerwert desjenigen Zählers zu ermitteln, aus dessen zugeordneter Speicherstruktur (SS1, SS2) zu diesem Zeitpunkt die Daten gelesen werden sollen, und d) den ersten Zählerwert mit dem zweiten Zählerwert zu vergleichen.

9. Verfahren nach Anspruch 8, wobei dann, wenn der Vergleich ergibt, dass der erste Zählerwert von dem zweiten Zählerwert verschieden ist, wenigstens eines der folgenden Elemente ausgeführt wird: a) Schließen darauf, dass während des Lesens der Daten erneut Daten in die Speicherstruktur (SS1, SS2) geschrieben worden sind, aus der gelesen worden ist, b) erneutes Lesen der Daten aus der ermittelten Speicherstruktur (SS1, SS2).

10. Verfahren nach wenigstens einem der vorstehenden Ansprüche, wobei die Datenstruktur (DS) weiter wenigstens eines der folgenden Elemente aufweist: a) einen Schreibzeiger (WRPTR), der angibt, in welche der beiden Speicherstrukturen (SS1, SS2) der ersten Programmfunktion (F1) übergebene Vorgabedaten (VD1, VD2) geschrieben werden sollen, b) einen Lesezeiger (RDPTR), der angibt, aus welcher der beiden Speicherstrukturen (SS1, SS2) Daten, insbesondere mittels der zweiten Programmfunktion (F2), ausgelesen werden sollen.

11. Verfahren nach Anspruch 10, wobei die Datenstruktur (DS) den Schreibzeiger (WRPTR) und den Lesezeiger (RDPTR) aufweist, und wobei die erste Programmfunktion (F1) die Werte des Schreibzeigers (WRPTR) und des Lesezeigers (RDPTR), insbesondere nach erfolgtem Schreiben der Vorgabedaten (VD1, VD2) in die Speicherstruktur (SS1, SS2), miteinander vertauscht.

12. Vorrichtung (300) zum Verarbeiten von Daten, wobei die Vorrichtung (300) zur Ausführung der folgenden Schritte ausgebildet ist: Bereitstellen (200) einer Datenstruktur (DS) mit einer ersten Speicherstruktur (SS1) zur zumindest zeitweisen Speicherung von ersten Daten und einer zweiten Speicherstruktur (SS2) zur zumindest zeitweisen Speicherung von zweiten Daten, Bereitstellen (210) einer ersten Programmfunktion (F1), die dazu ausgebildet ist, Vorgabedaten (VD1, VD2) zu empfangen und in der Datenstruktur (DS) zu speichern, wobei die erste Programmfunktion (F1) weiter dazu ausgebildet ist, der ersten Programmfunktion (F1) zeitlich aufeinanderfolgend übergebene Vorgabedaten (VD1, VD2) abwechselnd in der ersten Speicherstruktur (SS1) und in der zweiten Speicherstruktur (SS2) zu speichern.

13. Vorrichtung (300) nach Anspruch 12, wobei die Vorrichtung (300) zur Ausführung des Verfahrens nach wenigstens einem der Ansprüche 1 bis 11 ausgebildet ist.

14. Computerprogrammprodukt (PRG), umfassend Befehle, die bei der Ausführung des Computerprogramms durch einen Computer diesen veranlassen, das Verfahren nach wenigstens einem der Ansprüche 1 bis 11 auszuführen.

15. Computerlesbares Speichermedium (SM), umfassend Befehle, insbesondere in Form eines Computerprogramms (PRG), die bei der Ausführung durch einen Computer diesen veranlassen, das Verfahren nach wenigstens einem der Ansprüche 1 bis 11 auszuführen.

16. Datenträgersignal, das das Computerprogrammprodukt (PRG) nach Anspruch 14 charakterisiert und/oder überträgt.

17. Verwendung des Verfahrens nach wenigstens einem der Ansprüche 1 bis 11 und/oder der Vorrichtung (300) nach wenigstens einem der Ansprüche 12 bis 13 und/oder des Computerprogrammprodukts (PRG) nach Anspruch 14 zum Austauschen von Daten zwischen a) verschiedenen Rechenkernen (302b, 302c) einer Recheneinrichtung (300) und/oder b) Tasks (T1, T2) eines Computerprogramms (PRG2).

Description:
Beschreibung

Titel

Verfahren und Vorrichtung zum Verarbeiten von Daten

Stand der Technik

Die Offenbarung betrifft ein Verfahren zum Verarbeiten von Daten.

Die Offenbarung betrifft ferner eine Vorrichtung zum Verarbeiten von Daten. Offenbarung der Erfindung

Bevorzugte Ausführungsformen beziehen sich auf ein Verfahren zum Verarbeiten von Daten, aufweisend die folgenden Schritte: Bereitstellen einer Datenstruktur mit einer ersten Speicherstruktur zur zumindest zeitweisen Speicherung von ersten Daten und einer zweiten Speicherstruktur zur zumindest zeitweisen Speicherung von zweiten Daten, Bereitstellen einer ersten Programmfunktion, die dazu ausgebildet ist, Vorgabedaten zu empfangen und in der Datenstruktur zu speichern, wobei die erste Programmfunktion weiter dazu ausgebildet ist, der ersten Programmfunktion zeitlich aufeinanderfolgend übergebene Vorgabedaten abwechselnd in der ersten Speicherstruktur und in der zweiten Speicherstruktur zu speichern. Dadurch ist vorteilhaft gewährleistet, dass getrennte Speicherstrukturen für Lese- und Schreibzugriffe bereitstehen und damit ein Schreibzugriff parallel oder überlappend zu einem oder mehreren Lesezugriffen erfolgen kann ohne Beeinträchtigung der Konsistenz der eingelesenen Daten.

Bei weiteren bevorzugten Ausführungsformen kann das Empfangen bzw. Übergeben der zu speichernden Vorgabedaten durch ein Übergeben der Vorgabedaten (oder eines Zeigers auf die Vorgabedaten) als Argument bzw. Parameter bei dem Aufrufen der ersten Programmfunktion realisiert werden. Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die erste Programmfunktion dazu ausgebildet ist, zumindest eine der Datenstruktur zugeordnete Zustandsvariable zu verwenden, um begonnene oder erfolgte Schreibzugriffe auf die erste Speicherstruktur und/oder die zweite Speicherstruktur zu ermitteln und/oder zumindest zeitweise zu speichern.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die erste Programmfunktion dazu ausgebildet ist, als Zustandsvariable einen ersten Zähler zu verwenden, um eine Anzahl von Schreibzugriffen auf die Datenstruktur und/oder die erste und/oder zweite Speicherstruktur zu ermitteln und/oder zumindest zeitweise zu speichern.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die erste Programmfunktion dazu ausgebildet ist, in Abhängigkeit vom Inhalt der ersten oder einer weiteren der Datenstruktur zugeordneten Zustandsvariablen die ihr übergebenen Vorgabedaten in die erste Speicherstruktur oder die zweite Speicherstruktur zu schreiben.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die erste Programmfunktion dazu ausgebildet ist, in Abhängigkeit des ersten Zählers a) zu ermitteln, ob der ersten Programmfunktion übergebene Vorgabedaten in die erste Speicherstruktur oder in die zweite Speicherstruktur geschrieben werden sollen und/oder b) ihr übergebene Vorgabedaten in die erste Speicherstruktur oder die zweite Speicherstruktur zu schreiben.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass das Verfahren weiter aufweist: Bereitstellen einer zweiten Programmfunktion, die dazu ausgebildet ist, in der Datenstruktur gespeicherte Daten zu lesen und/oder auszugeben.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die zweite Programmfunktion dazu ausgebildet ist, in der Datenstruktur gespeicherte Daten abwechselnd, insbesondere bezogen auf zeitlich aufeinanderfolgende Aufrufe der ersten Programmfunktion, aus der ersten Speicherstruktur und der zweiten Speicherstruktur zu lesen. Dadurch kann ein lesender Zugriff auf die Datenstruktur vorteilhaft an den schreibenden Zugriff gemäß weiteren bevorzugten Ausführungsformen angepasst werden.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die zweite Programmfunktion dazu ausgebildet ist, in der Datenstruktur gespeicherte Daten jeweils aus der Speicherstruktur (bzw. derjenigen der beiden Speicherstrukturen) einzulesen, die zuletzt von der ersten Programmfunktion vollständig beschrieben wurde.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass der erste Zähler der ersten Speicherstruktur zugeordnet ist, wobei ein zweiter Zähler vorgesehen ist, der der zweiten Speicherstruktur zugeordnet ist, wobei die erste Programmfunktion dazu ausgebildet ist, bei einem Schreibzugriff auf die erste Speicherstruktur den ersten Zähler zu erhöhen und bei einem Schreibzugriff auf die zweite Speicherstruktur den zweiten Zähler zu erhöhen.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die zweite Programmfunktion dazu ausgebildet ist, a) vor dem Lesen der Daten zu ermitteln, aus welcher der beiden Speicherstrukturen die Daten gelesen werden sollen, b) vor dem Lesen der Daten einen ersten Zählerwert desjenigen Zählers zu ermitteln, aus dessen zugeordneter Speicherstruktur die Daten gelesen werden sollen, c) nach dem Lesen der Daten einen zweiten Zählerwert desjenigen Zählers zu ermitteln, aus dessen zugeordneter Speicherstruktur zu diesem Zeitpunkt die Daten gelesen werden sollen, und d) den ersten Zählerwert mit dem zweiten Zählerwert zu vergleichen. Dadurch kann vorteilhaft festgestellt werden, ob z.B. während des Lesens der Daten aus der betreffenden Speicherstruktur ggf. ein Dateninhalt verändert worden ist bzw. jüngere Daten in die betreffende Speicherstruktur geschrieben worden sind, z.B. durch einen Schreibzugriff auf die betreffende Speicherstruktur, der zumindest teilweise mit dem Lesen der Daten überlappt.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass dann, wenn der Vergleich ergibt, dass der erste Zählerwert von dem zweiten Zählerwert verschieden ist, wenigstens eines der folgenden Elemente ausgeführt wird: a) Schließen darauf, dass während des Lesens der Daten erneut Daten in die Speicherstruktur geschrieben worden sind, aus der gelesen worden ist, b) erneutes Lesen der Daten aus der, insbesondere gemäß Anspruch 8, ermittelten Speicherstruktur (also aus derjenigen Speicherstruktur, für die ermittelt worden ist, dass aus ihr gelesen werden soll). Durch Element b) kann sichergestellt werden, stets die jüngsten Daten aus der Speicherstruktur zu lesen, insbesondere auch bei Schreibzugriffen auf die Speicherstruktur, die zumindest teilweise mit dem Lesen der Daten überlappen.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die Datenstruktur weiter wenigstens eines der folgenden Elemente aufweist: a) einen Schreibzeiger, der angibt, in welche der beiden Speicherstrukturen der ersten Programmfunktion übergebene Vorgabedaten geschrieben werden sollen, b) einen Lesezeiger, der angibt, aus welcher der beiden Speicherstrukturen Daten, insbesondere mittels der zweiten Programmfunktion, ausgelesen werden sollen.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die Datenstruktur den Schreibzeiger und den Lesezeiger aufweist, wobei die erste Programmfunktion die Werte des Schreibzeigers und des Lesezeigers miteinander vertauscht, insbesondere nach erfolgtem Schreiben der Daten. Dadurch kann ein abwechselndes Beschreiben der beiden Speicherstrukturen besonders effizient ausgeführt werden. Weiterhin kann dadurch ebenfalls sehr effizient diejenige Speicherstruktur definiert werden, aus welcher Daten gelesen werden sollen.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die erste Programmfunktion dazu ausgebildet ist, wenigstens eines der folgenden Elemente zu empfangen: a) eine die Datenstruktur und/oder einen Speicherort der Datenstruktur charakterisierende erste Größe, insbesondere einen Zeiger auf die Datenstruktur, b) eine die Vorgabedaten und/oder einen Speicherort der Vorgabedaten charakterisierende zweite Größe, insbesondere einen Zeiger auf die Vorgabedaten, c) eine eine Menge oder Größe der Vorgabedaten charakterisierende dritte Größe. Mittels der ersten Größe kann die erste Programmfunktion bei weiteren bevorzugten Ausführungsformen diejenige Datenstruktur ermitteln, in die bzw. in deren Speicherstruktur(en) Daten zu speichern sind, was insbesondere im Falle mehrerer Datenstrukturen bzw. Instanzen von Datenstrukturen nützlich ist. Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die zweite Programmfunktion dazu ausgebildet ist, wenigstens eines der folgenden Elemente zu empfangen: a) eine die Datenstruktur und/oder einen Speicherort der Datenstruktur charakterisierende vierte Größe, insbesondere einen Zeiger auf die Datenstruktur, b) eine einen Zielspeicherort zum zumindest zeitweisen Speichern zu lesender Daten charakterisierende fünfte Größe, insbesondere einen Zeiger auf die Vorgabedaten, c) eine eine Menge oder Größe der Vorgabedaten charakterisierende dritte Größe. Mittels der vierten Größe kann die zweite Programmfunktion bei weiteren bevorzugten Ausführungsformen diejenige Datenstruktur ermitteln, aus der bzw. aus deren Speicherstruktur(en) Daten zu lesen sind, was insbesondere im Falle mehrerer Datenstrukturen bzw. Instanzen von Datenstrukturen nützlich ist.

Weitere bevorzugte Ausführungsformen beziehen sich auf eine Vorrichtung zum Verarbeiten von Daten, wobei die Vorrichtung zur Ausführung der folgenden Schritte ausgebildet ist: Bereitstellen einer Datenstruktur mit einer ersten Speicherstruktur zur zumindest zeitweisen Speicherung von ersten Daten und einer zweiten Speicherstruktur zur zumindest zeitweisen Speicherung von zweiten Daten, Bereitstellen einer ersten Programmfunktion, die dazu ausgebildet ist, Vorgabedaten zu empfangen und in der Datenstruktur zu speichern, wobei die erste Programmfunktion weiter dazu ausgebildet ist, der ersten Programmfunktion zeitlich aufeinanderfolgend übergebene Vorgabedaten abwechselnd in der ersten Speicherstruktur und in der zweiten Speicherstruktur zu speichern.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die Vorrichtung zur Ausführung des Verfahrens gemäß den Ausführungsformen ausgebildet ist.

Weitere bevorzugte Ausführungsformen beziehen sich auf ein Computerprogrammprodukt, umfassend Befehle, die bei der Ausführung des Computerprogramms durch einen Computer diesen veranlassen, das Verfahren gemäß den Ausführungsformen auszuführen.

Weitere bevorzugte Ausführungsformen beziehen sich auf ein computerlesbares Speichermedium, umfassend Befehle, insbesondere in Form eines Computerprogramms, die bei der Ausführung durch einen Computer diesen veranlassen, das Verfahren gemäß den Ausführungsformen auszuführen.

Weitere bevorzugte Ausführungsformen beziehen sich auf ein Datenträgersignal, das das Computerprogrammprodukt gemäß den Ausführungsformen charakterisiert und/oder überträgt. Bei weiteren bevorzugten Ausführungsformen kann das Datenträgersignal z.B. für eine Übertragung des Computerprogrammprodukts bzw. Computerprogramms gemäß den Ausführungsformen von einer ersten Einheit zu einer zweiten Einheit verwendet werden, z.B. von einem Server-Computer zu einem Client-Computer, auf dem das Computerprogramm gemäß den Ausführungsformen ausgeführt werden soll. Die Übertragung kann beispielsweise einen Download des Computerprogramms gemäß den Ausführungsformen über ein Datennetzwerk, insbesondere ein privates und/oder öffentliches Computernetzwerk wie z.B. das Internet umfassen, wobei das Datenträgersignal beispielsweise eine Mehrzahl von Datenpaketen umfassen kann. Bei weiteren bevorzugten Ausführungsformen kann die Übertragung z.B. auch wenigstens teilweise über ein (zelluläres) Mobilfunknetz, z.B. nach dem 4G- oder 5G-Standard, erfolgen.

Weitere bevorzugte Ausführungsformen beziehen sich auf eine Verwendung des Verfahrens gemäß den Ausführungsformen und/oder der Vorrichtung gemäß den Ausführungsformen und/oder des Computerprogrammprodukts gemäß den Ausführungsformen zum Austauschen von Daten zwischen a) verschiedenen Rechenkernen einer Recheneinrichtung und/oder b) Tasks eines Computerprogramms.

Weitere Merkmale, Anwendungsmöglichkeiten und Vorteile der Erfindung ergeben sich aus der nachfolgenden Beschreibung von Ausführungsbeispielen der Erfindung, die in den Figuren der Zeichnung dargestellt sind. Dabei bilden alle beschriebenen oder dargestellten Merkmale für sich oder in beliebiger Kombination den Gegenstand der Erfindung, unabhängig von ihrer Zusammenfassung in den Patentansprüchen oder deren Rückbeziehung sowie unabhängig von ihrer Formulierung bzw. Darstellung in der Beschreibung bzw. in der Zeichnung.

In der Zeichnung zeigt: Figur 1 schematisch ein vereinfachtes Flussdiagramm eines Verfahrens gemäß bevorzugten Ausführungsformen,

Figur 2Aschematisch ein Blockdiagramm einer Datenstruktur gemäß weiteren bevorzugten Ausführungsformen in einem ersten Betriebszustand,

Figur 2Bschematisch ein Blockdiagramm der Datenstruktur gemäß Figur 2A in einem zweiten Betriebszustand,

Figur 3 schematisch ein vereinfachtes Blockdiagramm einer Vorrichtung gemäß weiteren bevorzugten Ausführungsformen,

Figur 4Aschematisch ein Speichermedium gemäß weiteren bevorzugten Ausführungsformen,

Figur 4Bschematisch ein Computerprogramm gemäß weiteren bevorzugten Ausführungsformen,

Figur 5A schematisch ein vereinfachtes Flussdiagramm eines Verfahrens gemäß weiteren bevorzugten Ausführungsformen,

Figur 5B schematisch ein vereinfachtes Flussdiagramm eines Verfahrens gemäß weiteren bevorzugten Ausführungsformen,

Figur 5C schematisch ein vereinfachtes Flussdiagramm eines Verfahrens gemäß weiteren bevorzugten Ausführungsformen,

Figur 5D schematisch ein vereinfachtes Flussdiagramm eines Verfahrens gemäß weiteren bevorzugten Ausführungsformen,

Figur 5E schematisch ein vereinfachtes Flussdiagramm eines Verfahrens gemäß weiteren bevorzugten Ausführungsformen, und

Figur 6 schematisch ein Zeitdiagramm gemäß weiteren bevorzugten Ausführungsformen. Bevorzugte Ausführungsformen beziehen sich auf ein Verfahren zum Verarbeiten von Daten, das nachstehend unter Bezugnahme auf das vereinfachte Flussdiagramm gemäß Figur 1 beschrieben ist. Die bei dem Verfahren verwendbare Datenstruktur DS ist schematisch in Figur 2A, 2B in jeweils unterschiedlichen Betriebszuständen dargestellt.

Das Verfahren ist bei weiteren bevorzugten Ausführungsformen z.B. als computerimplementiertes Verfahren realisierbar und weist die folgenden Schritte auf: Bereitstellen 200 einer Datenstruktur DS mit einer ersten Speicherstruktur

551 zur zumindest zeitweisen Speicherung von ersten Daten und einer zweiten Speicherstruktur SS2 zur zumindest zeitweisen Speicherung von zweiten Daten, Bereitstellen 210 (Fig. 1) einer ersten Programmfunktion F1, die dazu ausgebildet ist, Vorgabedaten zu empfangen und in der Datenstruktur DS zu speichern, wobei die erste Programmfunktion F1 weiter dazu ausgebildet ist, der ersten Programmfunktion F1 zeitlich aufeinanderfolgend übergebene Vorgabedaten VD1, VD2 abwechselnd in der ersten Speicherstruktur SS1 und in der zweiten Speicherstruktur SS2 zu speichern. Dadurch ist vorteilhaft eine sichere Trennung zwischen den ersten und zweiten Daten gewährleistet, und es kann jederzeit ein Schreibzugriff (mittels der ersten Programmfunktion F1), insbesondere auch parallel oder überlappend zu einem oder mehreren Lesezugriffen (z.B. realisierbar durch eine optionale weitere Programmfunktion) auf die Datenstruktur DS ausgeführt werden.

Figur 2A zeigt hierzu schematisch einen ersten Zustand der Datenstruktur DS, wie er nach zwei Speichervorgängen mittels der ersten Programmfunktion F1 vorliegt, ausgehend von einem Initialisierungszustand (nicht gezeigt), in dem beide Speicherstrukturen SS1, SS2 zu Null gesetzt worden sind. Nach dem erstmaligen Speichern von Vorgabedaten mittels der ersten Programmfunktion F1, die der ersten Programmfunktion F1 z.B. in Form eines Parameters übergeben werden können, sind diese Vorgabedaten als erste Vorgabedaten VD1 in der ersten Speicherstruktur SS1 gespeichert. Ein darauffolgender zweiter Speichervorgang mittels der ersten Programmfunktion F1 bewirkt, dass die Vorgabedaten für den zweiten Speichervorgang in die zweite Speicherstruktur

552 gespeichert werden. Dieser Zustand ist in Figur 2A abgebildet. Sofern danach ein dritter Speichervorgang mittels der ersten Programmfunktion F1 erfolgt, bewirkt dies, dass die Vorgabedaten VD3 für den dritten Speichervorgang abermals in die erste Speicherstruktur SS1 geschrieben werden, mithin die seit dem ersten Speichervorgang darin gespeicherten ersten Vorgabedaten VD1 überschrieben werden. Die zweite Speicherstruktur SS2 enthält nach wie vor die zweiten Vorgabedaten. Dieser Zustand ist in Figur 2B abgebildet.

Figur 5A zeigt schematisch ein vereinfachtes Flussdiagramm gemäß weiteren bevorzugten Ausführungsformen. In Schritt 230 werden erste Vorgabedaten VD1 mittels der ersten Programmfunktion F1 in der ersten Speicherstruktur SS1 der Datenstruktur DS gespeichert, in einem darauffolgenden Schritt 232 werden zweite Vorgabedaten VD2 mittels der ersten Programmfunktion F1 in der zweiten Speicherstruktur SS2 der Datenstruktur DS gespeichert, und in einem darauffolgenden Schritt 234 werden dritte Vorgabedaten VD3 mittels der ersten Programmfunktion F1 wieder in der ersten Speicherstruktur SS1 der Datenstruktur DS gespeichert, Fig. 2B.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die erste Programmfunktion F1 dazu ausgebildet ist, einen ersten Zähler C1 zu verwenden, um eine Anzahl von Schreibzugriffen auf die Datenstruktur DS und/oder die erste und/oder zweite Speicherstruktur SS1 , SS2 zu ermitteln und/oder zumindest zeitweise zu speichern. Dadurch kann z.B. bei einem Aufruf der ersten Programmfunktion F1 für ein neuerliches Speichern von Vorgabedaten in die Datenstruktur DS effizient ermittelt werden, in welche Speicherstruktur SS1, SS2 die Vorgabedaten zu speichern sind. Bei weiteren bevorzugten Ausführungsformen kann z.B. vorgesehen sein, die Vorgabedaten in die erste Speicherstruktur SS1 zu speichern, wenn der erste Zähler C1 eine gerade Zahl (einschließlich Null) aufweist und die Vorgabedaten in die zweite Speicherstruktur SS2 zu speichern, wenn der erste Zähler C1 eine ungerade Zahl aufweist.

Mit anderen Worten ist bei weiteren bevorzugten Ausführungsformen vorgesehen, dass die erste Programmfunktion F1 dazu ausgebildet ist, in Abhängigkeit des ersten Zählers C1 a) zu ermitteln, ob der ersten Programmfunktion F1 übergebene Vorgabedaten in die erste Speicherstruktur SS1 oder in die zweite Speicherstruktur SS2 geschrieben werden sollen und/oder b) ihr übergebene Vorgabedaten in die erste Speicherstruktur SS1 oder die zweite Speicherstruktur SS2 zu schreiben.

Figur 5B zeigt schematisch ein vereinfachtes Flussdiagramm gemäß weiteren bevorzugten Ausführungsformen. In Schritt 240 wird der erste Zähler C1 ausgewertet, um zu ermitteln, in welche der beiden Speicherstrukturen SS1, SS2 Vorgabedaten gespeichert werden sollen, und in Schritt 242 werden die Vorgabedaten in die gemäß Schritt 240 ermittelte Speicherstruktur gespeichert.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass das Verfahren weiter aufweist, vgl. Fig. 1: Bereitstellen 220 einer zweiten Programmfunktion F2, die dazu ausgebildet ist, in der Datenstruktur DS gespeicherte Daten zu lesen und/oder auszugeben.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die zweite Programmfunktion F2 dazu ausgebildet ist, in der Datenstruktur DS gespeicherte Daten abwechselnd, insbesondere bezogen auf zeitlich aufeinanderfolgende Aufrufe der ersten Programmfunktion F1, aus der ersten Speicherstruktur SS1 und der zweiten Speicherstruktur SS2 zu lesen. Dadurch kann ein lesender Zugriff auf die Datenstruktur vorteilhaft an den schreibenden Zugriff gemäß weiteren bevorzugten Ausführungsformen angepasst werden. Insbesondere kann dadurch erreicht werden, dass bei dem Lesen mittels der zweiten Programmfunktion F2 stets die „jüngsten“, also zuletzt mittels der ersten Programmfunktion F1 in die Datenstruktur DS bzw. ihre Speicherstrukturen SS1, SS2 geschriebenen Daten gelesen werden. Ausgehend von dem ersten Zustand der Datenstruktur DS gemäß Figur 2A werden bei einem Lesen mittels der zweiten Programmfunktion F2 demnach die zweiten Vorgabedaten VD2 aus der zweiten Speicherstruktur SS2 gelesen, wohingegen ausgehend von dem zweiten Zustand der Datenstruktur DS gemäß Figur 2B bei einem Lesen mittels der zweiten Programmfunktion F2 die dritten Vorgabedaten VD3 aus der ersten Speicherstruktur SS1 gelesen, weil diese jünger sind.

Figur 5C zeigt schematisch ein vereinfachtes Flussdiagramm gemäß weiteren bevorzugten Ausführungsformen. In Schritt 250 werden, z.B. ausgehend von dem ersten Zustand der Datenstruktur DS gemäß Figur 2A, erstmals in der Datenstruktur DS gespeicherte Daten mittels der zweiten Programmfunktion F2 gelesen. Das Lesen erfolgt dabei aus der zweiten Speicherstruktur SS2, weil diese die aktuell jüngsten Daten VD2 enthält. In Schritt 252 werden erneut in der Datenstruktur DS gespeicherte Daten VD2 mittels der zweiten Programmfunktion F2 gelesen. Da seither, also zwischen den Schritten 250, 252, kein Speichern von Daten mittels der ersten Programmfunktion F1 in der Datenstruktur DS erfolgt ist, werden auch in Schritt 252 die Daten aus der zweiten Speicherstruktur SS2 gelesen, weil diese immer noch die „jüngsten“ Daten darstellen. Vergleichbares gilt für einen nachfolgenden Schritt 254 des Lesens. Nach Schritt 254 erfolgt ein Speichern von Daten mittels der ersten Programmfunktion F1 in der Datenstruktur DS, wodurch der zweite Zustand gemäß Figur 2B erreicht wird, vgl. auch den Pfeil 234 aus Figur 5C zwischen den Schritten 254, 256. Daher werden bei einer neuerlichen Ausführung der zweiten Programmfunktion F2 gemäß Schritt 256 zum Lesen von Daten aus der Datenstruktur DS nunmehr die dritten Vorgabedaten VD3 aus der Datenstruktur DS gelesen, weil diese nach dem Schritt 234 des Speicherns die jüngsten Daten darstellen.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass der erste Zähler C1 der ersten Speicherstruktur SS1 (Fig. 2A) zugeordnet ist, wobei ein zweiter Zähler C2 vorgesehen ist, der der zweiten Speicherstruktur SS2 zugeordnet ist, wobei die erste Programmfunktion F1 dazu ausgebildet ist, bei einem Schreibzugriff auf die erste Speicherstruktur SS1 den ersten Zähler C1 zu erhöhen und bei einem Schreibzugriff auf die zweite Speicherstruktur SS2 den zweiten Zähler C2 zu erhöhen. Dies ist beispielhaft anhand des Flussdiagramms gemäß Fig. 5D gezeigt. In Schritt 260 werden Daten mittels der ersten Programmfunktion F1 in der ersten Speicherstruktur SS1 gespeichert, und es wird der erste Zähler C1 inkrementiert, z.B. um den Wert eins. In Schritt 262 werden Daten mittels der ersten Programmfunktion F1 in der zweiten Speicherstruktur SS2 gespeichert, und es wird der zweite Zähler C2 inkrementiert, ebenfalls z.B. um den Wert eins.

Bei weiteren bevorzugten Ausführungsformen, vgl. auch das Flussdiagramm gemäß Fig. 5E, ist vorgesehen, dass die zweite Programmfunktion F2 dazu ausgebildet ist, a) vor dem Lesen der Daten zu ermitteln (vgl. Schritt 270 aus Fig. 5E), aus welcher der beiden Speicherstrukturen SS1, SS2 die Daten gelesen werden sollen, b) vor dem Lesen der Daten einen ersten Zählerwert desjenigen Zählers C1, C2 zu ermitteln (vgl. Schritt 272 aus Fig. 5E), aus dessen zugeordneter Speicherstruktur SS1, SS2 die Daten gelesen werden sollen, c) nach dem Lesen 273 der Daten einen zweiten Zählerwert desjenigen Zählers C1, C2 zu ermitteln (vgl. Schritt 274 aus Fig. 5E), aus dessen zugeordneter Speicherstruktur SS1, SS2 zu diesem Zeitpunkt die Daten gelesen werden sollen, und d) den ersten Zählerwert mit dem zweiten Zählerwert zu vergleichen (vgl. Schritt 276 aus Fig. 5E). Dadurch kann vorteilhaft festgestellt werden, ob z.B. während des Lesens 273 der Daten aus der betreffenden Speicherstruktur ggf. ein Dateninhalt verändert worden ist bzw. jüngere Daten in die betreffende Speicherstruktur geschrieben worden sind, z.B. durch einen Schreibzugriff auf die betreffende Speicherstruktur, der zumindest teilweise mit dem Lesen der Daten überlappt.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass dann, wenn der Vergleich 276 ergibt, dass der erste Zählerwert von dem zweiten Zählerwert verschieden ist, wenigstens eines der folgenden Elemente ausgeführt wird: a) Schließen 277 darauf, dass während des Lesens 273 der Daten erneut Daten in die Speicherstruktur geschrieben worden sind, aus der gelesen worden ist, b) erneutes Lesen 278 der Daten aus derselben Speicherstruktur. Durch Element b), das erneute Lesen 278, kann sichergestellt werden, stets die jüngsten Daten aus der Speicherstruktur zu lesen, insbesondere auch bei Schreibzugriffen auf die Speicherstruktur, die zumindest teilweise mit dem Lesen 273 der Daten überlappen.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die Datenstruktur weiter wenigstens eines der folgenden Elemente aufweist: a) einen Schreibzeiger WRPTR (Fig. 2A), der angibt, in welche der beiden Speicherstrukturen SS1, SS2 der ersten Programmfunktion F1 übergebene Vorgabedaten geschrieben werden sollen, b) einen Lesezeiger RDPTR, der angibt, aus welcher der beiden Speicherstrukturen SS1, SS2 Daten, insbesondere mittels der zweiten Programmfunktion F2, ausgelesen werden sollen.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die Datenstruktur den Schreibzeiger WRPTR und den Lesezeiger RDPTR aufweist, wobei die erste Programmfunktion F1 die Werte des Schreibzeigers WRPTR und des Lesezeigers RDPTR miteinander vertauscht. Dadurch kann ein abwechselndes Beschreiben der beiden Speicherstrukturen SS1, SS2 besonders effizient ausgeführt werden. Weiterhin kann dadurch ebenfalls sehr effizient diejenige Speicherstruktur definiert werden, aus welcher Daten gelesen werden sollen.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die erste Programmfunktion dazu ausgebildet ist, wenigstens eines der folgenden Elemente zu empfangen: a) eine die Datenstruktur und/oder einen Speicherort der Datenstruktur charakterisierende erste Größe, insbesondere einen Zeiger auf die Datenstruktur, b) eine die Vorgabedaten und/oder einen Speicherort der Vorgabedaten charakterisierende zweite Größe, insbesondere einen Zeiger auf die Vorgabedaten, c) eine eine Menge und/oder Größe der Vorgabedaten charakterisierende dritte Größe. Mittels der ersten Größe kann die erste Programmfunktion bei weiteren bevorzugten Ausführungsformen diejenige Datenstruktur ermitteln, in die bzw. in deren Speicherstruktur(en) Daten zu speichern sind, was insbesondere im Falle mehrerer Datenstrukturen bzw. Instanzen von Datenstrukturen nützlich ist.

Bei weiteren bevorzugten Ausführungsformen ist vorgesehen, dass die zweite Programmfunktion dazu ausgebildet ist, wenigstens eines der folgenden Elemente zu empfangen: a) eine die Datenstruktur und/oder einen Speicherort der Datenstruktur charakterisierende vierte Größe, insbesondere einen Zeiger auf die Datenstruktur, b) eine einen Zielspeicherort zum zumindest zeitweisen Speichern zu lesender Daten charakterisierende fünfte Größe, insbesondere einen Zeiger auf die Vorgabedaten, c) eine eine Menge und/oder Größe der Vorgabedaten charakterisierende dritte Größe. Mittels der vierten Größe kann die zweite Programmfunktion bei weiteren bevorzugten Ausführungsformen diejenige Datenstruktur ermitteln, aus der bzw. aus deren Speicherstruktur(en) Daten zu lesen sind, was insbesondere im Falle mehrerer Datenstrukturen bzw. Instanzen von Datenstrukturen nützlich ist.

Weitere bevorzugte Ausführungsformen beziehen sich auf eine Vorrichtung 300 zum Verarbeiten von Daten, wobei die Vorrichtung 300 zur Ausführung des Verfahrens gemäß den Ausführungsformen ausgebildet ist. Figur 3 zeigt schematisch ein vereinfachtes Blockdiagramm der Vorrichtung 300. Die Vorrichtung 300 weist wenigstens eine Recheneinrichtung 302 auf, die z.B. über einen oder mehrere Rechenkerne 302a, 302b, 302c verfügen kann, wenigstens eine der Recheneinrichtung 302 zugeordnete Speichereinrichtung 304 zur zumindest zeitweisen Speicherung eines Computerprogramms PRG, wobei das Computerprogramm PRG insbesondere zur Steuerung eines Betriebs der Vorrichtung 300 und/oder zur Ausführung des Verfahrens gemäß bevorzugten Ausführungsformen ausgebildet ist.

Bei weiteren bevorzugten Ausführungsformen weist die Recheneinrichtung 302 wenigstens eines der folgenden Elemente auf: einen Mikroprozessor, einen Mikrocontroller, einen digitalen Signalprozessor (DSP), einen programmierbaren Logikbaustein (z.B. FPGA, field programmable gate array), einen ASIC (anwendungsspezifischen integrierten Schaltkreis), eine Hardwareschaltung. Kombinationen hieraus sind bei weiteren bevorzugten Ausführungsformen auch denkbar.

Bei weiteren bevorzugten Ausführungsformen weist die Speichereinrichtung 304 wenigstens eines der folgenden Elemente auf: einen flüchtigen Speicher 304a, insbesondere Arbeitsspeicher (RAM), einen nichtflüchtigen Speicher 304b, insbesondere Flash-EEPROM. Bevorzugt ist das Computerprogramm PRG in dem nichtflüchtigen Speicher 304b abgelegt.

Bei weiteren bevorzugten Ausführungsformen kann auch wenigstens ein weiteres Computerprogramm PRG2 in der Speichereinrichtung 304 gespeichert sein. Bei weiteren bevorzugten Ausführungsformen kann das Computerprogramms PRG die Funktionalität des Verfahrens gemäß den Ausführungsformen bereitstellen, wie sie vorstehend beispielhaft unter Bezugnahme auf Fig. 1 bis Fig. 5E beschrieben worden ist. Insbesondere kann das PRG bei weiteren bevorzugten Ausführungsformen auch die erste und/oder zweite Programmfunktion F1, F2 bereitstellen, z.B. in einem Speicherbereich der Speichereinrichtung, und/oder in Form einer Bibliothek oder dergleichen, wobei die erste und/oder zweite Programmfunktion F1, F2 beispielsweise durch das wenigstens eine weitere Computerprogramm PRG2 aufrufbar sind, um Daten in der Datenstruktur DS (Fig. 2A) zu speichern und/oder aus der Datenstruktur DS zu lesen. Die Recheneinrichtung 302 wird bei weiteren bevorzugten Ausführungsformen auch als „Computer“ bezeichnet, und das Verfahren gemäß bevorzugten Ausführungsformen, das wie bereits beschrieben insbesondere auch als computerimplementiertes Verfahren realisierbar ist, ist bei weiteren bevorzugten Ausführungsformen durch den Computer 302 ausführbar.

Weitere bevorzugte Ausführungsformen beziehen sich auf ein Computerprogrammprodukt PRG, vgl. Figur 4A, 4B, umfassend Befehle, die bei der Ausführung des Computerprogramms PRG durch einen Computer 302 diesen veranlassen, das Verfahren gemäß den Ausführungsformen auszuführen.

Weitere bevorzugte Ausführungsformen beziehen sich auf ein computerlesbares Speichermedium SM (Fig. 4A), umfassend Befehle, insbesondere in Form eines Computerprogramms PRG, die bei der Ausführung durch einen Computer 302 diesen veranlassen, das Verfahren gemäß den Ausführungsformen auszuführen. Das Speichermedium SM kann beispielsweise einen Festplattenspeicher (Harddisk) und/oder einen Halbleiterspeicher, z.B. eine SSD und/oder einen optischen Speicher (CD-ROM, DVD, usw.) und/oder einen sonstigen, bevorzugt digitalen, computerlesbaren Speicher aufweisen.

Weitere bevorzugte Ausführungsformen beziehen sich auf ein Datenträgersignal, das das Computerprogrammprodukt PRG gemäß den Ausführungsformen charakterisiert und/oder überträgt. Bei weiteren bevorzugten Ausführungsformen kann das Datenträgersignal z.B. für eine Übertragung des Computerprogrammprodukts bzw. Computerprogramms PRG gemäß den Ausführungsformen von einer ersten Einheit zu einer zweiten Einheit (z.B. zu der Vorrichtung 300, Fig. 3) verwendet werden, z.B. von einem Server-Computer zu einem Client-Computer 300, auf dem das Computerprogramm PRG gemäß den Ausführungsformen ausgeführt werden soll. Die Übertragung kann beispielsweise einen Download des Computerprogramms gemäß den Ausführungsformen über ein Datennetzwerk, insbesondere ein privates und/oder öffentliches Computernetzwerk wie z.B. das Internet umfassen, wobei das Datenträgersignal beispielsweise eine Mehrzahl von Datenpaketen umfassen kann. Bei weiteren bevorzugten Ausführungsformen kann die Übertragung z.B. auch wenigstens teilweise über ein (zelluläres) Mobilfunknetz, z.B. nach dem 4G- oder 5G-Standard, erfolgen.

Weitere bevorzugte Ausführungsformen beziehen sich auf eine Verwendung des Verfahrens gemäß den Ausführungsformen und/oder der Vorrichtung 300 gemäß den Ausführungsformen und/oder des Computerprogrammprodukts PRG gemäß den Ausführungsformen zum Austauschen von Daten zwischen a) verschiedenen Rechenkernen 302a, 302b, 302c einer Recheneinrichtung 302 und/oder b) Tasks eines Computerprogramms PRG2.

Nachfolgend sind weitere vorteilhafte Aspekte und weitere bevorzugte Ausführungsformen beschrieben, die jeweils einzeln für sich oder in Kombination miteinander mit einer oder mehreren der vorstehend beispielhaft beschriebenen bevorzugten Ausführungsformen kombinierbar sind.

Bei weiteren bevorzugten Ausführungsformen kann unter Anwendung des Prinzips gemäß den Ausführungsformen ein Verfahren zum Datenaustausch zwischen Tasks (z.B. einem Sendertask und einem oder mehreren Empfängertasks) eines Computerprogramms PRG2 (Fig. 3) und/oder zwischen Tasks und/oder Rechenkernen 302a, 302b, 302c einer Recheneinrichtung, z.B. ausgebildet als Multicore-System mit mehreren Rechenkernen 302a, 302b, 302c bereitgestellt werden, das Datenkonsistenz und Datenintegrität auch bei paralleler Abarbeitung sicherstellt und/oder Nachteile von konventionellen Systemen vermeidet oder zumindest reduziert und/oder optimiert bzw. optimierbar ist für spezielle Anforderungen und Gegebenheiten in manchen Zielsystemen wie z.B. Multicore-Systeme 300 (Fig. 3), wie sie z.B. für Steuergeräte für den Kraftfahrzeugbereich, beispielsweise als Steuergerät für ein Airbag-System, verwendbar sind.

Die Datenstruktur DS (Fig. 2A) gemäß bevorzugten Ausführungsformen und die Programmfunktionen F1, F2 ermöglichen vorteilhaft z.B. eine asynchrone Kommunikation von unterschiedlichen Komponenten der Vorrichtung 300 (z.B. Tasks und/oder Rechenkerne) und können auch als „Messagebox“ bezeichnet werden. Die Speicherstrukturen SS1, SS2 können dementsprechend gemäß weiteren bevorzugten Ausführungsformen auch als Messages bezeichnet werden bzw. jeweils eine Message (z.B. die zur Speicherung vorgesehenen Vorgabedaten) aufweisen bzw. repräsentieren. Ein „Senden“ einer Message kann z.B. durch die erste Programmfunktion F1 , und ein „Empfangen“ einer Message kann z.B. durch die zweite Programmfunktion F2 ausgeführt werden.

Als asynchron arbeitendes Verfahren vermeidet das Verfahren gemäß weiteren bevorzugten Ausführungsformen die Nachteile der konventionellen Tasksynchronisation mittels Mutexen, Semaphoren oder Spinlocks wie aktives Warten, Tasksuspendierungen oder das Risiko von Deadlocks.

Gegenüber weiteren bekannten Verfahren haben bevorzugte Ausführungsformen folgende Vorteile:

Robustes Verhalten bei sich ändernden Sende- und Empfangsraten (Raten, mit denen Daten in die Datenstruktur DS gespeichert und/oder aus ihr gelesen werden): Der problematische Fall „Messagebox voll“ kann konstruktionsbedingt nicht auftreten, weil bevorzugt alternierend die beiden Speicherstrukturen SS1 , SS2 (Fig. 2A) beschrieben werden. Nach erstmaligem Beschreiben einer Message SS1 , SS2 kann auch der Sonderfall „Messagebox leer“ nicht mehr auftreten (sofern die Messagebox DS nicht neu initialisiert wird).

Keine Auslegung/Konfiguration bezüglich Anzahl benötigter Messages in der Messagebox notwendig, weil statisch zwei Messages SS1 , SS2 definiert sind, 1 :n (auch 1 :1) Kommunikation ist möglich und erfordert insbesondere auch keine Änderung der Messagebox-Konfiguration, wenn sich die Anzahl der Empfängertasks ändert, bevorzugt gibt es jeweils eine schreibende Instanz, Nutzung einer „Last is best“-Semantik, nützlich insbesondere für einen Einsatz in Automotive Applikationen: Es wird bevorzugt nur das aktuellste Update eines Datensatzes in einer Message vorgehalten, eine Message mit einem veralteten Datensatz wird automatisch aus der Messagebox entfernt und braucht nicht eingelesen zu werden,

Der Speicherbedarf ist gering, da das Verfahren mit nur zwei Messages SS1 , SS2 pro Messagebox auskommt

Bei weiteren bevorzugten Ausführungsformen gibt es z.B. genau einen Sendertask und 1 bis n viele Empfängertasks (n 2 1). Bei weiteren bevorzugten Ausführungsformen steht, insbesondere nach einer Initialisierung der Messagebox und erstmaligen Beschreiben einer Message SS1 zu jedem Zeitpunkt immer eine Message zum Empfangen und Lesen und immer eine zum Beschreiben und Versenden zur Verfügung. Die Messagebox ist deshalb nie leer und nie voll.

Bei weiteren bevorzugten Ausführungsformen wird das Beschreiben inklusive Versenden einer Message durch Aufruf einer entsprechenden Messageboxfunktion ausgeführt, entsprechend der ersten Programmfunktion F1 (Fig. 4B), den der Sendertask durchführt. Dieser Aufruf hat bei weiteren bevorzugten Ausführungsformen weder ein aktives Warten noch eine Suspendierung (Überführung in einen Sleep-Zustand) des Sendertasks zur Folge (z.B. weil die Messagebox voll ist). Ist der Aufruf der ersten Programmfunktion F1 abgearbeitet, stehen die dabei gespeicherten Daten VD1, VD2, VD3 anschließend sofort für einen möglichen Empfang durch einen Empfängertask zur Verfügung.

Bei weiteren bevorzugten Ausführungsformen erfolgt das Empfangen inklusive Lesen einer Message durch Aufruf einer entsprechenden Messageboxfunktion, entsprechend der zweiten Programmfunktion F2 (Fig. 4B), den ein Empfängertask durchführt. Dieser Aufruf hat bei weiteren bevorzugten Ausführungsformen weder ein aktives Warten noch eine Suspendierung des Empfängertasks zur Folge, z.B. weil die Messagebox leer ist. Ist der Aufruf abgearbeitet, hat der Empfängertask die gelesenen Daten lokal vorliegen.

Bei weiteren bevorzugten Ausführungsformen ergibt ein Lesen z.B. mittels der zweiten Programmfunktion F2, insbesondere unmittelbar nach einer Initialisierung der Mailbox bzw. Datenstruktur DS, wenn noch kein Speichern in die Mailbox bzw. Datenstruktur z.B. mittels der ersten Programmfunktion F1 erfolgt ist, genullte Daten.

Bei weiteren bevorzugten Ausführungsformen bekommt ein auf die Messagebox (Datenstruktur DS) zugreifender Empfängertask die Message zum Lesen bereitgestellt, die zuletzt versendet wurde („last is best“). Ist die Senderate höher als die Empfangsrate, dann hat dies lediglich zur Konsequenz, dass nicht alle versendeten Messages auch empfangen und gelesen werden. „Last is best“ is bei weiteren bevorzugten Ausführungsformen für eine Taskkommunikation in Steuergeräten in den meisten Fällen ausreichend oder sogar gefordert.

Dementsprechend „veraltet“ eine zum Lesen bereitgestellte Message bei weiteren bevorzugten Ausführungsformen genau zu dem Zeitpunkt, zu dem der Sendertask die jeweils andere Message in der Messagebox nach erfolgtem Beschreiben versendet hat.

Bei weiteren bevorzugten Ausführungsformen bekommt für ein erneutes Beschreiben und Versenden der Sendertask jeweils die zuletzt veraltete Message zur Verfügung gestellt unabhängig davon, ob diese Message gelesen wurde oder nicht.

Bei weiteren bevorzugten Ausführungsformen kann die Messagebox bzw. Datenstruktur DS nicht volllaufen: Es steht immer eine Message (Speicherstruktur SS1, SS2) für erneutes Beschreiben und Versenden zur Verfügung.

Nachfolgend sind Aspekte weiterer bevorzugter Ausführungsformen in Tabellenform aufgeführt, wobei jede Tabelle eine erste (linke) Spalte aufweist, die eine natürlich Zahl größer Null aufweist, welche eine Programmcodezeile definiert, und wenigstens eine weitere (rechte) Spalte, die von der ersten Spalte durch ein Leerzeichen getrennt ist und Programmcode bzw. Kommentare aufweist, und wobei Tabelle 1 u.a. beispielhafte Definitionen von Werten und Datentypen und Datenstrukturen aufweist, Tabelle 2 beispielhafte Deklarationen von Programmfunktionen aufweist, Tabelle 3 beispielhaft die Anlage von Datensätzen charakterisiert, Tabelle 4 beispielhaft eine Haupt-Programmfunktion u.a. zur Initialisierung charakterisiert, Tabelle 5 beispielhaft eine Hilfs- Programmfunktion zum Kopieren von Daten charakterisiert, Tabelle 6 beispielhaft eine Programmfunktion zur Initialisierung einer Datenstruktur gemäß bevorzugten Ausführungsformen charakterisiert, Tabelle 7 beispielhaft eine Programmfunktion zum Lesen von Daten charakterisiert, Tabelle 8 beispielhaft eine Programmfunktion zum Schreiben und Senden von Daten charakterisiert, Tabelle 9 beispielhaft eine Programmfunktion zum Senden von Daten charakterisiert. Die Tabellen geben eine beispielhafte Implementierung von weiteren bevorzugten Ausführungsformen an, die beispielsweise mit einem quelloffenen Programmierwerkzeug zur Softwareentwicklung auf einem Personal-Computer verwendbar ist.

Eine Detailbeschreibung der betreffenden Programmfunktionen ist nach den Tabellen aufgeführt.

[ — Beginn der Tabelle 1—]

1 #include <stdio.h>

2 #define ENTER '\n'

3 #define TRUE 1

4 #define FALSE 0

5

6 typedef charTdat;

7

8 typedef struct {

9 int updCtr; /* Zähler für Schreibzugriffe auf Datensatz */

10 Tdat *datPtr; /* Zeiger auf Datensatz */

11 } Tmsg;

12

13 typedef struct {

14 Tmsg *rdPtr;

15 T msg *wrPtr;

16 Tmsg msg1;

17 Tmsg msg2;

18 } Tmbox;

19

20 typedef struct {

21 int x;

22 int y;

23 int z;

24 } Tpoint;

25

[ — Ende der Tabelle 1—] [ — Beginn der Tabelle 2—]

26 void copy(Tdat *, Tdat *, int);

27

28 /* Deklarationen der API-Funktionen */

29 void initMbox(Tmbox *, Tdat *, Tdat *, int);

30 void readMsgMbox(Tmbox *, Tdat *, int);

31 void writeSendMsgMbox(Tmbox *, Tdat *, int);

32 Tdat* getWrMsgMbox(Tmbox *);

33 void sendMsgMbox(Tmbox *);

34

[ — Ende der Tabelle 2—]

[ — Beginn der Tabelle 3—]

35 /* Messagebox und Datensätze anlegen */

36 Tmbox mbox; /* Messagebox */

37 Tpoint p1 , p2; /* Datensätze für Messagebox */

38

39

[ — Ende der Tabelle 3 — ]

[ — Beginn der Tabelle 4 — ]

40 int main() {

41 Tpoint myPoint = {0,0,0};

42 Tpoint myPointReadln;

43 Tpoint *p;

44

45 char ch;

46 int i;

47

48 /* Messagebox initialisieren */

49 initMbox(&mbox, (Tdat *) &p1, (Tdat *) &p2, sizeof(Tpoint));

50

51 /* zur Kontrolle einiesen und ausgeben */

52 readMsgMbox(&mbox, (Tdat *) &myPointReadln, sizeof(Tpoint));

53 printf("\nEingelesene Daten aus Messagebox nach Init: x= %d, y= %d, z= %d \n\n\n", 54 myPointReadln.x, myPointReadln.y, myPointReadln.z);

55

56

57 for (i=1 ;i<10;i++) {

58

59 /* myPoint neu berechnen */

60 myPoint.x += i;

61 myPoint.y += i;

62 myPoint.z += i;

63 printf(" myPoint neuberechnet : x= %d, y= %d, z= %d \n", myPoint.x, myPoint.y, myPoint.z);

64

65 if (i<6)

66 {

67 /* Alternative 1 (beispielhaft):

68 * Zeiger auf Message geben lassen mittels API-Funktion getWrMsgMbox,

69 * dann Message über Zeiger beschreiben und

70 * mittels API-Funktion sendMsgMbox versenden */

71 p = (Tpoint *)getWrMsgMbox(&mbox); /* Zeiger auf Write-Message holen */

72 p->x = myPoint.x; /* x-Wert in die Message schreiben */

73 p->y = myPoint.y; /* x-Wert in die Message schreiben */

74 p->z = myPoint.z; /* x-Wert in die Message schreiben */

75 sendMsgMbox(&mbox); /* Message versenden */

76 } eise

77 {

78 /* Alternative 2 (beispielhaft):

79 * Message mitels API-Funktion writeMsgMbox beschreiben und versenden */

80 writeSendMsgMbox(&mbox, (Tdat *) &myPoint, sizeof(Tpoint));

81 }

82

83 printf("\n Messagebox beschrieben %d.Mal \n", i);

84

85 p = (Tpoint *) mbox.msgldatPtr;

86 printf(" msg1 : updCtr = %d, x= %d, y= %d, z= %d \n", mbox.msgl .updCtr, p-

>x, P->y, p->z);

87 p = (Tpoint *) mbox.msg2.datPtr;

88 printf(" msg2: updCtr = %d, x= %d, y= %d, z= %d \n", mbox.msg2.updCtr, p-

>x, P->y, p->z);

89

90 if (mbox.rdPtr == &mbox.msg1) printf(" mbox.rdPtr zeigt auf msg1 \n");

91 if (mbox.rdPtr == &mbox.msg2) printf(" mbox.rdPtr zeigt auf msg2 \n");

92 if (mbox.wrPtr == &mbox.msg1) printf(" mbox.wrPtr zeigt auf msg1 \n");

93 if (mbox.wrPtr == &mbox.msg2) printf(" mbox.wrPtr zeigt auf msg2 \n");

94

95 p = &myPointReadln;

96 readMsgMbox(&mbox, (Tdat *) p, sizeof(Tpoint)); /* aus Messagebox zurücklesen */

97 printf(" Ruecklesen nach Beschreiben ergibt: x= %d, y= %d, z= %d \n", p->x, p->y, p->z);

98

99 printf(" . type ENTER . \n");

100 ch = getchar();

101 }

102

103 while ((ch = getchar()) == ENTER) break;

104

105 return (0);

106 }

[ — Ende der Tabelle 4 — ]

[ — Beginn der Tabelle 5 — ]

107 /* . Hilfsroutinen . */

108 void copy(Tdat *src, Tdat *dst, int size) {

109 for (int i = 0; i < size; i++) {

110 *dst++ = *src++;

111 }

112 }

113 [ — Ende der Tabelle 5—]

[ — Beginn der Tabelle 6—]

114 /* . API für Messagebox

115 void initMbox(Tmbox *p, Tdat *dPtr1, Tdat *dPtr2, int size) {

116 p->wrPtr = &(p->msg1); /* Schreibzeiger initialisieren: zeigt auf msg1 */

117 p->rdPtr = &(p->msg2); /* Lesezeiger initialisieren: zeigt auf msg2 */

118 p->msg1.datPtr = dPtrl; /* init. msgldatPtr: zeigt auf 1. bereitgestellten Datensatz */

119 p->msg2.datPtr = dPtr2; /* init. msg2.datPtr: zeigt auf 2. bereitgestellten Datensatz */

120 p->msg2.updCtr = p->msg1.updCtr = 0; /* Update-Zähler mit 0 initialisieren */

121

122 /* Beide Datensätze mit 0 initialisieren */

123 for (int i = 0; i < size; i++) {

124 *dPtr1++ = 0;

125 *dPtr2++ = 0;

126 }

127 }

128

[ — Ende der Tabelle 6 — ]

[ — Beginn der Tabelle 7 — ]

129 void readMsgMbox(Tmbox *p, Tdat *datPtr, int size) {

130 Tmsg *rdPtr;

131 int *cPtr;

132 int updCtr;

133

134 do {

135 rdPtr = p->rdPtr; /* Lesezeiger lokal Zwischenspeichern */

136 updCtr = rdPtr->updCtr; /* Update-Zähler lokal Zwischenspeichern */

137 cPtr = &(rdPtr->updCtr); /* Zeiger auf Update-Zähler speichern */

138

139

140 /* (beispielhaft, optional) hier ggf. "fence" einfügen */

141 142 copy(rdPtr->datPtr, datPtr, size); /* Auslesen aus Messagebox und Schreiben nach datPtr */

143

144 } while (updCtr != *cPtr); /* Check auf parallelen Schreibzugriff */

145 }

146

[ — Ende der Tabelle 7—]

[ — Beginn der Tabelle 8—]

147 void writeSendMsgMbox(Tmbox *p, Tdat *datPtr, int size) {

148 Tmsg *wrPtr;

149

150 wrPtr = p->wrPtr; /* Schreibzeiger Zwischenspeichern */

151 wrPtr->updCtr++; /* signalisiert erneuten Schreibzugriff */

152

153 /* sync(); ** hier optional „fence“ (Speicherbarriere) einfügen */

154 copy(datPtr, wrPtr->datPtr, size); /* Beschreiben der Messagebox */

155

156 /* Swap von Lese- und Schreibzeiger */

157 p->wrPtr = p->rdPtr; /* der nächste Schreibzugriff erfolgt auf bisher zum Lesen verwendeten Datensatz */

158 p->rdPtr = wrPtr; /* ab jetzt Lesezugriff auf den neu beschriebenen Datensatz */

159 }

160

161 Tdat* getWrMsgMbox(Tmbox *p) {

162 Tmsg *wrPtr = p->wrPtr; /* Schreibzeiger Zwischenspeichern */

163 wrPtr->updCtr++; /* signalisiert erneuten Schreibzugriff */

164 return (wrPtr->datPtr);

165 }

166

[ — Ende der Tabelle 8 — ]

[—Beginn der Tabelle 9 — ]

167 void sendMsgMbox(Tmbox *p)

168 { 169 Tmsg *wrPtr = p->wrPtr; /* Schreibzeiger Zwischenspeichern */

170

171 /* Swap von Lese- und Schreibzeiger */

172 p->wrPtr = p->rdPtr; /* der nächste Schreibzugriff erfolgt auf bisher zum Lesen verwendeten Datensatz */

173 p->rdPtr = wrPtr; /* ab jetzt Lesezugriff auf den neu beschriebenen Datensatz */

174 }

175

[ — Ende der Tabelle 9—].

Nachfolgend ist eine Detailbeschreibung der vorstehend in Tabellenform aufgeführten Programmfunktionen gemäß weiteren bevorzugten Ausführungsformen angegeben.

Die main-Funktion ab Zeile 40 (Tabelle 4) ist beispielhaft zum Testen vorgeschlagen und repräsentiert die Rolle einer Applikation (z.B. Computerprogramm PRG2, Fig. 3), die die Funktionen der Tabellen 1 bis 9 aufruft. Bei weiteren bevorzugten Ausführungsformen können die Funktionen der Tabellen 1 bis 9 bzw. die Programmfunktionen F1, F2 auch in Form eines API (Application Programming Interface, Programmierschnittstelle) bereitgestellt werden.

In den Zeilen 6 bis 18 werden die für eine Messagebox benötigten Datentypen definiert. Eine Message wird als Datenstruktur vom Typ Tmsg in den Zeilen 8 bis 11 definiert und enthält als Elemente einen Zeiger „datPtr“ auf einen Datensatz beliebiger Struktur und Länge (daher lediglich als Zeiger auf char vereinbart, siehe Definition des Typs Tdat in Zeile 6) sowie einen sogenannten Update- Zähler „updCtr“, der mit jedem neuen Beschreiben der Message hochgezählt wird.

In den Zeilen 13 bis 18 wird der Datentyp Tmbox für die eigentliche Messagebox definiert. Eine Messagebox besteht demnach aus den Elementen msg1 und msg2 vom Typ Tmsg, also aus zwei Messages, sowie aus einem Element „rdPtr“, dem Zeiger auf die Message, die für Lese-Operationen verwendet wird, und einem Element „wrPtr“, dem Zeiger auf die Message, die für Schreib- Operationen genutzt wird.

Bei weiteren bevorzugten Ausführungsformen entspricht die Datenstruktur DS gemäß Figur 2A somit zumindest in etwa der Programmcodestruktur Tmbox aus Zeile 18 der Tabelle 1, wobei die Speicherstrukturen SS1, SS2 zumindest in etwa den Strukturen msg1, msg2 aus Zeile 16, 17 entsprechen, wobei die Integervariable updCtr aus Zeile 9 zumindest in etwa den Zählern C1, C2 entsprechen.

Die Definition der von einer Applikation PRG2 benötigten Messageboxen inklusive der für jede Messagebox benötigten zwei Datensätze (je einen pro Message) ist Sache der Applikation PRG2. Sie nutzt dazu den zur Verfügung gestellten Datentyp Tmbox und optional indirekt auch die Datentypen Tmsg und Tdat.

Die API-Funktion initMbox (Tabelle 6, Zeile 115 bis 127) dient zur Initialisierung einer Messagebox. Dazu bekommt sie als Argumente die Adresse der Messagebox (Argument p), die Adressen der beiden Datensätze (Argumente dPtrl und dPtr2) und die Größe der Datensätze (Argument size) übergeben. Initialisiert werden die beiden Zeigerelemente wrPtr und rdPtr, indem sie mit den Adressen der Messagebox-Elemente msg1 und msg2 beschrieben werden. Die Elemente msg1 und msg2 werden ihrerseits initialisiert: Die Zähler msg1. updCtr und msg2. updCtr werden auf Null gesetzt und die Zeiger msgl.datPtr und msg2.datPtr werden mit den Adressen der beiden Datensätze (dPtrl und dPtr2) beschrieben. Zuletzt werden noch mittels der for-Schleife ab Zeile 123 diese beiden Datensätze mit Null beschrieben.

Die API-Funktion readMsgMbox (Tabelle 7, Zeile 129 bis 144) dient zum Einlesen der Daten einer Message aus einer Messagebox in einen Speicherbereich, den die aufrufende Applikation bereitstellt. Sie entspricht somit zumindest in etwa der zweiten Programmfunktion F2 (Fig. 4B) gemäß weiteren bevorzugten Ausführungsformen.

Die Funktion readMsgMbox erhält als Argumente die Adresse der Messagebox (Argument p), einen Zeiger auf einen Speicherbereich, auf den die Daten der Message kopiert werden sollen (Argument datPtr) und die Größe des zu kopierenden Datensatzes (Argument size) übergeben. In den Zeilen 135 bis 137 werden zunächst der Lese-Zeiger rdPtr (dieser zeigt auf die zum Lesen zu verwendende Message in der Messagebox) und Inhalt und Adresse des Update- Zählers updCtr der zu lesenden Message lokal zwischengespeichert. Anschließend werden mittels der Kopierroutine copy die Messagedaten auf den Speicherbereich der Applikation kopiert. Zuletzt wird in Zeile 143 geprüft, ob gegebenenfalls während des Einlesens der Message diese zum Beschreiben nicht nur freigegeben sondern auch genutzt wurde. Dazu wird der aktuelle Wert des Update-Zählers der Message mit dem vor dem Einlesen zwischengespeicherten Wert verglichen. Ist er unverändert, dann sind die eingelesenen Daten gültig. Hat er sich zwischenzeitlich geändert, dann wurde oder wird die Message zum Beschreiben verwendet und die enthaltenen Daten sind u.U. nicht mehr gültig bzw. inkonsistent. In diesem Fall können bevorzugt die Anweisungen der Zeilen 135 bis 142 wiederholt werden. Dies wird mit der in Zeile 134 beginnenden und in Zeile 143 endenden do-while-Schleife erreicht. Insbesondere wird bei dieser Wiederholung der Lesezeiger neu aus der Messagebox eingelesen und damit auf den aktuellsten Stand gebracht: Er zeigt dann (wieder) auf die aktuell zum Lesen freigegebene Message und nicht auf eine zum Schreiben freigegebene bzw. genutzte Message. Nach wiederholtem Message-Einlesen kann bevorzugt auch die Prüfung des Update-Zählerwerts erneut durchgeführt werden.

Die API-Funktion writeSendMsgMbox (Zeile 146 bis 158) dient zum Beschreiben und Versenden einer Message aus einer Messagebox. Sie entspricht somit zumindest in etwa der ersten Programmfunktion F1 (Fig. 4B) gemäß weiteren bevorzugten Ausführungsformen. Dazu bekommt die Funktion writeSendMsgMbox als Argumente die Adresse der Messagebox (Argument p), die Adresse des zu versendenden Datensatzes (Argument datPtr) und die Größe dieses Datensatzes (Argument size) übergeben. In der Zeile 149 wird zunächst der Schreibzeiger auf die aktuell zum Beschreiben freigegebene Message lokal zwischengespeichert und anschließend in Zeile 150 der Update-Zähler für diese Message inkrementiert. Dies signalisiert, dass diese Message für ein Einlesen nicht mehr verwendet werden soll und ggf. bereits eingelesene Daten zu verwerfen sind (siehe oben Ausführungen zur API-Funktion readMsgMbox). Abhängig vom verwendeten Zielsystem und/oder Compiler kann optional der Einschub einer Speicherbarriere (auch englisch „fence“ genannt) vorgesehen sein, siehe Kommentar in Zeile 152. Damit wird der Compiler angewiesen, kein Re-Ordering von Lese- und Schreibanweisungen über diese Barriere hinweg vorzunehmen: Dies stellt sicher, dass die Inkrementierung des Update-Zählers in jedem Fall vor dem Beschreiben der Message stattfindet, Compileroptimierungen dürfen in diesem Fall bevorzugt daran nichts ändern.

In Zeile 153 werden mit Hilfe der Kopierroutine copy der zu schreibende Datensatz in die Message kopiert. Die Zeilen 156 und 157 enthalten nun die Operationen, die dem Versenden der Message entsprechen: Die Inhalte von Lese- und Schreibzeiger der Messagebox werden ausgetauscht („geswapt“): Damit wird die neu beschriebene Message zum Lesen freigegeben und die zuvor zum Lesen bereitgestellte Message wird zum erneuten Beschreiben freigegeben und damit dem Lesezugriff entzogen. Die Verwendung der API-Funktionen getWrMsgMbox (Zeilen 160 bis 164) und sendMsgMbox (ab Zeile 166) erlauben der Applikation, die Vorgänge „Message beschreiben“ und „beschriebene Message versenden“ getrennt und unabhängig voneinander durchführen und dabei direkt auf die zu versendende Message schreiben zu können. Sie können alternativ zur writeSend-MsgMbox-Funktion verwendet werden.

Die Funktion getWrMsgMbox bekommt als Argument die Adresse der Messagebox übergeben. Die Funktion inkrementiert zu Beginn den Update- Zähler der aktuell zum Schreiben freigegebenen Message und signalisiert damit, dass diese Message nun zum Beschreiben verwendet wird. Anschließend gibt sie den Zeiger auf den zu beschreibenden Datensatz zurück. Die aufrufende Applikation kann mittels dieses Zeigers direkt auf den Datensatz der Message schreiben.

Die Funktion sendMsgMbox dient dazu, die so beschriebene Message zu versenden, d.h. zum Lesen freizugeben. sendMsgMbox bekommt dazu als Argument ebenfalls die Adresse der Messagebox übergeben. Das Versenden erfolgt wieder wie oben bereits beschrieben durch Vertauschen der Inhalte von Lese- und Schreibzeiger der Messagebox (Zeilen 171 und 172). Die vorstehend beispielhaft unter Bezugnahme auf die Tabellen 1 bis 9 beschriebene Beispielimplementierung soll der Erläuterung weiterer bevorzugter Ausführungsformen dienen, sie ist insbesondere nicht beschränkend auszulegen.

Bei weiteren bevorzugten Ausführungsformen kann vorgesehen sein, ein Abprüfen einer oder mehrere der vorstehend beschriebene Zeiger auf Null-Werte vorzunehmen, bevor die Zeiger wie beschrieben verwendet werden.

Bei weiteren bevorzugten Ausführungsformen kann die copy-Funktion anstelle eines byteweisen Kopierens ein blockweises Kopieren vorsehen, z.B. nach Art einen memcpy()-Funktion gemäß der C++-Programmiersprache.

Bei weiteren bevorzugten Ausführungsformen können die Funktionen writeSendMsgMbox und/oder readMsgMbox auch vorsehen, den übergebenen Parameter „size“ auf einen gültigen Wertebereich zu prüfen, insbesondere auf das Überschreiten eines vorgebbaren Maximalwerts, der z.B. eine maximale Speichergröße für die zu speichernden Daten (*datPtr, s. Zeile 10) charakterisiert.

Figur 6 zeigt schematisch ein Zeitdiagramm gemäß weiteren bevorzugten Ausführungsformen. Gezeigt ist ein erster Task T1 einer Applikation PRG2 (Fig. 3), wobei die Applikation z.B. eine Funktionssoftware eines Airbag-Steuergeräts repräsentiert, die auf einem Multicore-System 300 (Fig. 3) ablauffähig ist und eine asynchrone Datenkommunikation zwischen mehreren Tasks T1, T2, T3 umfasst, die unter Nutzung des Prinzips gemäß den Ausführungsformen mittels der Datenstruktur DS (Fig. 2A), auch bezeichnet als „Messagebox“ und der Programmfunktionen F1 (Speichern bzw. Senden), F2 (Lesen bzw. Laden bzw. Empfangen) möglich ist.

Der erste Task T1 speichert mittels der ersten Programmfunktion F1 (Fig. 4B) periodisch Daten in die Datenstruktur DS. Dies wird nachfolgend auch als das Senden von Daten in die Messagebox DS bezeichnet. Das Senden von Daten in die Messagebox DS erfolgt z.B. in einem ersten Zeitbereich t_1, wobei Pfeil a1 einen Start des Sendens (also Aufruf der ersten Programmfunktion F1) angibt, und wobei Pfeil a2 ein Ende des Sendens (also Ende der ersten Programmfunktion F1) angibt. Weitere Sendevorgänge erfolgen zu den Zeitbereichen t_4, t_7, t_10, s. auch die Pfeile a3, a4; a5, a6; a7, a8, wobei das Senden bzw. Speichern alternierend in die erste Speicherstruktur SS1 (entsprechend der „ersten Nachricht MSG1“) und die zweite Speicherstruktur SS2 (entsprechend der „zweiten Nachricht MSG2“) erfolgt. Während der Zeitbereiche t_1, t_4, t_7, t_10 sollte bei weiteren bevorzugten Ausführungsformen bevorzugt nicht lesend auf die betreffende, geschriebene Nachricht bzw. die entsprechende Speicherstruktur zugegriffen werden.

Dies kann bei weiteren bevorzugten Ausführungsformen durch das weiter oben beschrieben Vertauschen der Inhalte von Lese- und Schreibzeiger RDPTR, WRPTR erfolgen.

Der zweite Task T2 greift während der Zeitbereiche t_2, t_6 mittels der zweiten Programmfunktion F2 lesend auf die Messagebox DS zu, wobei im Zeitbereich t_2 die erste Message MSG1 (Speicherstruktur SS1) und im Zeitbereich t_6 die zweite Message MSG2 (Speicherstruktur SS2) gelesen wird. Start und Ende des Lesens werden jeweils durch die Pfeile a9, a10, a13, a14 angegeben.

Der dritte Task T3 greift während der Zeitbereiche t_4, t_6 (Pfeile a11, a12), t_6, t_10, t_11 (Pfeile a15, a16, a17, a18) mittels der zweiten Programmfunktion F2 lesend auf die Messagebox DS zu, wobei in den Zeitbereichen t_2, t_6 die erste Message MSG1 (Speicherstruktur SS1) und in den Zeitbereichen t_6, t_10, t_11 die zweite Message MSG2 (Speicherstruktur SS2) gelesen wird. Dabei fällt das Ende a12 des Lesezugriffs in einen Zeitbereich t_5, in dem die erste Message prinzipiell wieder beschreibbar ist, da der vorangehende Speichervorgang mit dem Pfeil a4 abgeschlossen worden ist. Gleichwohl sind die Daten in dem Zeitbereich t_5 noch aus der ersten Message MSG1 auslesbar, bis zu dem neuerlichen Beschreiben der ersten Message MSG1 durch den ersten Task T1, vgl. Pfeil a5.

Demgegenüber ist die Lesedauer D durch den dritten Task T3 zwischen den Pfeilen a15, a16 zu lang, vergleichen das Blitzsymbol, weil vor dem Abschluss a16 des Lesens bereits der erste Task T 1 wieder Daten in die zweite Message MSG2 schreibt, vgl. Pfeil a7. Dies kann bei weiteren bevorzugten Ausführungsformen durch einen Ablauf gemäß Fig. 5E (oder z.B. Zeile 144 des Programmcodes aus Tabelle 7) erkannt werden. Demgemäß wird weiteren bevorzugten Ausführungsformen folgend erneut ein Lesevorgang ausgeführt (Schritt 278 aus Fig. 5E), vgl. Pfeile a17, a18, diesmal auf die erste Message MSG1.

Der Zeitbereich t_3 repräsentiert einen Zeitbereich, in dem in die zweite Message MSG2 geschrieben werden könnte („ready to write“), ebenso wie der Zeitbereich t_8. Der Zeitbereich t_11 repräsentiert einen Zeitbereich, in dem in die erste Message MSG1 geschrieben werden könnte („ready to write“). Auch ein Lesen während dieser Zeitbereiche t_3 (MSG2), t_8 (MSG2), t_11 (MSG1) ist möglich. Der Zeitbereich t_9 repräsentiert einen Zeitbereich, in dem die erste Message MSG1 gelesen werden kann.

Das Prinzip gemäß den bevorzugten Ausführungsformen ermöglicht eine besonders speichereffiziente und einfache, jedoch flexible asynchrone Kommunikation zwischen unterschiedlichen Tasks und/oder Rechenkernen eines Computers.

Nachstehend sind weitere vorteilhafte Aspekte gemäß weiteren bevorzugten Ausführungsformen aufgeführt.

Ist TL die Dauer eines Lesezugriffs auf die Messagebox und ist DSmin der minimale (z.B. durch eine Systemauslegung sichergestellte) zeitliche Abstand zwischen zwei Schreibvorgängen (Ende Schreiben bis Beginn folgendes Schreiben) auf die Messagebox, dann kann das Verfahren gemäß weiteren bevorzugten Ausführungsformen ermöglichen bzw. gewährleisten, dass jeder Lesezugriff, egal zu welchem Zeitpunkt er durchgeführt wird, immer „unbehelligt“ durch einen Schreibzugriff erfolgt, sofern für die Dauer des Lesezugriffs TL < DSmin gilt. „Unbehelligt“ bedeutet gemäß weiteren bevorzugten Ausführungsformen nicht nur, dass die eingelesenen Daten konsistent und aktuell sind, es bedeutet insbesondere auch, dass das Timing nicht beeinflusst wird: Ein Lesevorgang muss gemäß weiteren bevorzugten Ausführungsformen also nicht warten, bis ein zeitgleich stattfindender Schreibvorgang abgeschlossen ist. In einem Multicore-System kann gemäß weiteren bevorzugten Ausführungsformen also z.B. ein Core (Rechenkern) auf die Messagebox schreiben, während zeitgleich und unbehelligt davon ein oder mehrere andere Cores aus der Messagebox lesen. Bei weiteren bevorzugten Ausführungsformen kann eine Systemauslegung sicherstellen, dass TL < DSmin, vorzugsweise immer, eingehalten wird. Dauert ein Lesevorgang doch einmal länger (TL >= DSmin, verursacht z.B. durch Überlastung des Systems), kann es zu einem parallelen Schreibzugriff auf den

Puffer kommen, der gerade eingelesen wird. Die Lesefunktion erkennt diesen Fall bei weiteren bevorzugten Ausführungsformen jedoch und startet ein erneutes Einlesen aus der Messagebox mit Wechsel auf den nun aktuell gültigen Lesepuffer. Damit ist auch in diesem Fall die Konsistenz der eingelesenen Daten sichergestellt, es gibt aber einen Einfluss auf das Timing: Der Lesezugriff wird verlängert.