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