Forum: PC-Programmierung Daten immer neu von USB-Stick lesen - und nicht aus dem cache!


von S. M. (smatlok)


Lesenswert?

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

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

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

von Roland Praml (Gast)


Lesenswert?

> 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

von Roland Praml (Gast)


Lesenswert?

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/

von Morin (Gast)


Lesenswert?

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.

von Mars (Gast)


Lesenswert?

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

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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.

von S. M. (smatlok)


Lesenswert?

@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!

von S. M. (smatlok)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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?

von S. M. (smatlok)


Lesenswert?

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
Noch kein Account? Hier anmelden.