INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Hilfe bei Knotenzugriff



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

29.01.2009, 12:53
Beitrag #1

pimbolie1979 Offline
LVF-Grünschnabel
*


Beiträge: 31
Registriert seit: Jun 2005

2010
2006
kA

23xxx
Deutschland
Hilfe bei Knotenzugriff
Hallo @ all.

Ich habe eine DLL mit dem LabVIEW DLL-Importwizard eingebunden. Nun kann ich auf die DLL-Funktionen zugreifen. Eine Funktion davon ist das kopieren eines Speicherbereichs (von CPU) und einen anderen (Grafikkartenspeicher). Hierzu greife ich mit Hilfe eines Knotens auf die DLL-Funktion "Memcopy" zu. Diese ist wie folgt definiert:

Errot_t Memcopy ( void* dst, const void* src, size_t count)

Nun zu meinem Problem:

Ich habe ein Array mit Werten initialisiert. Nun möchte ich das Array an die Funktion übergeben, jedoch weiß ich nicht was ich beim Knoten einstellen muss. Was muss ich beim Knoten einstellen, damit dies funktioniert?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
29.01.2009, 13:03
Beitrag #2

Y-P Offline
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
LVF-Team

Beiträge: 12.612
Registriert seit: Feb 2006

Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN

71083
Deutschland
Hilfe bei Knotenzugriff
Profil_ergaenzen

Gruß Markus

--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.01.2009, 13:18
Beitrag #3

pimbolie1979 Offline
LVF-Grünschnabel
*


Beiträge: 31
Registriert seit: Jun 2005

2010
2006
kA

23xxx
Deutschland
Hilfe bei Knotenzugriff
So ich habe mein Profil aktualisiert. Ich benutze die LabVIEW-Version 8.6
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.01.2009, 13:19
Beitrag #4

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.692
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Hilfe bei Knotenzugriff
' schrieb:Eine Funktion davon ist das kopieren eines Speicherbereichs (von CPU) und einen anderen (Grafikkartenspeicher).
:huh:Wo hast du denn den Pointer für den Graphikkartenspeicher her? Oder ist das nur ein Pseudospeicher?

Zitat:Errot_t Memcopy ( void* dst, const void* src, size_t count)
Das Array wird direkt als Eingang auf den DLL-Knoten gegeben. Die Parameter (Doppelklick auf Knoten ...) für diesen Eingang heißen dann: Numerisches Array, Basistyp U32, Zeiger auf Datenbereich. Voraussetzung Win32 (kein .Net, kein X64)

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.01.2009, 13:46
Beitrag #5

pimbolie1979 Offline
LVF-Grünschnabel
*


Beiträge: 31
Registriert seit: Jun 2005

2010
2006
kA

23xxx
Deutschland
Hilfe bei Knotenzugriff
Den Pointer für die Grafikkarte bekomme ich über folgende Funktion:

Errot_t Malloc( void** devicePTr, size_t size)

Was mir ein wenig zu denken gibt ist der Datentype des Zeigers. Dieser wird mit void angegeben. Dies kann ich in LabVIEW nicht, sondern ich muss einen Datentype angeben.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.01.2009, 14:01
Beitrag #6

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.692
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Hilfe bei Knotenzugriff
' schrieb:Den Pointer für die Grafikkarte bekomme ich über folgende Funktion:
Errot_t Malloc( void** devicePTr, size_t size)
Nun gut, ich will mal glauben, dass das alles so geht, solange ich das nicht nachvollzogen habe.

Zitat:Was mir ein wenig zu denken gibt ist der Datentype des Zeigers. Dieser wird mit void angegeben. Dies kann ich in LabVIEW nicht, sondern ich muss einen Datentype angeben.
Void bedeutet "untypisiert". Es wird also ein Wert übertragen, von dem nur bekannt ist, dass es ein Pointer ist. Worauf der zeigt - nämlich auf einen Speicher, der einen Typ hat - ist irrelevanrt. Die DLL wird schon alles richtig machen.
In so einem Falle nimmst du U32.

Wobei ich bei void ** (wegen der zwei Sterne) eher skeptisch bin, was LV respektive Datenflussteuerung betrifft. Oder diplomatisch ausgedruckt: Hier musst du besondere Sorgfalt walten lassen z.B. beim Testen.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
29.01.2009, 14:15
Beitrag #7

pimbolie1979 Offline
LVF-Grünschnabel
*


Beiträge: 31
Registriert seit: Jun 2005

2010
2006
kA

23xxx
Deutschland
Hilfe bei Knotenzugriff
Ich hatte es schon mal zum laufen gebracht, so das ich Daten vom PC in die Grafikkarte kopieren konnte, dort eine FFT ausgefüht hatte und diese wieder in den PC-Speicher kopiert hatte. Die FFT, die ich mit LabVIEW gemacht hatte habe ich dann mit der, die auf der Grafikkarte ausgeführt wurde verglichen. Nun wollte ich das ganze vereinfachen, indem ich ein Array nicht erst mit einer DLL auf dem PC allocieren, sondern indem ich ein Array mit LabVIEW initialisiere und dann die Adresse des Arrays übergebe.

LabVIEW zeigt mir jetzt auch keine Fehler mehr an, jedoch ist das Ergebnisarray 0. Also muss noch ein Fehler vorliegen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.01.2009, 14:48
Beitrag #8

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.692
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Hilfe bei Knotenzugriff
' schrieb:Nun wollte ich das ganze vereinfachen, indem ich ein Array nicht erst mit einer DLL auf dem PC allocieren, sondern indem ich ein Array mit LabVIEW initialisiere und dann die Adresse des Arrays übergebe.
Das wäre ja ein Pointer mit der Vorgabe "Zeiger auf Daten".
Das klingt nach C-DLL. Mit C hast du aber die Möglichkeit, mit Pointern zu hantieren, wie du willst. Das geht in LV - glücklicherweise - nicht. Daher sind manche Sachen in LV eben nicht möglich oder nur sehr schwierig.

Ein Problem sind Doppelsterne. Das heißt nämlich: Der Pointer auf das Array wird in einem U32-Speicher abgelegt. Der Pointer auf diesen Speicher wird an die DLL/Graphikkarte übergeben. (Also ein doppelter Pointer). Nur zur Info.

Noch eins: Wenn die DLL in ein LV-Array schreiben soll (also das ohne const), dann musst du am Eingang des DLL-Knotens ein entsprechend großes Array anlegen und am Ausgang die Daten abgreifen!

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
01.02.2009, 09:46
Beitrag #9

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Hilfe bei Knotenzugriff
' schrieb:Nun gut, ich will mal glauben, dass das alles so geht, solange ich das nicht nachvollzogen habe.

Void bedeutet "untypisiert". Es wird also ein Wert übertragen, von dem nur bekannt ist, dass es ein Pointer ist. Worauf der zeigt - nämlich auf einen Speicher, der einen Typ hat - ist irrelevanrt. Die DLL wird schon alles richtig machen.
In so einem Falle nimmst du U32.

Wobei ich bei void ** (wegen der zwei Sterne) eher skeptisch bin, was LV respektive Datenflussteuerung betrifft. Oder diplomatisch ausgedruckt: Hier musst du besondere Sorgfalt walten lassen z.B. beim Testen.

void ** ist ein Pointer auf einen untypisierten Pointer. Der untypisierte Pointer kann in 32 Bit Systemen wie von Dir schon angegeben als 32 Bit (unsigned) Integer behandelt werden. Falls man LabVIEW 8.6 verwendet und RÜckwärtskompatibilität nicht nötig ist kann man auch den neuen LabVIEw 8.6 Parameter Typ "Pointer sized (unsigned/signed) Integer" verwenden. Da es ein Rückgabeparameter ist, (die Funktion gibt diesen Pointer zurück, deshalb der zweite Stern) muss man diesen Parameter noch als "passed by Referenz" definieren was in LabVIEW als "Pass: Pointer to Value" konfiguriert wird.

Man bekommt hier also einen UINT32 zürück und konfiguriert alle anderen Funktionen die diesen Pointer als void * übergeben bekommen ebenfalls in der selben Weise aber dann wegen dem fehlenden zweiten Stern als "Pass: Value".

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Gehe zu: