mikrocontroller.net

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


Autor: Andreas Auer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Andreas Auer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Auer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Benedikt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt (Gast)
Datum:
Angehängte Dateien:
  • preview image for CF.gif
    CF.gif
    8,81 KB, 251 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Und noch mein CF Interface.

Wo bekommt man eigentlich günstige CF Sockel ?

Autor: Andreas Auer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nik Bamert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

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

Nik

Autor: Andreas Auer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Auer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/a...
finden sich auch ein paar Zahlen bezüglich dem Lesen/Schreiben auf
FAT32.

mfg
Andreas

Autor: Nik Bamert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: leif (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: wolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: wolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, werds mal probieren!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.