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
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 ?
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
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)
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
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
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.
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 ?
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.
Und noch mein CF Interface. Wo bekommt man eigentlich günstige CF Sockel ?
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
Hi! Österreich : www.distrelec.ch Deutschland : www.schuricht.ch Schweiz : www.distrelec.ch Nik
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
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 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
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
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
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.
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.
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
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.