Forum: Mikrocontroller und Digitale Elektronik HDD am uC: PIO oder DMA ?


von Benedikt (Gast)


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 ?

von Rufus T. Firefly (Gast)


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?

von Benedikt (Gast)


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 ?

von Hannes Hering (Gast)


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

von Rufus T. Firefly (Gast)


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.

von Hannes Hering (Gast)


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

von Benedikt (Gast)


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. ?

von Rufus T. Firefly (Gast)


Lesenswert?

Das sollte in der Tat so gehen.

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.