Forum: FPGA, VHDL & Co. PC104 mit ISA-Bus: DMA auf Interupt-IO umstellen - WindowsXP schnell genug?


von Bronco (Gast)


Lesenswert?

Hallo zusammen,

in unserer Firma gibt es ein älteres Gerät, auf dem ein ADC über ein 
CPLD (Altera MaxII EPM570) und einen ISA-Bus an eine PC104-CPU-Karte mit 
Windows XP angeschlossen ist.
Es werden kontinuierlich ~240kByte/s übertragen.
Dazu wurde bisher DMA verwendet und im CPLD war nur ein wenig Bus-Logik 
drinn.

Nun wurde die PC104-CPU-Karte abgekündigt und der Nachfolger hat kein 
DMA mehr. Jetzt darf ich herausfinden, ob man das auch ohne DMA lösen 
kann, ohne die Hardware zu ändern.

Mein Ansatz wäre folgender:
Im CPLD einen FIFO einbauen und über einen Interrupt die CPU triggern.
Leider kann ich im EPM570 nicht viel Speicher für den FIFO realisiseren, 
ich gehe mal von 128 bis 256 Bit aus. Das wären gerade mal 8 bis 16 
16Bit-Worte. Bei meiner Datenrate könnte ich damit 66µs bis 133µs 
puffern.

Was ich nun gar nicht einschätzen kann ist, ob es unter Windows XP 
möglich ist, die Daten in diesem Zeitfenster abzuholen. Der CPLD würde 
ja einen Interrupt erzeugen und ein Treiber o.ä. unter Windows XP müßte 
dann "zeitnah" die Daten holen.
Leider hab ich im Netz gar keine Anhaltspunkte gefunden, über was für 
Interrupt-Latenzen wir bei Windows sprechen. Man liest zwar immer von 
mangelnder Echtzeitfähigkeit, aber gilt das auch für Treiber mit einem 
Hardware-Interrupt?

Hat jemand irgendwelche Infos oder Ideen?

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Das kommt mir sehr bekannt vor, wir haben einen EPM1270, der den 
16bit-DMA eines PC104-Rechners (unter Linux) benutzt, der ist jetzt auch 
abgekündigt. Es gibt allerdings noch Nachfolger (adlinktech/Lippert).

Wir übertragen jeweils bis zu 6 (oder 7?) 16bit-Worte mit bis zu 
50k/sec, bei der nächsthöheren Stufe 62,5k fällt dann jedes 2.Datenpaket 
unter den Tisch.
Ein Umbau auf andere Übertragung über den alten ISA-Bus ist nicht mehr 
geplant, da würde man eher über PCIe oder ähnliches neueres gehen. 
Leider ändern sich die Schnittstellen alle paar Jahre, wenn man ein 
langfristiges Produkt hat ist PC-Technik nicht ideal.

von Programmierer (Gast)


Lesenswert?

Bei der geringen Datenrate könntest du auch einen Mikrocontroller mit 
USB Unterstützung und einigem an internem RAM nehmen, und sogar über USB 
Full Speed übertragen. Das funktioniert dann sowohl auf alten WinXP 
Rechnern als auch auf moderner PC Hardware ohne ISA, und du bist das 
ganze uralte Zeug los...

von Hans-Georg L. (h-g-l)


Lesenswert?

Seit dem 80386 und dem movs Befehl braucht man eigendlich keine "alte" 
ISA DMA für Memory transfers mehr. Das Problem ist wahrscheinlich ein 
passenden Treiber für Win XP und deine Karte zu finden. Selbst schreiben 
geht natürlich immer ;)

von Lattice User (Gast)


Lesenswert?

Programmierer schrieb:
> Bei der geringen Datenrate könntest du auch einen Mikrocontroller mit
> USB Unterstützung und einigem an internem RAM nehmen, und sogar über USB
> Full Speed übertragen. Das funktioniert dann sowohl auf alten WinXP
> Rechnern als auch auf moderner PC Hardware ohne ISA, und du bist das
> ganze uralte Zeug los...

Gibt es schon fertig:

http://arstech.com/install/ecom-prodshow/usb2isar.html

von Programmierer (Gast)


Lesenswert?

Lattice User schrieb:
> Gibt es schon fertig:
Klar, aber warum überhaupt ISA und nicht ganz normal USB?? Gibt ja auch 
diverse Datenacquise-Systeme von NI usw., gibt eigentlich wenig Grund 
das selber zu entwickeln...

von Lattice User (Gast)


Lesenswert?

Programmierer schrieb:
> Lattice User schrieb:
>> Gibt es schon fertig:
> Klar, aber warum überhaupt ISA und nicht ganz normal USB??

Weil er dis ISA Karte schon hat. Und:
Bronco schrieb:

> Jetzt darf ich herausfinden, ob man das auch ohne DMA lösen
> kann, ohne die Hardware zu ändern.
>

Eine komplette Neuentwicklung der Hardware dauert und stellt auch ein 
Risiko dar. Eine fertige USB->ISA Bridge ist der Aufwand geringer. 
Software muss natürlich trozdem angepasst werden.

Kosten/Nutzen Analyse macht dann sein Chef.

von Frank K. (fchk)


Lesenswert?

Bronco schrieb:

> Leider hab ich im Netz gar keine Anhaltspunkte gefunden, über was für
> Interrupt-Latenzen wir bei Windows sprechen. Man liest zwar immer von
> mangelnder Echtzeitfähigkeit, aber gilt das auch für Treiber mit einem
> Hardware-Interrupt?

Natürlich. Da muss das ganze System mitspielen. Wenn Du einen 
PIO-IDE-Treiber hast, der beim Lesen/Schreiben eines Sektors per REP 
INSW/REP OUTSW die Interrupts abstellt, dann bist Du davon natürlich 
betroffen. Alles schon erlebt.

fchk

von -gb- (Gast)


Lesenswert?

Ich würde da einen UART ran bauen und das schön seriell mit USB dann in 
den PC bringen. Gibt durchaus UARTs die 921600 Baud können.

von Jens P. (picler)


Lesenswert?

Bronco schrieb:
> Es werden kontinuierlich ~240kByte/s übertragen.

> Bei meiner Datenrate könnte ich damit 66µs bis 133µs puffern.

-gb- schrieb:
> Ich würde da einen UART ran bauen und das schön seriell mit USB dann in
> den PC bringen. Gibt durchaus UARTs die 921600 Baud können.

240kByte sind aber ca. 2,4MBaud.

@ TE: Die 240kByte klingen im PC-Bereich nach nicht viel, wenn sie aber 
von außerhalb kommen und verlustfrei eingelesen werden müssen ist das 
schon eine Hausnummer. Ungefähr 0,1 ms Pufferzeit ist unter Windows gar 
nichts. Windows hat typischerweise Latenzzeiten von 50-100ms und mehr, 
selber hatte ich schon mal mit fast 1 Sekunde zu kämpfen.

Die einzig sinnvolle Lösung sehe ich darin, die ADC-Daten parallel auf 
einen großen µC mit massig Puffer zu geben und dann mittels USB auf den 
PC zu übertragen. Wobei da "Full Speed" schon knapp werden dürfte. 
Eventuell könnte man die Daten vor der Übertragung im µC packen und im 
PC wieder auspacken. Alternativ einen µC mit USB-HiSpeed nehmen...

: Bearbeitet durch User
von Christoph db1uq K. (christoph_kessler)


Lesenswert?


von Bronco (Gast)


Lesenswert?

Hallo zusammen,

erstmal vielen Dank für die ganzen Anregungen.

Nachdem ich ein Lösungskonzept mit µC (als Puffer) und USB ausgearbeitet 
hatte, kam jetzt die Anforderung, dass die Latenz "im 
Millisekundenbereich" liegen soll.
Ich hab im Versuch auf USB z.T. Latenzen im 100ms-Bereich gesehen...

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
Noch kein Account? Hier anmelden.