Hallo,
kann mir jemand sagen, wie schnell ein M32 o.ä. (mit 20MHz-Takt) Daten
von einer SD-Karte lesen kann?
(am besten in Bytes pro Sekunde)
Super wäre auch eine Erklärung, wie man das für andere Controller
rausfinden/errechnen kann!
Danke Euch,
Daniel
Mit einem AT91SAM7 kannst froh sein, wenn du 500 Kb/s hinkriegst.
Und der arbeitet mit 48MHz.
Die Karten können mehr, der AVR weniger.
Errechnen lässt sich soetwas schlecht, sind eher Erfahrungswerte.
z.B. hängt es auch davon ab, was der uC zusätzlich rechnet, oder
was für Zugriffe auf das Dateisystem erfolgen.
DanielZeuter schrieb:> Super wäre auch eine Erklärung, wie man das für andere Controller> rausfinden/errechnen kann!
Ok... Du steuerst die Karte im SPI-Modus an. Der ist (inzwischen)
hauptsächlich zur Initialisierung gedacht, und bringt nie die volle
Geschwindigkeit. Mehr Performance gibts nur gegen NDA... oder mit einem
Controller, der die SD-Karten-Ansteuerung schon mitbringt.
Im SPI-Modus kriegst du mindestens 400kHz Taktfrequenz hin. Fast alle
Karten können (nach der Initialisierung) zwar auch mehr, aber garantiert
ist das nicht. (MicroSD-Karten dürfen IIRC sogar den SPI-Modus ganz
weglassen, macht aber keine)...
d.H. Milchmädchen-Rechnung: 400/8=50 kByte/Sekunde.
Benchmark mit der Elm-Chan-FAT-Implementierung:
http://elm-chan.org/fsw/ff/img/rwtest.png
Es geht also auch ein bischen mehr.
Danke für die Antworten!!!
Ich brauche ca. 30kB/s, die aber ohne Unterbrechung während des
Auslesens.
Könnte also realistisch sein... dann werde ich mal einen
"SD-Karten-Sockel" bestellen und ausprobieren.
Noch mal Danke für die Antworten!!!
DanielZeuter schrieb:> Danke für die Antworten!!!>> Ich brauche ca. 30kB/s, die aber ohne Unterbrechung während des> Auslesens.
die entscheidende Frage ist, was der AVR mit den gelesenen Daten weiter
anstellen soll. Ein copy from /sd to /dev/null mit nnn kByte/s hat ja
keinen praktischen Nutzen.
Sascha
Sascha Weber schrieb:> was der AVR mit den gelesenen Daten weiter> anstellen soll
Bei 650 Takten pro Byte lässt sich einiges machen.
Das Problem ist eher "ohne Unterbrechung", bzw. wieviele Puffer benötigt
werden, damit der Datenstrom nicht abreißt. Kommt sehr auf die SD-Karte
drauf an und ggf. auf das verwendete Filesystem.
Milchmädchenrechnung die 2. Da SD-Karten sektorweise gelesen werden,
schafft der AVR mit 20 MHz = 10 MHZ SPI-Takt=1,2Mbytes/s, wenn er einen
Sektor a 512 Byte liest. Dann kommt der nächste Sektor. Wenn der AVR
weiß, welcher es sein soll, geht die Adressierung relativ schnell, wie
schnell genau weiß ich nicht. Die Langsamkeit vieler SD-Karten Projekt
liegt eher daran, dass man das FAT-Dateisystem mit seiner Logik
verarbeiten muss, und dazu braucht es einigermassen Speicher, um die
ganzen Informationen aufzudröseln. Hat man nicht viel Speicher, muss man
viele Sachen durch ständiges Neu lesen und Auswerten erledigen, das
frisst massig Zeit. Also frei nach Goethe
MEHR RAM!
@Falk Brunner
Hier Beitrag "Re: Wie schnell kann ein AVR von SD-Karte lesen?" habe ich eine
Angabe gemacht und auf
Beitrag "Re: ATxMega Stick" verwiesen. Auf einen
Blick: 425 kByte raw read mit ATxmega128A1 bei 32MHz Takt.
Hier Beitrag "Re: Wie schnell kann ein AVR von SD-Karte lesen?" dagegen bezog
ich mich mit den 650 Takten pro Byte auf die Verarbeitbarkeit von
30kByte/s bei 20MHz Takt. Setzt man die Werte zueinander ins Verhältnis,
so kann man abschätzen, dass einiges an Rechenleistung für die
Verarbeitung der Daten übrigbleibt.
Falk Brunner schrieb:> wie> schnell genau weiß ich nicht
Nun, bei 16MHz SPI-Takt kamen bei der getesteten SD-Karte 425 kByte/s
raus. Was die SD-Karte bei nicht-sequenziellem Zugriff macht, ob sie
zwischendurch mal ein paarhundert ms Zigarettenpause macht usw. ist
nochmal eine ganz andere Geschichte.
Konrad S. schrieb:> @Falk Brunner> Hier Beitrag "Re: Wie schnell kann ein AVR von SD-Karte lesen?" habe ich eine> Angabe gemacht und auf> Beitrag "Re: ATxMega Stick" verwiesen. Auf einen> Blick: 425 kByte raw read mit ATxmega128A1 bei 32MHz Takt.> Hier Beitrag "Re: Wie schnell kann ein AVR von SD-Karte lesen?" dagegen bezog> ich mich mit den 650 Takten pro Byte auf die Verarbeitbarkeit von> 30kByte/s bei 20MHz Takt.> Setzt man die Werte zueinander ins Verhältnis,> so kann man abschätzen, dass einiges an Rechenleistung für die> Verarbeitung der Daten übrigbleibt.
ja nur kann man ja nicht sagen, das die 650 Takte "übrig sind", bremst
hier wirklich die Karte, dann hängt der AVR während der Zeit und wartet
bis die SD-Karte meint bereit zu sein.
Klar könnte man während der Wartezeit mit einigen Kniffen auch was
anderes machen, aber das dürfte recht umständlich werden - außer die
anderen Sachen würden in einer ISR laufen.
Sascha
Also mit 6MHz SPI Takt bekommt man locker ne 320kbit MP3 von SD Karte
mit FAT32 in RAM und von da in nen MP3 Decoder IC (VS1053).
320kbit/s/8 = 40kbyte/s
Also passt das für dein Anliegen (darfst auch gerne mal erklären was du
genau vorhast).
Der Atmega644 hatte 12MHz Takt, da direkt an 3,3V.
Sascha Weber schrieb:> ja nur kann man ja nicht sagen, das die 650 Takte "übrig sind", bremst> hier wirklich die Karte, dann hängt der AVR während der Zeit und wartet> bis die SD-Karte meint bereit zu sein.> Klar könnte man während der Wartezeit mit einigen Kniffen auch was> anderes machen, aber das dürfte recht umständlich werden - außer die> anderen Sachen würden in einer ISR laufen.
Oder andersrum: ein Teil der 650 Takte geht für den SPI-Interrrupt weg
...
Martin Wende schrieb:> Also mit 6MHz SPI Takt bekommt man locker ne 320kbit MP3 von SD Karte> mit FAT32 in RAM und von da in nen MP3 Decoder IC (VS1053).> 320kbit/s/8 = 40kbyte/s
Das ist doch mal ein Wort.
Kannst du sagen, wieviel RAM für SPI bzw. SD-Karte bzw. FAT32 notwendig
war?
Aufdröseln kann ichs jetz nicht komplett, hier mal was der Compiler
sagt:
AVR Memory Usage
----------------
Device: atmega644p
Program: 17992 bytes (27.5% Full)
(.text + .data + .bootloader)
Data: 974 bytes (23.8% Full)
(.data + .bss + .noinit)
Das Programm nimmt per UART nen Dateiname entgegen und spielt die Datei
dazu dann ab.
Sind folgende Buffer drinne die noch abgezogen werden müssen:
UART: 96 byte
MP3: 32 byte
UART String: 10 byte
Strings im RAM (Teststadium ;)): 117 byte
Also ungefähr 720byte für normale Variablen und den Sektorpuffer
>> Also mit 6MHz SPI Takt bekommt man locker ne 320kbit MP3 von SD Karte>> mit FAT32 in RAM und von da in nen MP3 Decoder IC (VS1053).>> 320kbit/s/8 = 40kbyte/s>>Das ist doch mal ein Wort.
Kaum. Mit meiner schnellsten Karte kann ich auch mit einem
ATMega32 und 16MHz Takt (SPI 8MHz) mit 450kB/s ins RAM lesen.
Dann aber schön alle Interrupts abschalten!
Dann sind die Daten aber nur im RAM und wurden nicht weiter
bearbeitet. So viel mal zu Benchmarks. Bei Martin übernimmt
der VS1053 dann die Ausgabe mit seinem 2kB? internen Buffer
völlig selbstständig ohne das der AVR da was machen müsste.
Na gut er muss die da noch vom RAM reinschieben. Geht vieleicht
auch noch mit 450kB/s. Netto waren es dann 220kB/s.
Im Endeffekt hat der AVR die Daten dann nur kopiert.
Und der VS1053 überbrückt mit seinem internen Buffer
dann die Latenzzeiten der SD Karte. Wenn der AVR die
Daten selber noch bearbeiten muss bleibt ganz schnell nichts
mehr über an Takten.
Von einer unterbrechungsfreien Übertragung kann man da
nicht ausgehen.
>Oder andersrum: ein Teil der 650 Takte geht für den SPI-Interrrupt weg
SPI Interrupt und schnell schliessen sich gegenseitig aus;)
Martin Wende schrieb:> Also ungefähr 720byte für normale Variablen und den Sektorpufferholger schrieb:> der VS1053 dann die Ausgabe mit seinem 2kB? internen Buffer
Ah, ja. Mit Puffer für nur einen Sektor allein wäre es wohl nicht
machbar.
512kB muss sone SD Lib ja immer einlesen, da das die größe eines Sektors
ist.
Dann hat die Lib noch ne Menge 32bit Variablen für FAT, Seek und
Sektorenadressen.
Wieso sollen das nicht 40kbyte/s kontinuierlich sein?
Natürlich läuft das mit ner Menge Puffern, aber wärn nich 40kbyte/s
drinne, dann würds knacksen (war bei 2MHz SPI der Fall).
Die Frage war ja ob er diese Daenrate auslesen kann, was der TE damit
noch im AVR machen will wissen wir ja noch nicht.
Der MP3 Puffer meiner Software hat nur 32byte, weil man nach jedem
Data_Request des VS1053 auf jeden Fall 32 byte rüberschubsen kann.
Wenn der TE also die 2kB Puffer in AVR legt, kann er da immer seine
40kb/s rauslesen und beackern. Da bieten sich dann m644 (4kb RAM) und
m1284 (16kb!!) an
>Super wäre auch eine Erklärung, wie man das für andere Controller>rausfinden/errechnen kann!
Mit einem STM32F103Zxx schafft man ca. 4MByte/s bei 12,5Mhz CLK und 4Bit
Mode.
Grüsse
Easy: Mit dem P8X32 von Parallax kann man mit den meisten Karten 900KB/s
(raw) und 600KB/s (durch den FAT16-Layer) per SPI lesen und schreiben.
Dabei sind dann noch sieben andere Cores frei, um die Daten parallel zu
verarbeiten.