Hallo, Ich habe auf einem AT90USB einen Flashspeicherstick implementiert (MassStorage Demo von Atmel). Funktioniert auch, jedoch werden die Daten unter WindowsXP nur einmal vom "Usbstick" gelesen - danach wird auch per F5 o.ä. nicht mehr erneut auf den Stick zugegriffen. Das Problem ist nun, dass ich die gespeicherten Daten auf dem Stick manipuliere und wieder auslesen möchte. Und hier der Punkt: Die modifizierte Datei wird wie gesagt nicht erneut ausgelesen. Schreibe ich die modifizierten Daten aber z.B. in einer anderen Datei, so kann ich die neuen Daten auslesen - jedoch eben halt auch nur einmal, danach hat sie WinXP irgendwie gecached und gibt auch nurnoch den erstmals gelesenen Inhalt aus. Hat jmd eine Idee wie ich das Problem lösen könnte ? Kann ich per Software das erneute auslesen irgendwie "forcen" ? (Notepad kanns nicht :D) Kann ich irgendwelche Optionen für den Stick/Dateien setzen, dass er immer neu ausgelesen wird? -- Oder irgendeine ganz andere Idee um immer aktuell an die vom Stick selbst erstellten Daten zu kommen, OHNE ihn an und abstecken zu müssen ? Erschwerend kommt hinzu, dass eine Lösung auch Plattformunabhängig funktionieren soll, also für Win, Unix, Mac usw.. grübel
Beim öffnen der Daten kann man jeweils angeben, wie das Caching ablaufen soll. Geht natürlich nur, wenn du das zugreifende Programm erstellst. Windows: http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx "Caching Behavior Several of the possible values for the dwFlagsAndAttributes parameter are used by CreateFile to control or affect how the data associated with the handle is cached by the system. They are: FILE_FLAG_NO_BUFFERING FILE_FLAG_RANDOM_ACCESS FILE_FLAG_SEQUENTIAL_SCAN FILE_FLAG_WRITE_THROUGH FILE_ATTRIBUTE_TEMPORARY If none of these flags is specified, the system uses a default general-purpose caching scheme. Otherwise, the system caching behaves as specified for each flag. ...." Linux: http://linux.die.net/man/2/open "O_DIRECT Try to minimize cache effects of the I/O to and from this file. In general this will degrade performance, but it is useful in special situations, such as when applications do their own caching. File I/O is done directly to/from user space buffers. The I/O is synchronous, i.e., at the completion of a read(2) or write(2), data is guaranteed to have been transferred. Under Linux 2.4 transfer sizes, and the alignment of user buffer and file offset must all be multiples of the logical block size of the file system. Under Linux 2.6 alignment to 512-byte boundaries suffices. A semantically similar (but deprecated) interface for block devices is described in raw(8). ..." Von Macs hab ich keine Ahnung, wird aber wohl auch wie in Linux gehen
> Das Problem ist nun, dass ich die gespeicherten Daten auf dem Stick > manipuliere und wieder auslesen möchte. halte ich für eine SEHR schlechte Idee. Das Filesystem geht dadurch wohl schneller kaputt als du schauen kannst... Das einzige was mir einfällt, ist dass sich das Mass-storage-device vom PC abmeldet (aber nur, wenn keine Dateien geöffnet sind) die Manipulation durchführt und dann wieder anmeldet. Gruß Roland
ich hab hier noch was gefunden (habs mir nicht genau durchgelesen, könnte aber interessant sein) http://www.officesoon.com/doc/36681-Implementation-of-Concurrent-Access-to-File-Systems-in-USB-Devices/
Wenn du die lesende Anwendung unter Kontrolle hast, kannst du es sicher da versuchen. Ansonsten ist die Antwort, dass dein Stick kein "Mass Storage Device" in dem Sinne ist, weil diese per Definition die Daten nicht von sich aus verändern. Vielleicht kannst du also etwas erreichen, indem sich der Stick als ein anderer Gerätetyp ausgibt.
Hi, Doch das geht schon, du musst dem Host nur mitteilen, dass sich die Daten auf dem Stick verändert haben. Für genaueres muss ich dich leider auf die USB Mass Storage Specs verweisen, da ich die Infos auch nicht im Kopf habe. Lg
S. Matlok wrote: > Das Problem ist nun, dass ich die gespeicherten Daten auf dem Stick > manipuliere und wieder auslesen möchte. Und hier der Punkt: Die > modifizierte Datei wird wie gesagt nicht erneut ausgelesen. Dann machst Du etwas grundlegendes falsch.
@Tobi H Ja, die Software welche die Daten auslesen soll wird auch selbst geschrieben - gottseidank aber nicht allein von mir :-) Aber deine Info wäre dann schonmal die PC-Seitige Lösung, fallses nicht anders geht, Danke ! @ Roland Praml Die Daten werden nicht auf Flashspeicher zwischengespeichert, sondern bei einem read-request neu generiert. Dein Link ist echt informativ aber für mich doch etwas schwere Kost^^ - Ich muss mir das nochmal genauer durchlesen, evtl find ich darin eine Lösung :-) @ Morin (Gast) Ja, alternativplan ist es, das ganze über ein HIDgerät zu lösen, aber das setzt dann noch mehr Arbeit auf der PC-Softwareseite vorraus,.. Notlösung! @ Mars (Gast) Ja, das wär super :-) Aber wie könnte das funktionieren ? Wenn ich das System richtig verstanden hab, dann sind die Rückgabeinformationen einerseits die Nutzdaten, andererseits die Command Status Word Infos - evtl lässt sich damit was machen ? Ich versuch jetz erstmal noch ein paar Stunden Rolands Link zu verinnerlichen und mehr über CSW zu erfahren - mal schaun ob ich weiterkomme. Und Danke für die Hilfe!
Ok, Cool, ich habs! (zumindest eine Möglichkeit) Für alle die es auch interessiert: Der PC sendet regelmäßig (ca 2x pro Sekunde) einen CommandBlockWrapper - im Normalfall ein "Unit Test Ready"- Request. Der Stick antwortet daraufhin mit einem "good status". Sendet man aber nun ein "Fail" zurück, so erfragt der PC einen "Request Sense" um herauszufinden was für ein Problem der Stick hat. Daraufhin kann man dann mit einem "Unit Attention" Fehlercode und der erweiterung "not-ready to ready transition" ein Update des Caches herbeiführen.. In Roland's Link steht das es auch einen "Medium Changed" CSW gibt, aber ich kann nichts derartiges in der CSW-Befehlsliste für einen "Request Sense" finden. An dieser Stelle https://www.usb.org/phpbb/viewtopic.php?t=13777 sendet einer angeblich auf einen "Unit Test Ready" direkt einen "Media Changed" ?! kann aber sonst keine Quelle/Spezifikation für dieses Vorgehen finden. Ebenfalls hab ich noch nirgends gesehen wie so ein "Media Changed" Response aussehen soll. Naja auf jeden fall scheint das schonmal zu funktionieren.. Frage ist nurnoch ob das eine gute "standart" Methode ist.. Rolands Link nochmal: http://www.officesoon.com/doc/36681-Implementation-of-Concurrent-Access-to-File-Systems-in-USB-Devices/ (CBW) SCSI Befehle: http://en.wikipedia.org/wiki/SCSI_command CSW Antworten auf einen "Request Sense": http://en.wikipedia.org/wiki/SCSI_Request_Sense_Command Mit den Entsprechenden Sense-Keys: http://en.wikipedia.org/wiki/KCQ
> Frage ist nurnoch ob das eine gute "standart" Methode ist..
Ob das jeder PC Host versteht und ob es jeden Host dazu bringt, das
Dateisystem zu aktualisieren? Ich habe da so meine Zweifel, gerade, daß
MS ein so potentiell praktisches Feature auch tatsächlich im MSD-Treiber
seiner Betriebssysteme unterstützt.
Unklar bleibt jetzt nur noch, was das mit der Art des Stehens zu tun
hat. Leicht vornübergebeugt oder doch eher aufrecht? Stramm oder lässig?
Rufus t. Firefly wrote: > Unklar bleibt jetzt nur noch, was das mit der Art des Stehens zu tun > hat. Leicht vornübergebeugt oder doch eher aufrecht? Stramm oder lässig? zäärfix, sorry^^ - oh man, kann man nicht mehr editieren.. naja.. In dem PDF ( ftp://ftp.legato.com/pub/NetWorker/German/gener_69.pdf) steht an einer Stelle: "NOT READY TO READY TRANSITION(MEDIUM MAY HAVE CHANGED)" - das ist mein einziger Zusammenhang zwischen dem Status-Response und "Media(-um) Changed" - und funktioniert, aber bisher leider nur auf WinXP getestet.. Trotzdem kommt es mir auch eingermaßen logisch vor, z.B. könnte in einen Kartenleser ja stillschweigend ohne abzumelden eine neue Speicherkarte reingesteckt werden, welche dann auch neu ausgelesen werden muss.. Naja da bastel ich nächste Woche weiter drann..
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.