2016-04-06 8 views
1

Ich versuchte das Beispiel von atmel ASF auf USB-Massenspeicher-Host zum Senden/Lesen einer Datei auf einem USB-Flash-Speichergerät. Wenn Sie eine Datei zu lesen, bin i 1.7 MB/s Geschwindigkeit bekommen, habe ich versucht, eine Menge von Lösungen, die Folgendes umfassen:SAMV71 USB-Massenspeicher-Host extrem langsam

  • vergewissern seinen Lauf auf High-Speed-Modus und das Board auf 300 MHz läuft
  • Versuchte die Puffergröße für die F_read Funktion zu erhöhen, und ich schaffte es auf 2,2 MB
  • ich das Dateisystem s/zu erhöhen, getestet es sich von selbst, das Beispiel FAT32 auf einem virtuellen Speicher ist, und bekam 30 MB/s auf Leseoperationen (nicht sicher, ob das hilfreich für die Geschwindigkeit Debugging-Zwecke ist)
  • Ich habe versucht mit dem gleichen Programm, außer das Lesen von einer SD-Karte, die gab mir eine Ausgabe von 1 MB/s
  • Ich testete es auch auf Full-Speed-Modus und es gab mir eine Ausgabe von 0,66 MB/s.
  • eine extreme Idee, die ich getestet wurde, lief zwei Boards, eine im Host-Modus, und die andere im Gerätemodus dann habe ich die Übertragungsgeschwindigkeit der USB getestet, gab mir eine Ausgabe von 1,66 MB/s im Bulk-Modus. (läuft auf HS)
  • versuchten die Keil-Beispiele, die mir die schlechtesten Ergebnisse als Atmel gab.

    kann jemand bitte Lösungen vorschlagen? Ich habe die gesamte Dokumentation zur USB-Kommunikation von Atmel und Keil gelesen.

+0

Wie werden die Daten tatsächlich vom Host-Controller abgerufen? DMA? FIFO Interrupts? Umfrage? Das wäre das erste, was ich mir ansehen würde. – Notlikethat

Antwort

1

Atmels Massenspeicher USB-Stack fehlt Multi-Sektor lesen und schreiben, wenn die SCSI-Schicht in der Tat den richtigen Befehl implementiert viele Sektoren in einer Reihe (siehe uhi_msc_scsi_read_10) zu erhalten. Die Abstraktionsschicht, die Daten über den SCSI-Befehlen liest (z. B. uhi_msc_mem_read_10_ram und uhi_msc_mem_write_10_ram), liest nur Sektor für Sektor, was zu einer sehr schlechten Leistung führt.

Um USB High Speed ​​Leistung (~ 35 MB/s) zu erreichen, müssen Sie diese Funktionen (und alle darüber liegenden Schichten) hacken, um Multisektoren lesen/schreiben zu können.