HDD am uC: PIO oder DMA ?

Gast #138998
Lesenswert?

Wie lest ihr die Festplatten mit einem uC von einer Festplatte aus ?
Ganz normal über den Datenport, oder hat es schonmal jemand mit DMA
versucht ?
Bei PIO habe ich nämlich das Problem, dass ich nach jedem Sektor einen
falschen Wert bekomme, da die Festplatte anscheinend eine gewisse Zeit
braucht um neue Daten zu laden. Daher muss ich vor jedem Datenwert Busy
abfragen, was leider alles ziemlich ausbremst.
Mit DMA müsste ich ja diese Probleme nicht haben, oder ?
Gast #138999
Lesenswert?

Statt Busy zu pollen könntest Du auch einen Interrupt auswerten; die
IDE-Schnittstelle sieht das vor.

DMA wirst Du ohne zusätzliche (aufwendige) Hardware nicht realisieren
können. Auch wird der µC schlichtweg nicht schnell genug sein, als daß
das interessant wäre - mit dem klassischen 16-Bit-PIO-Modus lassen sich
16 MByte/sec übertragen. Welcher µC kann -ernsthaft- eine höhere
Datenrate verarbeiten?
Gast #139000
Lesenswert?

Der M16C könnte das.
Bei 24MHz und DMA wären es theoretisch 12MB/s.
Im Moment läuft er eh nur mit 1/4 der 18MHz, da ansonsten das Timing
für das LCD zu schnell wird.

Wie funktioniert das genau mit dem Interrupt ? Irgendwie werde ich aus
den ganzen Diagrammen in den Specs nicht so recht schlau.
Bzw. wann wird ein Interrupt ausgelöst ?
Gast #139001
Lesenswert?

Hallo,

> Bzw. wann wird ein Interrupt ausgelöst?
Soweit ich weiss, wird der Sektor in den Festplattencache geladen und
dann ein Interrupt ausgelöst. Wie hier das Timing ist, weiss ich aber
nicht. Ich würd versuchen, den HDD-IRQ Ausgang mit nem IRQ-Eingang des
Controllers zu verbinden und die Datenabfrage in ner IRQ-Routine
abzuwickeln. Vielleicht gehts ja ...

MFG

Hannes
Gast #139002
Lesenswert?

> Der M16C könnte das.
> Bei 24MHz und DMA wären es theoretisch 12MB/s.

Also ist DMA nicht nötig, da im PIO-Mode bei 16-Bit-Zugriffen (die der
AVR übrigens nicht beherrscht) bereits 16 MByte/sec erreicht werden
können.

Die 12 MByte/sec werden aber auch nur erzielt, wenn die Daten ohne
weitere Verarbeitung weggeworfen werden.
Erscheint mir wenig sinnvoll.

Hannes' Beschreibung des Interrupt-Betriebs ist gar nicht so schlecht.
Gast #139003
Lesenswert?

> Hannes' Beschreibung des Interrupt-Betriebs ist gar
> nicht so schlecht.
Danke! verbeug Ist zumindest nach der Theorie so ... praktisch hab
ich's noch net ausprobiert bzw. ausprobieren können. Aber ich werd's
noch tun! ;)

MFG

Hannes
Gast #139004
Lesenswert?

Ich übertrage immer 4 Sektoren (=1 Cluster) auf einmal.
Ich sende also den Read Sector Befehl, warte bis ein Interrupt kommt
und übertrage dann 1 Sektor, warte dann wieder auf einen Interrupt und
übertrage dann wieder 1 Sektor usw. ?

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