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.
Was du meinst ist eine globale Variable bzw. "extern" . ...so hab ich das mal interpretiert.
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-
hallo, das heißt, dass es nicht möglich ein shared memory in C für einen Mikrocontroller zu programmieren ist?
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?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.