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
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?
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.
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
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.
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.
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
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-
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.
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.
>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
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)
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?