Datenübergabe die 2te



  • Horst2 schrieb:

    ok, habe den alten beitrag gelesen.
    meiner meinung nach ließe sich das am einfachsten über dll's realisieren, so dass du dann am ende für jedem Treiber eine extra dll hast

    Dann hast du dir den Beitrag aber nicht gut genug durchgelesen. Schon im Startbeitrag steht, dass es sich um DOS handelt und nicht um Windows! D. h. DLLs fallen weg (leider). Ansonsten wäre das natürlich die beste Möglichkeit. Darum hab ich auch im anderen Thread vorgeschlagen, das ganze mit einem Interrupt zu lösen.

    @larsen
    Ich frag mich immer noch, warum du einen Ringpuffer verwenden willst. Das mach für mich in dem Fall keinen Sinn. Deine Datensätze stehen doch in einer Datei, warum machst du es nicht so, wie ich es dir vorgeschlagen habe. Erstelle zusätzlich eine Indexdatei drüber (für schnelleren Zugriff) und übergib deiner driver.exe nur noch die Position und Länge des Datensatzes in der Datei.
    In welchem von den zwei Programmen wolltest du eigentlich den Ringpuffer anwenden?

    Wie man einen Ringpuffer verwendet, kannst du dir in diesem Thread mal anschauen: http://www.c-plusplus.net/forum/viewtopic.php?t=45173&start=0&postdays=0&postorder=asc&highlight=
    Außerdem kannst du damit auch noch erfahren, wie man mit Interrupts umgeht.



  • ich danke für eure Ideen, werd mir den Thread mal ansehen.

    @ AJ: Ich hatte mich auch schon mit Deiner Idee angefreundet, aber mein Betreuer hat mir da einen Strich durch die Rechnung gemacht. Er hat das so erklärt: Man hat einen externen Taktgeber, welcher Interrupts liefert. Bei jedem Interrupt wird ein Zähler im main-programm um 1 erhöht. Ein Datensatz sieht nun so aus:

    2 byte Zeit (z.B. 15 ticks), 2 byte Länge (z.B. 10 byte), dann der Datensatz (z.B. 10 byte).

    Wenn also die Zeit erreicht ist (die 15 ticks von dem Taktgeber), dann geht ein Signal zur driver-datei, die sich daraufhin den ersten Datensatz schnappt, der im Speicher steht. Das soll möglichst schnell passieren, weshalb mein Betreuer bei der Idee mit der Index-Datei skeptisch war 😉 .
    Nun brauche ich aber mehrere Datensätze im Speicher, von denen ich vorher nicht genau weiß wie lang sie sind und in welchen zeitlichen Abfolgen sie gesendet werden sollen. Deshalb der Puffer. Diese ganzen Aufgaben in der main-datei zu bündeln ist nun meine Vorgabe. Wie gesagt, an der main-datei soll niemand mehr etwas rumfummeln müssen. Wenn ich die Datensätze von der driver-datei auslesen lassen würde, dann müsste ich ja die Zeitaufgabe auch in der driver-datei erledigen. Da kann ich ja gleich alles in eine Datei schreiben und müsste das für jedes Bussystem einzeln implementieren. Ein Puffer ist halt die schnellste Möglichkeit, oder?

    @TGGC: Haha. Ich dachte so ein Forum ist zum Fragen stellen da. Habe ich irgendeinen Kodex verletzt oder warum muss ich mir sowas anhören?

    VG, larsen



  • Weil du danach gefragt hast.

    Bye, TGGC (Der Held lebt!)



  • larsen schrieb:

    Habe ich irgendeinen Kodex verletzt oder warum muss ich mir sowas anhören?

    Weil TGGC generell gerne trollt.



  • @larsen
    Ignorier TGGC einfach.

    Das ganze ist also etwas komplizierter. Durch deinen ersten Thread war ich der Annahme, dass deine Datensätze fest in einer Datei stehen. Wenn du allerdings deine Datensätze von einem Gerät oder ähnlichem bekommst, dann ist das was anderes.

    Erklär mal bitte nochmal genau wie das ablaufen soll.
    Du hast eine Schnittstelle, die Daten liefert (Datensätze). Dann hast du noch ein Programm, dass diese Datensätze auswertet bzw. weiterreicht und ein drittes Programm (driver.exe), dass auch was mit den Datensätzen macht.
    Erklär am besten mal, welche Aufgaben von den unterschiedlichen Stellen (Programmen, Schnittstellen) erledigt werden sollen und wann was zum Tragen kommt.

    Ich denke, dass es immer noch am besten wäre, wenn die Funktionalität deiner driver.exe durch einen Interrupt aufgerufen werden könnte. Du könntest der Funktion, die dahinter steckt, dann die Adresse deines Speicherbereichs übergeben und um wieviele Datensätze es sich handelt. Oder du müsstest ihr bei einem Ringpuffer sogar die Positionen (bis zu welchem Index steht was drin und bis zu welchem Index wurde das letzte mal gelesen) übermitteln.



  • AJ schrieb:

    @larsen
    Ignorier TGGC einfach.

    Das versperrt ihm aber den Weg zu höherer Erkenntnis. 😎

    Bye, TGGC (Der Held lebt!)



  • TGGC schrieb:

    AJ schrieb:

    @larsen
    Ignorier TGGC einfach.

    Das versperrt ihm aber den Weg zu höherer Erkenntnis. 😎

    Bye, TGGC (Der Held lebt!)

    Aber auch nur wenn du mehr dazu beitragen würdest die "höhere" Erkenntnis weiterzugeben.



  • morgen Jungs,

    also nochmal, ich hoffe ich kriege das jetzt so hin, wie ich mir das denke:

    Datentelegramme für Feldbussysteme bestehen aus langen Reihen von Nullen und Einsen (können bis zu 260 byte groß sein). Ich habe ein Programm, welches solche Datentelegramme erzeugt und binär in einer Datei speichert (data.xx), und zwar nach dem von mir beschriebenen Schema (Zeit, Länge, Datentelegramm). Für meine Aufgabe gehe ich davon aus, dass dieses Programm schon existiert. Also ist mein Ausgangspunkt eine Datei (data.xx).

    Dann habe ich ein Programm (main.exe), das ich starte, die entsprechende Busart auswähle (Profibus, CAN-Bus, etc.). Die Telegramme sind je nach Busart verschieden, auch verschieden lang. Wie lang die sind, weiß ich also noch nicht, wenn ich das Programm starte. Das main-Programm liest die ersten (vielleicht 10 oder so) Datensätze aus und schreibt sie irgendwohin, merkt sich, wohin und wartet. Wenn es dann losgeht, wird extern ein Taktgeber gestartet. Der liefert Interrupts an das main-Programm, welches intern einen Zähler erhöht und diesen mit der Zeit des entsprechenden Datensatzes vergleicht. Wenn diese Zeit dann erreicht ist, bekommt driver (je eine andere driver für jede Busart) ein Signal von main zusammen mit der Adresse des entsprechenden Datensatzes, liest den Datensatz aus dem Speicher und macht etwas damit. Wenn driver.exe erfolgreich war, bekommt main. exe ein Signal und schmeißt daraufhin den gesendeten Datensatz aus dem Speicher, lädt einen neuen Datensatz und das Ganze geht von vorn los. Mehrere Datensätze im Speicher verhindern, dass ich was senden muss, aber main noch nicht fertig ist mit laden.

    Wenn ich diesen Speicher als Ringpuffer realisiere, dann habe ich ja den Vorteil, dass ich nur den aktuellen Zeigerort weiterreichen muss. Wenn z.B. mein Datensatz 4 byte lang ist, ich aber am Ende des Puffers nur 2 byte habe und am Anfang 2 byte, kann ich den Datensatz trotzdem reinschreiben. Wie ein Ring halt, ohne Anfang und Ende.

    Sorry, falls ich mich unklar ausgedrückt haben sollte, ich hoffe es ist diemal klar geworden.

    VG, larsen



  • ich habe mal ein wenig überlegt, und da mir der Ringpuffer in der Realisierung unsymphatisch ist, versuche ich es jetzt mit einer Warteschlange. Ich nehme also eine verkettete Liste und hänge mehrere Datensätze hintereinander. Ein Zeiger zeigt immer auf das erste Element (FIFO), und genau das brauche ich ja auch. Wenn z.B. der erste Datensatz gesendet worden ist, dann lösche ich ihn, erkläre das 2. Element zum ersten und hänge hinten ein neues Element an. Gibt es da Probleme mit dem Speicher? Ich denke eigentlich nicht, da ich ja nach dem Löschen den nicht mehr benötigten Speicher wieder freigebe. Liege ich mit meiner Vermutung richtig?



  • Wenn du den Speicher, wie du ja schreibst, wieder freigibst, dann dürfte es keine Probleme mit dem Speicher geben. Ansonsten würdest du sog. Speicherleichen erzeugen und über kurz oder lang könntest du keinen Speicher mehr reservieren, weil der Speicher voll ist (von den Speicherleichen).


Anmelden zum Antworten