Forum: PC-Programmierung 44 Khz Routine unter Win2k ohne DMA ! möglich ??


von Stephan Müller (Gast)


Lesenswert?

Hallo!


Ich arbeite momentan intensiv an meiner Studienarbeit und habe eine ISA
Karte
gebastelt mit einem 8Mhz µC (68HC12) und will nun diese Karte mit
Sounddaten füttern in einer Geschwindigkeit von mind. 44,1 Khz (über
den ISA Bus natürlich).
Ich habe mich schon etwas mit der Treiberprogrammierung
auseinandergesetzt,
jedoch ist mir das Schreiben eines Soundtreibers (Kernel Streaming),
der ja
den DMA Controller anspricht, etwas zu anspruchsvoll und vor allem
zeitaufwendig.

Deshalb die Frage an euch: Kann ich das Problem umgehen (vereinfachen)
indem ich einen Trick anwende und den PIT auf eine höhere Basisfrequenz
programmiere (ich weiss wie das geht) und dann auf die WinAPI Funktion
SetTimer() zurückgreife, die ja standardmäßig nur bis zu 1ms
einstellbar ist ?? (ich geh mal davon aus dass SetTimer() über IRQ0
gesteuert wird)
Nachteil: Sehr benutzerunfreundlich da ganzes Betriebssystem um Faktor
44 schneller läuft :P (wäre mir aber im schlimmsten falle egal)

Oder den Prozessortakt auslesen (geht das über CLK_TCK ? siehe time.h
??)
und dann ein manuelles delay programmieren in abhängigkeit des Taktes
?

Oder habe ich da unter Windows 0 chance ohne DMA egal wie ichs
hinbieg...

was meint ihr ??

MFG
Stephan

von Rufus T. Firefly (Gast)


Lesenswert?

Nein, keine Chance.

Den Systemtimer kannst Du nicht umprogrammieren, das lässt das OS nicht
zu.
Auch Delay ist keine gute Idee - W2K ist ein Multitasking-OS, das Dir
hinterrücks die Rechenzeit wegnehmen wird.
Selbst wenn dieser Ansatz möglich wäre, über den zum Ansteuern Deiner
Hardware erforderlichen Devicetreiber verfügst Du?

Dein Hardwaredesign ist das grundlegende Problem.
Um timingkritische Hardwarezugriffe zu entkoppeln, wird in solchen
Fällen Fifo-Hardware verwendet; der PC kann am Stück größere
Datenblöcke in den Hardwarepuffer schreiben, den am anderen ende der µC
mit einer ihm genehmen Geschwindigkeit ausleert.
Nähme man beispielsweise 1 kByte-Blöcke, dann müssten diese knapp 50
mal pro Sekunde übertragen werden, was wesentlich unproblematischer zu
realisieren ist (Ich gehe hier jetzt vereinfachend von
8-Bit-Monosamples aus).

Ein Beispiel für just Deine Anwendung wurde vor etlichen Jahren mal in
der Zeitschrift elrad veröffentlicht - das war zu der Zeit, zu der
elrad noch im Heise-Verlag erschien. Das muss Anfang der 90er Jahre
gewesen sein oder so.
Unter dem Namen "take 5" wurde eine ISA-Steckkarte als
Selbstbauprojekt vorgestellt, die dem PC eine - damals noch äußerst
unübliche - S/PDIF-Schnittstelle verpasste. Über die konnte mit 44.1
kHz Samplerate aufgenommen und wiedergegeben werden, und das ganze
wurde mit FIFO-Bausteinen vom ISA-Bus entkoppelt.

Prinzipiell:
Auch wenn das ganze eine Studienarbeit ist, halte ich hier einiges für
etwas fragwürdig. Warum wird für den ISA-Bus entwickelt? Den gibt es
doch in kaum noch einem PC, und damit gewonnene Erkenntnisse sind nicht
auf andere Bussysteme umsetzbar.
Außerdem hat der ISA-Bus etliche Probleme - die bei I/O-Zugriffen
erreichbare Datenrate ist nicht besonders hoch, Adressdecodierung ist
ziemlich gurkig (wenn es um 16-Bit-Zugriffe geht, erst recht) und
obendrein ist Interruptsharing aufgrund der hirnverbrannten
Active-High-Interrupts eh' nicht möglich.

Wenn es nur darum geht, Audiodaten zu verarbeiten, wäre die Nutzung
einer eh' vorhandenen Audioschnittstelle sinnvoller - viele PCs
verfügen heutzutage über einen S/PDIF-Ausgang, an dem sich recht
unkompliziert ein 44.1 kHz-16-Bit-Stereosample-Datenstrom abgreifen
lässt.
Geht es sogar nur darum, Daten relativ schnell aus dem PC
'rauszubekommen, wäre eine USB-Lösung mit FT245 angesagt.

Ein grundlegendes Problem vieler Studien-/Diplomarbeiten scheint die
Wahl eines völlig ungeeigneten Hardwareansatzes zu sein, der dann dafür
sorgt, daß keine normale Betriebssystemumgebung verwendet werden kann -
beim ursprünglich geschilderten Ansatz muss das OS effektiv komplett
lahmgelegt werden.

Daß die bei solcher Ansteuerung von Hardware gewonnenen Erkenntnisse
niemals in dieser Form in einem realistischen Produkt umgesetzt werden
könnten, scheint den Betreuern der entsprechenden Arbeiten entweder
völlig egal zu sein oder aufgrund massiver Inkompetenz noch nicht mal
klar zu werden.
Und im Vorfeld unrealistische Hardware- oder Softwareanforderungen zu
erkennen, sollte eigentlich schon zu deren Aufgabenbereich gehören.

von Stephan Müller (Gast)


Lesenswert?

hallo!

erstmal paar sachen vorweg:

- Doch ich habe die Möglichkeit den PIT unter Win2k zu programmieren,
  da ich über einen bereits fertigen treiber verfüge, der mir zugriff
  auf alle IO Ports zulässt. (selbst schon getestet)
- einen Standard IO treiber für die isa karte habe ich moment zwar noch

  nicht, wäre für mich aber noch im bereich des Schaffbaren !
  Den Treiber für Streaming zu erweitern würde mich zu sehr in Zeitnot
  bringen.

Warum ISA ?
- einfacher...

Dass ich überhaupt nichts von dem Wissen über den ISA bus auf andere
Bussysteme wie PCI z.b. übertragen kann kann ich noch nicht beurteilen,
aber finde ich trotzdem etwas übertrieben..

Ich habe mich halt vebockt was das thema angeht, jetzt muss ich halt in
den sauren apfel beissen und das beste draus rausholen !
zumal eine einfache IO karte ohne streaming als studienarbeit für mich
völlig ausgereicht hätte ! (vom umfang her)
Naja mein Prof meinte, dass muss jeder selbst beurteilen ob die aufgabe
ok ist und vor allem für im bereich des Machbaren
steht ...

mfg
Stephan

von Rufus T. Firefly (Gast)


Lesenswert?

Wenn Du darauf bestehst, Dein Hardwarekonzept zu nutzen, was hieltest Du
davon, wie folgt vorzugehen:

Deine Hardware erzeugt einen 44.1 kHz-Interrupt und ein von Dir zu
schreibender Devicetreiber bedient diesen und überträgt aus einem
Puffer Daten an Deine Hardware.

Das erscheint mir sowieso sinnvoller als das Verwenden eines Timers,
weil ja schließlich Deine Hardware eh' am besten weiß, wann sie Daten
benötigt.

Damit dürfte Dein Konzept noch ansatzweise realisierbar sein; Du musst
halt einen Interrupthandler im Devicetreiber programmieren und eine
abartig hohe Interruptrate bedienen - das aber müsstest Du beim
Umficken des Systemtimers auch (Der etwas derbe Begriff ist bewusst
gewählt). Ausserdem ist nicht gewährleistet, daß ein W2K auf einem
Rechner mit derart "übertaktetem" Timer überhaupt sinnvoll laufen
kann - da kann potentiell so einiges schiefgehen, da für den Rechner
plötzlich sämtliche Hardware sehr "träge" zu sein scheint ...

Das bedeutet allerdings, daß Du nicht einfach einen der beliebten
"giveio.sys"-Treiber verwenden kannst, die für den Usermode die
Überwachung von I/O-Zugriffen abklemmen, sondern schon einen echten
Devicetreiber selber programmieren musst - oder aber eine
Softwarekomponente einsetzt, die auch das Programmieren von
Interrupthandlern zulässt.
Ein Beispiel für sowas wäre hier zu finden:
http://www.kithara.de/ge/prod.php?sub=khdw
(Das ist eine in Berlin ansässige Firma, was bei Supportanfragen etc.
wohl von Hilfe sein mag).
Ob es vergleichbares auch im nicht kommerziellen Bereich gibt, entzieht
sich meiner Kenntnis.

Dennoch "schreit" diese Anwendung nach einem Interrupt, der von der
Hardware ausgelöst wird - der Systemtimer liefe ja zwangsweise
asynchron zu Deiner Hardware, was zu Datenverlust oder anderen Probleme
führte.

Die Auswirkung des Gebrauchs eines 10 kHz-Interrupts kannst Du leicht
selber testen - Serielle Schnittstelle auf 115.2 kBit/sec stellen,
Hardware-FIFOs abschalten und Datenübertragung damit machen.
Sollte prinzipiell funktionieren, wenn vielleicht auch etwas wackelig.
Im Performance Monitor kannst Du Dir ja auch die Interruptbelastung des
Systems anzeigen lassen.

von Guard (Gast)


Lesenswert?

http://www.c-plusplus.de/forum/viewtopic.php?t=90362
http://www.c-plusplus.de/forum/viewtopic.php?t=90364

Man kann es auch übertreiben mit Crossposts.

Wenn du schon in mehreren Foren posten willst, dann bitte nacheinander.
Und schreib in deine späteren Beiträge rein, in welchen Foren du bereits
gepostet hast.

von Stephan Müller (Gast)


Lesenswert?

@Guard:
naja ich wollte halt nur die sache beschleunigen und von mehreren
leuten gleichzeitig ein statement bekommen, da ich
möglichst schnell zu einer entscheidung kommen wollte.
Wie heisst es immer beim Bund: "Wir haben doch keine Zeit!" ...
übrigends hab ich bei c-plusplus.de gut unterstützung bekommen als ich
vor nem jahr einen eigenen kernel geschrieben hab...
du bist aber nicht zufällig ein Admin von dort ? fg


@Rufus:
rat mal was ich grade vorschlagen wollte... ;)

der HC12 hat glücklicherweise einen Pulsgenerator, den ich an die
IRQ leitung hängen kann!

Eigentlich dürfte das ohne Probleme in Echtzeit funktionieren,
vorrausgesetzt ich bekomme auch den isa bus mit dieser Frequenz
zur verfügung ohne große delays, die sich dann hörbar bemerkbar machen
würden!

Aber hey! Danke trotzdem nochmal ! :)

mfg

von Rufus T. Firefly (Gast)


Lesenswert?

Noch eine Anmerkung zu Kithara: Deren Tools kann man sich als
30-Tage-Testversion herunterladen; damit man das nutzen kann, muss man
sich einen Lizenzschlüssel zuschicken lassen, was aber problemlos
funktioniert und nicht mehr Informationen als einer einfachen
Email-Adresse bedarf.

von Stephan Müller (Gast)


Lesenswert?

thanks!! find ich voll nett wie du dir da gedanken machst für mich !
:)

ich denke ich hab jetzt genug futter fürs erste was die software
angeht.

mfg

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.