Forum: Mikrocontroller und Digitale Elektronik FAT32 Datenrate mit uC?!


von Andreas Auer (Gast)


Lesenswert?

Hi.

Ich hab jetzt in C auf nem uC und ner CompactFlash FAT32 implementiert.
Ich hab jetzt mal die Datenrate gemessen, indem ich einfach ein File
aus dem Filesytem zyklisch in den selben Buffer ins externe RAM
schreibe.

Bei meiner ersten Version lag meine Datenrate leider nur bei
~65kbits/s. Nachdem ich letzte Nacht das ganze nochmal ein bisschen
optimiert habe, liegt die Rate jetzt bei ~1Mbit/s.
Das ganze läuft auf nem ATMega162 mit 8MHz Quarz.

Was ich eigentlich wissen wollte... Bin ja nicht der erste, der FAT32
implementiert. Vielleicht könnte jemand, der das auch schonmal gemacht
hat, sein Datenrate posten. Dann weiß ich, ob da noch viel drin ist
(bei ~1Mbit/s).

mfg
Andreas

--

Andreas Auer                     aauer1 (at) sbox.tugraz.at
Student of Telematics            http://home.pages.at/aauer1
Graz University of Technology

von Benedikt (Gast)


Lesenswert?

1. Frage: Wiso 1MBit ? Bei CF bekommt man die Daten doch parallel, also
125kByte/s...
2. Was passiert mit den Daten ? Nur lesen und verwerfen, oder
irgenwohin senden ?
3. Verwendest du richtig das FAT System und folgst der Cluster Chain,
oder liest du ab dem Startsektor einfach die Dateigröße an bytes aus ?

von Andreas Auer (Gast)


Lesenswert?

Hi

1. Ob du das jetzt als 125kByte/s oder 1Mbit/s betrachten willst, ist
ja im prinzip egal. Außerdem hört sich 1Mbit/s wesentlich besser als
125kByte/s an!

2. Also ich lese die Daten von der CF und schreib sie ins externe RAM.
Bei einem 2. Lesezyklus werden die Daten einfach wieder überschrieben.
Mir geht es momentan nur ums Lesen der Daten von der CF.

3. Ich verwende richtig das FAT32 System und folge auch der
Clusterchain. Bin ich am Ende vom File gibt mir meine Funktion dann
noch EOF zurück.

mfg
Andreas

--

Andreas Auer                     aauer1 (at) sbox.tugraz.at
Student of Telematics            http://home.pages.at/aauer1
Graz University of Technology

von Benedikt (Gast)


Lesenswert?

Mit einem 8051er mit 22,1184MHz (1,8432MHz CPU Takt) erreiche ich etwa
250kByte mit Clusterchain usw. Die Datei wird dabei in den
Arbeitsspeicher geladen (2MByte)
Allerdings lade ich die FAT Tabelle und das Rootverzeichnis einmal in
den Speicher, um schneller darauf zurgeifen zu können...
Die Software ist in Assembler geschrieben, Dateisystem im Moment
FAT12/FAT16 (8MB, 32MB Karte)

von Thorsten (Gast)


Lesenswert?

Hallo,

ich benutze einen ATmega128 mit internem 8MHz Oszillator und keinem
externen RAM. Die Daten werden von der CF bzw. HD direkt in einen 512
Byte großen Puffer geschrieben, der im internen RAM des ATmega
allokiert ist. Dabei komme ich auf folgende Werte:

0.96 MBit/s bei lesen von CF
1.42 MBit/s bei lesen von HD

Hierbei verwende ich natürlich "richtig" das FAT32 Dateisystem, ich
folge also auch der Cluster-Chain.

Mich würde übrigens interessieren, wie du die CF an den Prozessor
angeschlossen hast. Würdest du mal - sofern vorhanden - einen
Schaltplan posten ?

Gruß
Thorsten

von Andreas Auer (Gast)


Angehängte Dateien:

Lesenswert?

Hi.

Im Anhang ist mein Schaltplan von meinem ATMega162 Board. Ich hab
direkt auf der Platine die CF.
Die Karte läuft im Memory Mapped Mode und ist im externen Memory
Interface des Controllers integriert. Lässt sich also ansprechen, als
wenn es ein externes RAM wäre.

@Benedikt:
250kByte/s sind schon echt gut! Die FAT Table und das Rootverzeichnis
hol ich mir bei jedem Zugriff von der CF.
Die FAT Table ins RAM zu holen wäre auch noch eine Idee (zumindest den
aktuellen Sektor der Table). Dadurch würde sich noch ein bisschen was
an Geschwindigkeit rausholen lassen.

mfg
Andreas

--

Andreas Auer                     aauer1 (at) sbox.tugraz.at
Student of Telematics            http://home.pages.at/aauer1
Graz University of Technology

von Benedikt (Gast)


Lesenswert?

CF ist wohl klar: 8bit Daten, CE\, 3 Adressen, RD\, WR\.
Wie sieht das bei der Festplatte aus ? Die lässt sich nicht im 8bit
Modus betreiben.
Ich mache das über 2x 74HC574 Latches: Eines wird mit 8 bit Daten
beschrieben und beim Senden der Daten an die HDD über OE\ aktiviert.
Das lesen geht umgekehrt: Das Highbyte landet im Latch und wird
anschließend gelesen.

von Thorsten (Gast)


Lesenswert?

Ich hab die 16 Datenleitungen der Platte direkt an PORTA und PORTC
hängen, die gleichen Ports übrigens, die auch für ein externes RAM
vorgesehen sind. Da ich jetzt auch aus Performance Gründen ein externes
RAM vorsehen will, um einen Teil der FAT o. ä. darin zu halten, muß ich
mir mal gedanken machen, wie das realisiert werden kann. Die Platte ist
ja eigentlich auch nichts anderes als ein externes RAM, ich müßte
eigentlich nur entsprechende Chip-Selects erzeugen, oder ?

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Wiso machst du die Schreib/Lesevorgänge selbst ? Der uC kann sowas auch
hardwaremäßig. Dies ist nicht nur einfacher, sondern auch schneller.
Die 16bit sind zwar ein Problem, das man aber leicht in den Griff
bekommen kann. Ich verwende die Schaltung im Anhang. Über Adressen 0-7
sind die Festplattenregister zu erreichen, Adresse 8: High Byte
schreiben, Adresse 9: Highbyte lesen.
Um einen Sektor zu lesen initialisiere ich die Register und sende den
Lesebefehl (sind alles Byte Werte und können direkt an die Register 1-7
gesendet werden).
Dann lese ich Adresse 0 (Low Byte der Daten), dann Adresse 9 (High
Byte). Das ganze 256 mal.
Schreiben von 16bit Daten geht umgekehrt: Highbyte an Adresse 8, dann
Low Byte an Adresse 0. Das ganze 256 mal für einen Sektor.

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Und noch mein CF Interface.

Wo bekommt man eigentlich günstige CF Sockel ?

von Andreas Auer (Gast)


Lesenswert?

Also ich hab meinen Sockel bei www.distrelec.at in Österreich gekauft.
Ich weiß nicht, ob ich mich richtig an den Preis erinnere, aber
irgendsowas um die 4-5 Euro/Stück. Ist zwar auch nicht unbedingt
billig, dafür gab es sie dort einzeln.
Distrelec dürfte es auch in Deutschland geben!

mfg
Andreas

von Nik Bamert (Gast)


Lesenswert?

Hi!

Österreich  : www.distrelec.ch
Deutschland : www.schuricht.ch
Schweiz     : www.distrelec.ch

Nik

von Andreas Auer (Gast)


Lesenswert?

So... nochmal zum ursprünglichen Thema zurück.
Ich hab jetzt meine Leseroutinen nochmal optimiert (einige
Inline-Functions, IF-Abfrage geändert,...), es ist aber immer noch
alles in C geschrieben.
Jetzt bring ich eine Datenrate von _315kByte/s_ zusammen. Also damit
bin ich zufrieden ;-)!

mfg
Andreas

--

Andreas Auer                     aauer1 (at) sbox.tugraz.at
Student of Telematics            http://home.pages.at/aauer1
Graz University of Technology

von Benedikt (Gast)


Lesenswert?

Nicht schlecht...
Wenn ich das mal umrechne (meine 250kB auf 8MHz CPU Takt sind etwa
1MByte), dann ist das nur das 3 fache. Für einen Compiler wirklich
gut.
Nachdem ich mal einige BASCOM Ergebnisse gesehen habe, kommt für mich
nur Assembler in Frage. Bei 8051 ist das auch relativ leicht, mit AVRs
komme ich in Assembler einfach nicht zurecht, (u.a. da es zuviele
verschiedene Befehle gibt.)
AVRs -> C Compiler (+ Assembler wenn es schnell sein muss)
8051 -> Assembler

von Andreas Auer (Gast)


Lesenswert?

Von BASCOM hab ich von Nik Bamert auch schon ein paar Zahlen zwecks
Performance gehört und die waren alles andere als berauschend.
Die Routine fürs Lesen eines Sektors werde ich aber trotzdem auch noch
in ASM ausprogrammieren. Dann dürfte aber schon so ziemlich das Maximum
erreicht sein.
Auf http://home.t-online.de/home/holger.klabunde/avr/avrboard.htm
finden sich auch ein paar Zahlen bezüglich dem Lesen/Schreiben auf
FAT32.

mfg
Andreas

von Nik Bamert (Gast)


Lesenswert?

Hi!

Ja, Bascom ist da wirklich saulahm. Wenn die Zahlen noch so jemanden
interessieren: 64 kbyte über spi senden: ~10kbyte/sekunde. Für einen
Mp3 Player also viel zu wenig. Ich hab einfach die selbe zahl
rausgesendet. Diese war auch nicht zufalls erzeugt. Also nichts, dass
orgendwie verlangsamen könnte. Ich hoffe das ganze läuft auf 16 mhz
dann schneller. Diese Resultate ergaben sich mit:
Software: Bascom Compiler V. 1.11.7.4
Hardware: Atmega16 @ 8Mhz

MFG Nik

von leif (Gast)


Lesenswert?

Tag allerseits,

könnt Ihr mir evtl. verraten, welches Filesystem verwendet werden
sollte, wenn eine SD/MMC sowohl mit MacOS X als auch WinXP kompatibel
sein soll?
Was meinen Usb Stick betrifft, schreibt der Mac da immer noch ziemlich
viel Krams drauf. Unter XP ist aber nicht ersichtlich, welches FAT das
ist.

Und gibt es FAT Implementierungen in Assembler, die sich relativ
einfach  in C einbinden lassen (ohne, daß man den Code komplett
verstehen muss)? Bei AVR Freaks habe ich unter Tools nur das
kommerzielle gefunden, aber ich such nochmal weiter..

Besten Dank!

-leif

von wolli (Gast)


Lesenswert?

Ihr steuert doch die Platten mit 5V an, richig? Kommen die Platten auch
mit 3.3V zurecht? Ich möchte die Multiword DMA Modi nutzen, dafür sind
uC zu langsam. Also kommt nur ein CPLD oder FPGA in Frage, doch die
sind meist nur 5V tolerant, die Bausteine mit 5V Ausgängen sind
entweder zu klein oder viel zu teuer (weil potentielle
Auslaufmodelle).
In der Spezifikation zur ATA-Schnittstelle steht kaum etwas über
erlaubte Pegel.

von Benedikt (Gast)


Lesenswert?

Ich denke schon, dass 3,3V möglich sind. Ich habe einige Mainboards, bei
denen 3,3V und 5V RAMs zusammen verwendet werden. Beide werden mit 3,3V
Signalen angesteuert. Da in heutigen PCs so ziemlich alles mit 3,3V
läuft müsste es gehen, aber ich habe es selbst noch nicht ausprobiert.

von Matthias (Gast)


Lesenswert?

Hi

ATA dürfte zu 3,3V-Eingangspegeln kompatibel sein da es ja ursprünglich
mit 5V-TTL-Technik arbeitet. Und da ist der High-Pegel IIRC um die
2,5V.

Anders siehts bei CF-Karten aus. Aber die arbeiten ja von Haus aus mit
3,3V Betriebsspannung.

Matthias

von wolli (Gast)


Lesenswert?

Danke, werds mal probieren!

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.