25.10.2016, 18:21
Hallo liebe Community,
ich habe ein Problem bei der Übergabe von Daten zwischen LabView und meiner Speicherimplementierung als Library Function Node (dll). Kurz zum Aufbau: es laufen in zwei parallelen while-Schleifen Aufnahme- und Ausgabe-Tasks, zwischen diesen sollen Daten ausgetauscht werden. Zunächst wird für diesen Austausch ein Speicherbereich (Ringspeicher) initialisiert. Beim Lesen&Schreiben werden Datenpointer verwendet, beim Schreiben wird der Array Data Pointer (Input von Node) verwendet um eine Kopie in den Speicher anzulegen, beim Lesen wird ein Array Data Pointer (Input von Node) von LabView genutzt und in diesen werden die Daten dann aus dem Speicher übertragen (Output von Node).
Ein Debuggingreport hat ergeben, dass scheinbar des öfteren unzulässige Pointer wie 0x00000000 und 0xFFFFFFFF übergeben werden. Fehlerbild ist leider etwas schwer zu beschreiben, da LabView entweder sich selbstständig schließt/abstürzt oder eine bug registriert, versucht zu debuggen, dann zum schließen auffordert. Problem ist, dass die Abstürze völlig willkürlich erscheinen, manchmal nach längeren Betrieb (eher selten), manchmal beim schließen der Tasks (nicht beim ersten Aufruf), manchmal bei der Initialisierung (nicht beim ersten Aufruf). Zudem scheint meist der erste Lauf keine Abstürze zu erzeugen, sondern erst bei neuem Aufruf des VIs. Es scheint als würde mein angelegter Speicher in den von LabView eingreifen und damit Fehler erzeugen. Hat jemand Erfahrung mit der Speicherverwaltung von LabView und kann sagen, wann ein Speicher den Pointer 0x00000000 oder 0xFFFFFFFF erhalten würde? Zusätzlich die Frage, ob ein Shiftregister/globale Variablen immer feste Adressen haben oder dynamisch verwaltet werden? Idee war, dass evtl. LabView den Array Data Pointer vorzeitig auf unzulässige Werte setzt wenn die dll versucht die Daten zu holen.
Zusatz: Speicher ohne Aufnahme- und Ausgabe-Task funktioniert -scheinbar- ohne Probleme. Erst wenn die Tasks hinzukommen stürzt LabView ab.
Ich bin über jede Hilfe dankbar!
ich habe ein Problem bei der Übergabe von Daten zwischen LabView und meiner Speicherimplementierung als Library Function Node (dll). Kurz zum Aufbau: es laufen in zwei parallelen while-Schleifen Aufnahme- und Ausgabe-Tasks, zwischen diesen sollen Daten ausgetauscht werden. Zunächst wird für diesen Austausch ein Speicherbereich (Ringspeicher) initialisiert. Beim Lesen&Schreiben werden Datenpointer verwendet, beim Schreiben wird der Array Data Pointer (Input von Node) verwendet um eine Kopie in den Speicher anzulegen, beim Lesen wird ein Array Data Pointer (Input von Node) von LabView genutzt und in diesen werden die Daten dann aus dem Speicher übertragen (Output von Node).
Ein Debuggingreport hat ergeben, dass scheinbar des öfteren unzulässige Pointer wie 0x00000000 und 0xFFFFFFFF übergeben werden. Fehlerbild ist leider etwas schwer zu beschreiben, da LabView entweder sich selbstständig schließt/abstürzt oder eine bug registriert, versucht zu debuggen, dann zum schließen auffordert. Problem ist, dass die Abstürze völlig willkürlich erscheinen, manchmal nach längeren Betrieb (eher selten), manchmal beim schließen der Tasks (nicht beim ersten Aufruf), manchmal bei der Initialisierung (nicht beim ersten Aufruf). Zudem scheint meist der erste Lauf keine Abstürze zu erzeugen, sondern erst bei neuem Aufruf des VIs. Es scheint als würde mein angelegter Speicher in den von LabView eingreifen und damit Fehler erzeugen. Hat jemand Erfahrung mit der Speicherverwaltung von LabView und kann sagen, wann ein Speicher den Pointer 0x00000000 oder 0xFFFFFFFF erhalten würde? Zusätzlich die Frage, ob ein Shiftregister/globale Variablen immer feste Adressen haben oder dynamisch verwaltet werden? Idee war, dass evtl. LabView den Array Data Pointer vorzeitig auf unzulässige Werte setzt wenn die dll versucht die Daten zu holen.
Zusatz: Speicher ohne Aufnahme- und Ausgabe-Task funktioniert -scheinbar- ohne Probleme. Erst wenn die Tasks hinzukommen stürzt LabView ab.
Ich bin über jede Hilfe dankbar!