Forum: Mikrocontroller und Digitale Elektronik Shared Memory programmieren


von gast (Gast)


Lesenswert?

hallo zusammen,

das Thema "shared memory" ist ganz neues für mich.
Ich habe ein Programmm für Mikrocontroller in C geschrieben, das jedes 
0,5 ein String senden, die Antwort möchte ich auf einem "shared memory" 
speichern und bereit für das Auslesen stellen.

Das problem ist: ich weiss nicht womit ich anfangen soll, ich habe die 
allgemeine Definition in wikipedia gelesen aber gibt es leider keine 
Information über die Programmierung.

Auf alle Hinweise bin ich sehr dankbar

von Peter (Gast)


Lesenswert?

shared memory ist zum datenaustausch zwischen 2 laufenden Programmen auf 
den gleichen Rechner gedacht.

Wenn jetzt dein Programm auf dem µC läuft mit wem willst du dort dann 
daten austauschen?

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:
> hallo zusammen,
>
> das Thema "shared memory" ist ganz neues für mich.
> Ich habe ein Programmm für Mikrocontroller in C geschrieben, das jedes
> 0,5 ein String senden, die Antwort möchte ich auf einem "shared memory"
> speichern und bereit für das Auslesen stellen.

Ich denke du wirfst hier Begriffe durcheinander.
Shared Memory ist Speicher der von mehreren Tasks (die üblicherweise in 
unterschiedlichen CPU's ausgeführt werden) erreichbar ist. Es kann auch 
sein, dass man sowas braucht, wenn man nur eine CPU hat aber mehrere 
Prozesse, weil einem das Betriebssystem zu Recht einen Riegel 
vorschiebt, wo man zugreifen darf und wo nicht.

Was du brauchst klingt nach einem ganz banalem globalen Buffer. Also 
einer globalen Variablen.

von gast (Gast)


Lesenswert?

hallo,

Die Daten sind zwischen Mikrocontroller und CPU getauscht.

ich will keinen normalen Buffer programmieren. Ich möchte gern, dass die 
Ergebnisse von mehreren Prozessen erreichbar sind.

In meinen Fall habe ich mehrere Prozesse aber nur eine CPU.
Mein Programm besteht aus zwei Teilen. Einerseits sende ich 
verschiedenen String und die Antwort sind in einem Ringbuffer 
gespeichert.Anderseits habe ich ein Timer Konfiguriert, der Parallel zum 
Hauptprogramm läuft aber sende ein bestimmter String und die Antwort auf 
diesem String möchte ich von anderen Ergebnissen unterscheiden,deswegen 
habe ich an dem "shared Memory"
gedacht.

danke

von Karl H. (kbuchegg)


Lesenswert?

Welche CPU, welches Betriebssystem, welcher Compiler?

Solche Dinge wie shared memory sind hochgradig von diesen drei 
"Umgebungsvariablen" abhängig. C an sich hat dafür kein Konzept. Daher 
hast du auch bei Wikipedia nichts Konkretes gefunden. Du hättest im 
Manual deines Compilers nachsehen sollen.


> Mein Programm besteht aus zwei Teilen. Einerseits sende ich
> verschiedenen String und die Antwort sind in einem Ringbuffer
> gespeichert. Anderseits habe ich ein Timer Konfiguriert, der
> Parallel zum Hauptprogramm läuft aber sende ein bestimmter String
> und die Antwort auf diesem String möchte ich von anderen
> Ergebnissen unterscheiden, deswegen habe ich an dem
> "shared Memory" gedacht.

Das hört sich für mich überhaupt nicht schlüssig an.
Klingt für mich eher nach: Ich habe mich da in eine Sackgasse manövriert 
und jetzt hol ich mir eine "Wunderwaffe" die mach da wieder rausholt.
Ich kann mich aber auch irren, die Beschreibung ist ein wenig dürftig.

von Bastler (Gast)


Lesenswert?

Was du meinst ist eine globale Variable bzw. "extern" .
...so hab ich das mal interpretiert.

von Naja (Gast)


Lesenswert?

Es ist relativ schwer für jeden Einzelfall eine wirklich scharfe 
Trennung zwischen den Konzepten vorzunehmen. Aber ein wesentlicher Punkt 
in Deinem Fall ist, ob hier ein essentielles Problem durch "shared 
Memory" gelöst wird.

Das ist sozusagen das selbe Problem wie die Unterscheidung zwischen 
Strategie und Taktik. Was in dem einen Fall Strategie ist (Shared 
Memory) ist in dem anderen Fall Taktik (globale Variablen). In beiden 
Fällen wird Speicher "geteilt", aber nur im ersteren nennt man das auch 
"geteilten Speicher". Ähnlich ist der Unterschied zwischen "Prozess" und 
"Funktion" (im C Sinne). Zwei nach einander ablaufende Funktionen 
(Taktik) sind nicht grundsätzlich zwei verschiedene "Prozesse".

Nach Deiner Beschreibung ist das eigentliche Problem die zeitliche bzw. 
kausale Koordinierung zweier Prozesse, genauer zweier 
Kommunikationsabläufe.
"Shared Memory" ist eine Vorrichtung/Methode zum Datenaustausch.
Aber Du hast ein Problem mit dem "Kontrollfluss", kein 
Kommunikationsproblem.

von gast (Gast)


Lesenswert?

hallo Karl,

es geht um ein ETRAX Soc der Firma Axis es besteht aus dem ETRAX 100LX 
MCM mit 16MB SDRAM, 4MB FLASH und 10/100 Mbit/s Ethernet. Das ganze 
läuft unter Linux Betriebsystem.
Ich benutze C-Compiler und der Mikrocontroller ist AT90CAN128.
Der Mikrocontoller ist über serielle Schnittstelle mit der CPU(ETRAX) 
verbindet.

Danke

von Tim S. (maxxie)


Lesenswert?

Dann gibt es keinen geteilten Speicher (zwischen den uC und dem Etrax)

Hier hilft dir, wenn du ein parrallel arbeitendes Programm aufbauen 
willst MPI (message passing interface) oder der Aufbau eines einfache 
Client-Server Protokolls-

von gast (Gast)


Lesenswert?

hallo,
das heißt, dass es nicht möglich ein shared memory in C für einen 
Mikrocontroller zu programmieren ist?

von Karl H. (kbuchegg)


Lesenswert?

Nein, das heißt es nicht.

Das heißt das eine der wesentlichen Voraussetzungen bei dir nicht 
existiert: Das beide Rechner auf den gemeinsamen Speicher auch zugreifen 
können. Du hast keine Hardware die das könnte!

Shared Memory ist Speicher, der 2 Busanbindungen besitzt. Zb eine 
Grafikkarte und die Haupt-CPU. Derselbe Speicher taucht in den 
Adressräumen beider 'Rechner' auf. Sowohl die Grafikkarte als auch die 
Haupt-CPU können in denselben Speicher schreiben/lesen.

Das hast du nicht. Alles was du hast ist eine popelige 
Kommunikationsverbdinung. Also benutzte sie, denk dir ein Protokoll aus 
und implementiere die Komm-Schnittstelle die einen Datenaustausch der 
beiden ermöglicht.
Zb. indem der eine Rechner dem anderen eine Nachricht schickt: Parameter 
xyz hat sich auf diesen Wert verändert. Beide Rechner verfügen dann über 
denselben Satz an Parametern und wenn einer etwas verändert, informiert 
er den anderen über diese Änderung.

Ist zb eine Möglichkeit.


Der Unterschied ist in etwa so wie beim Schachspielen:
2 Spieler sitzen vor demselben Schachbrett und machen Züge. Das 
Schachbrett ist das 'shared memory' der beiden Spieler.
Nur: Du hast diesen Fall nicht. Du hast den Fall dass die beiden per 
Telefon Schach spielen. Und anstatt dir eine Notation auszudenken, wie 
die beiden Züge über Telefon austauschen können während 'gleichzeitig' 
die Damen des Hauses Kochrezepte austauschen, versuchst du einen Weg zu 
finden, wie beide Spieler nach wie vor nur 1 Schachbrett benutzen 
können, obwohl sie 600km voneinander entfernt sind.
(OK, der Vergleich hinkt ein wenig, aber so schlecht ist er auch nicht)

Was das alles aber mit ...
> In meinen Fall habe ich mehrere Prozesse aber nur eine CPU.
> Mein Programm besteht aus zwei Teilen. Einerseits sende ich
> verschiedenen String und die Antwort sind in einem Ringbuffer
> gespeichert.Anderseits habe ich ein Timer Konfiguriert, der Parallel zum
> Hauptprogramm läuft aber sende ein bestimmter String und die Antwort auf
> diesem String möchte ich von anderen Ergebnissen unterscheiden,

... zu tun haben soll, ist mir immer noch nicht klar. Was du da 
beschreibst ist simples Message-Passing, wobei in der Message enthalten 
ist, welcher Programmteil an welchen anderen Programmteil im anderen 
Rechner eine Nachricht schickt. Oder die Messages enthalten Kennungen, 
die sie identifizieren oder .... da gibt es soviele Möglichkeiten, wie 
man das machen kann abhängig vom konkreten Fall.

von P. S. (Gast)


Lesenswert?

Vergiss einfach erst mal den Begriff "shared memory". Keine Ahnung, wo 
du den aufgeschnappt hast, aber du bist fern davon zu verstehen, was er 
bedeutet und wie sowas funktioniert. Vieleicht solltest du erst mal 
einfachere Sachen angehen und gruendlich C lernen. Auch eine serielle 
Kommunikation zwischen 2 Applikationen ist nichts fuer Anfaenger.

von gast2 (Gast)


Lesenswert?

>das heißt, dass es nicht möglich ein shared memory in C für einen
>Mikrocontroller zu programmieren ist?

Doch, das ist möglich! Aber irgendwie versteht keiner so wirklich, was 
du genau vorhast.

Wenn du einen Prozessor(ETRAX ) über die serielle Schnittstelle mit 
einem anderen Prozessor(AT90CAN128) verbindest. Hast du einen 
Datenaustausch über eine seriele Schnittstelle und nicht über ein shared 
memory. Dafür brauchst du einen Speicher (z.B. ein Dual Port Ram) auf 
den beide Prozessoren zugreifen können.

Oder willst du in deinem AT90CAN128 intern Daten über ein shared memory 
austauschen

von gast (Gast)


Lesenswert?

danke Karl,ich kappiere langsam.

von gast (Gast)


Lesenswert?

hallo Gast2,
ist der zweite Vorschlag möglich?

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:
> hallo Gast2,
> ist der zweite Vorschlag möglich?

Klar ist der möglich.
Nur nennt man das dann nicht shared memory sonder schlicht und 
ergreifend 'globale Variablen'.

(Ich geh mal davon aus, dass im AT90CAN128 kein Betriebssystem läuft, 
sondern du auf der nackten Hardware programmierst)

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

gast schrieb:
> es geht um ein ETRAX Soc der Firma Axis es besteht aus dem ETRAX 100LX
> MCM mit 16MB SDRAM, 4MB FLASH und 10/100 Mbit/s Ethernet. Das ganze
> läuft unter Linux Betriebsystem.

Da laufen dann mehrere Prozesse die alle auf die selben Daten (in Deinem 
Fal der Ringbuffer) zugreifen sollen? Ja, was wäre Shared Memory. Wie Du 
diesen implementierst, ist aber eine andere Sache. Eventuell über einen 
dritten Prozess (eine Art Datenbank), der seine Anweisungen über named 
Pipes bekommt.

> Ich benutze C-Compiler und der Mikrocontroller ist AT90CAN128.
> Der Mikrocontoller ist über serielle Schnittstelle mit der CPU(ETRAX)
> verbindet.

Dieser Prozessor hat nichts mit Deinem Problem zu tun, sondern 
beantwortet lediglich die ihm übergebenen Strings. Sehe ich das richtig?

von gast (Gast)


Lesenswert?

alles klar Karl und danke für Deine Geduld

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.