PC104 mit ISA-Bus: DMA auf Interupt-IO umstellen - WindowsXP schnell genug?

Gast #4319472
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?
#4320919
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.
Gast #4321378
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
Gast #4321648
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.
#4322560
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
#4322832
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...
#4322853
Lesenswert?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren