getCwd (aktuelles Verzeichnis ermitteln)

Du hast ein Betriebssystem für den Hive geschrieben oder beschäftigst dich mit den grundlegenden Systemfunktionen, dann bist du hier richtig!
Antworten
U-Held
Beiträge: 69
Registriert: Mi 14. Dez 2011, 22:05

getCwd (aktuelles Verzeichnis ermitteln)

Beitrag von U-Held »

Wie kann man den Namen des Verzeichnisses, in dem man sich auf der SD-Card befindet, ermitteln? Aus adm-fat.spin werde ich nicht so recht schlau. Und um die Funktion selbst zu programmieren, fehlen mir noch ein paar grundlegende Kenntnisse des Dateisystems FAT. (Hinweise sind willkommen, dann schreibe ich die Funktion auch selbst.)

Grüße vom U-Held
Benutzeravatar
PIC18F2550
Beiträge: 2832
Registriert: Fr 30. Sep 2011, 13:08

Re: getCwd (aktuelles Verzeichnis ermitteln)

Beitrag von PIC18F2550 »

Wenn ich das Richtig verstehe arbeitet das FAT-System mit Zeigern.
Es bekommt einen Verzeichnisnahme oder ".." sucht in dem Verzeichnis danach wenn es ihn findet setzt er den Zeiger auf den Secktor von der SD-Karte.
Danach wird der Name nicht mehr gebraucht.
Wenn du ihn verwenden willst musst du dier eine Art stackspeicher Bauen.
"CD Verzeichnis" Neuer Eintrag auf stack und stack++
"CD .." Rücksprung in übergeordnetes Verzeichnis dann stack--

Willst du wissen wo du bist dann musst du den Stack von 0 bis stack auslesen
(ein stackeintrag ist 12 Zeichen groß)

Auszug aus admflash

Code: Alles auswählen

'index für dmarker
#0,     RMARKER                 'root
        SMARKER                 'system
        UMARKER                 'programmverzeichnis
        AMARKER
        BMARKER
        CMARKER

VAR
  long  dmarker[6]                                      'speicher für dir-marker
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: getCwd (aktuelles Verzeichnis ermitteln)

Beitrag von drohne235 »

PIC hat es im Prinzip schon geschriebe: Administra parst und verwaltet keine Pfadnamen. Wenn das im Programm von Interesse ist, muss man das selbst organisieren. Um dennoch im Dateisystem wichtige Punkte anzusteuern, habe ich das Markersystem eingebaut. Ein Marker ist kein Pfad, sondern wie eine kleine "Fähnchen", welches man an bestimmte Stellen auf der Landkarte (Dateisystem) steckt. Wird ein Medium gemountet, so setzt TriOS schon zwei dieser Marker automatisch: Rootverzeichnis und Systemverzeichnis (sofern es auf dem Medium ein Systemverzeichnis gibt). Zusätzlich gibt es noch den "Usermarker", welcher von Regime immer auf das aktuelle Verzeichnis gesetzt wird, aus welchem ein Programm gestartet wird. Mit einer entsprechenden Funktion kann man einen Marker aktivieren, also quasi zwischen den Fähnchen hin und her springen.

Zusätzlich gibt es noch drei Marker A/B/C, die man im eigenen Programm setzen und verwenden kann. Zum Beispiel könnte ein Norton-Clone Marker A für das linke und Marker B für das rechte Fenster setzen um schnell zwischen den verschiedenen Orten auf dem Medium zu wechseln.

Wie funktioniert es? Jedes Verzeichnis befindet sich in einem bestimmten Block auf dem Medium. In sechs Markervariablen werden nun programmgesteuert diese Blocknummern gespeichert und bei Bedarf aktiviert.

Was bringts? Nun ja, dieser Mechanismus ist natürlich nicht so schön wie ein richtiger Pfadparser, aber so ein Parser benötigt einiges an Ressourcen. Für einfache Aufgaben wie zum Beispiel das Starten eines Programmes oder das Verwalten eines Systemverzeichnisses sind die Marker eine einfache und preiswerte Alternative.

Im IOS gibt es folgende fertige Routinen um die Marker zu verwenden:

sddmact(marker) - aktiviert einen Marker
sddmset(marker) - setzt ein Markerregister auf das aktuelle Verzeichnis
sddmget(marker):status - liefert den Inhalt des Markers
sddmclr(marker) - löscht den entsprechenden Marker
sddmput(marker,status) - setzt Marker auf Wert "status"

0 rmarker - Root-Verzeichnis
1 smarker - Systemverzeichnis
2 umarker - Usermarker (aktuelles Verzeichnis)
3 amarker - Benutzerverzeichnis A
4 bmarker - Benutzerverzeichnis B
5 cmarker - Benutzerverzeichnis C

Es ist bei der Benutzung sinnvoll, die ersten drei Marker (r/s/umarker) nicht zu verändern, da sie vom TriOS/Regime verwendet und selbst verwaltet werden.
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
U-Held
Beiträge: 69
Registriert: Mi 14. Dez 2011, 22:05

Re: getCwd (aktuelles Verzeichnis ermitteln)

Beitrag von U-Held »

PIC, drohne, vielen Dank für Eure Antworten. Das Dir-Marker-System hatte ich schon verstanden, auch wenn ich es anfangs für etwas beschränkt und eigenbrötlerisch hielt. Aber wie drohne schon schreibt: die Marker sind eine einfache und preiswerte Alternative zu einer richtigen Pfadverwaltung. Nachdem ich's einmal verstanden hatte, wollte ich das Marker-System auch nicht umgehen. In Administra ist ja kaum noch Platz für eine so selten benötigte Funktion.

PICs Idee mit dem Verzeichnis-Stack kling zunächst einleuchtend, aber das aktuelle Marker-System steht dem entgegen. Man kann sich ja einfach so an einen anderen Ort auf der SD-Karte beamen lassen; dann müsste man auch den vorher gültigen Stack komplett verwerfen und an jedem Marker noch dessen Verzeichnisstack hinterlegen um ihn nach dem Marker-Sprung zu laden. Lassen wir das. Machen wir's also so ähnlich wie die anderen.

Bei meiner Suche nach getCWD-Implementierungen bin ich schon erschrocken: Statt sich irgendwo den Verzeichnisnamen zu merken, klappert man in ".." alle gültigen Verzeichniseinträge nach der Clusternummer (resp. inode) des aktuellen Verzeichnisses ab.

Ich würde jetzt folgenden Ansatz wählen:

Ich schreibe eine Funktion getDirName in Administra, die nur den Namen des aktuellen Verzeichnisses liefert und nicht den kompletten Pfad vom Wurzelverzeichnis bis dahin. Ich recycle den Code von adm-fat:listFind/listDirectory und suche nach der Clusternummer. Im Fall des Wurzelverzeichnisses wird ein leerer String zurückgegeben, ansonsten "unformatName()".

Wie erweitert man eigentlich Administra um eine Funktion ohne gleich an admflash.spin herumzudoktorn?

Grüße vom U-Held
Antworten