Hallo zusammen,
ich versuche aktuell unter VB6 Zugriffe auf eigene Hardware durchzuführen, die über PCI-Express im PC verbunden ist.
Was aktuell funktioniert ist der Schreibzugriff vom PC auf die Hardware mittels der API-Funktion memcopy und VarPtr:
Private Declare Sub memcopy Lib „kernel32“ Alias _
„RtlMoveMemory“ (ByVal Destination As Long, ByVal _
Source As Long, ByVal Length As Integer)
…
memcopy(VarPtr(Hardware), VarPtr(Variable), Länge)
…
==> Kopiert den Inhalt der Adresse von Variable an die Adresse der Hardware.
Der Lesezugriff erfolgt ähnlich, ich kopiere von der Adresse der Hardware zur Adresse meiner Variable und führe damit Lesen über die PCIe-Schnittstelle durch.
Letzteres hat allerdings den Nachteil, dass der Prozessor dafür verantwortlich ist, die Daten von der Einsteckkarte zu sich zu kopieren und damit der Datendurchsatz zu gering ist.
Was ich jetzt versucht habe ist die Hardware als Master zu haben und von dort auf die Variablenadresse im PC zu schreiben. Dazu übergibt der Prozessor die mittels VarPtr erhaltene Adresse der Zielvariable. In der Hardware schreibe ich dann mittels PCIe auf die Adresse dieser Variablen.
Leider funktioniert das ganze so nicht. Ich kann zwar die Adresse der Zielvariablen übertragen, allerdings sehe ich nicht, dass nach dem Schreiben der Hardware dort der neue Wert steht.
Ich gehe davon aus, das liegt darin, dass meine Zielvariable nur im Cache steht oder im paged memory auf das ich von der Hardware aus keinen Zugriff habe.
Und jetzt die Frage:
Wie kann ich eine Variable dazu bringen, dass sie entweder im non-paged Bereich steht (z.B. unter WinXP) oder der Prozessor erkennt, dass die Variable nicht gecachet werden darf?
Ich stelle mir etwas vor das äquivalent ist zu Variablen, die in C deklariert werden und dort als nicht cachebar deklariert werden (leider ist mir gerade der genaue Name entfallen, sorry.)
Irgendjemand eine Idee dazu?
Vielen Dank schon im voraus,
Martin