Hallo an alle Hive-Fans!
Ich habe jetzt auch das TRIOS (mit den Korrekturen von Frida) bei mir am Laufen und freue mich über den neuen Komfort.
Der "free"-Befehl zur SD-Karten-Speicherplatz-Abfrage hatte bei mir 80-160 (1. Anzeigezeile bis 3. Anzeigezeile) sec gedauert.
Das kam mir doch recht lange vor. Nach der Korrektur ist die Anzeige jedoch sofort da ;>).
Was mir auffällt ist, das es im IOS die Funktion "sdeof" (zur Datei-Ende-Erkennung) nicht mehr gibt.
Durch welche Funktion ist diese ersetzt wurden oder wie kann ich diese ersetzen, da ich unbedingt die Abfrage eines Datei-Endes benötige?
Könnt Ihr mir bitte auch einen Tip geben, was der Backslash in den nachfolgenden gekennzeichneten Programmausschnitt genau bewirkt! Habe da im Moment ein großes Verständnisproblem (die Beschreibung im Propeller-Manual alias ABORT-Befehl hat mir nicht wirklich weitergeholfen).
PUB sd_mount | err 'sdcard: sd-card mounten
''funktionsgruppe : sdcard
''funktion : eingelegtes volume mounten
''eingabe : -
''ausgabe : -
''busprotokoll : [001][put.error]
'' : error - fehlernummer entspr. list
err := \sdfat.mountPartition(0,0) 'karte mounten
siglow(err)
bus_putchar(err) 'fehlerstatus senden
ifnot err
dmarker[RMARKER] := sdfat.getDirCluster 'root-marker setzen
err := \sdfat.changeDirectory(string("system"))
ifnot err
dmarker[SMARKER] := sdfat.getDirCluster 'system-marker setzen
sdfat.setDirCluster(dmarker[RMARKER]) 'root-marker wieder aktivieren
hss.sfx_play(1, @SoundFX8) 'on-sound
PUB sd_opendir | err 'sdcard: verzeichnis öffnen
''funktionsgruppe : sdcard
''funktion : verzeichnis öffnen
''eingabe : -
''ausgabe : -
''busprotokoll : [002]
err := \sdfat.listReset
siglow(err)
PUB sd_nextfile | flag,i,len,strpt 'sdcard: nächsten eintrag aus verzeichnis holen
''funktionsgruppe : sdcard
''funktion : nächsten eintrag aus verzeichnis holen
''eingabe : -
''ausgabe : -
''busprotokoll : [003][put.status=0]
'' : [003][put.status=1][sub_putstr.fn]
'' : status - 1 = gültiger eintrag
'' : 0 = es folgt kein eintrag mehr
'' : fn - verzeichniseintrag string
strpt := \sdfat.listName 'nächsten eintrag holen
if strpt 'status senden
bus_putchar(1) 'kein eintrag mehr
sub_putstr(strpt)
else
bus_putchar(0) 'gültiger eintrag folgt
PUB sd_open | err,modus,len,i 'sdcard: datei öffnen
''funktionsgruppe : sdcard
''funktion : eine bestehende datei öffnen
''eingabe : -
''ausgabe : -
''busprotokoll : [004][get.modus][sub_getstr.fn][put.error]
'' : modus - "A" Append, "W" Write, "R" Read
'' : fn - name der datei
'' : error - fehlernummer entspr. list
modus := bus_getchar 'modus empfangen
sub_getstr
err := \sdfat.openFile(@tbuf, modus)
sighigh(err) 'fehleranzeige
bus_putchar(err) 'ergebnis der operation senden
outa[LED_OPEN] := 1
Viele Grüße von Steffen
*** Drohne 98 ***
Bitte um Unterstützung bei der Programmierung
- drohne235
- Administrator
- Beiträge: 2284
- Registriert: So 24. Mai 2009, 10:35
- Wohnort: Lutherstadt Wittenberg
- Kontaktdaten:
Re: Bitte um Unterstützung bei der Programmierung
Erstmal ein willkommen im Forum! 
Zu deinen Fragen:
Kommando "free" - Die FATEngine unterstützt bei der Abfrage der freien Sektoren einen schnellen und einen genauen Modus. Irgendwo war da noch ein Fehler in der Parameterübergabe zur Einstellung der Betriebsart, weshalb immer nur der genaue Modus verwendet wurde, der halt leider auch entsprechend (sau)langsam ist (dauert wirklich so lange!).
Funktion "sdeof" - ist ersatzlos gestrichen, da es eine entsprechende Funktion in der FATEngine nicht mehr gibt. Alternativ muss man die Größe der Datei vor der Dateioperation abfragen, und entsprechend verwenden. Als Beispiel die Funktion des type-Kommandos in Regime, in welcher ich beim fsrw auch mit sdeof gearbeitet hatte:
Die Zeile
repeat ios.sdfattrib(ios#F_SIZE)
fragt die Dateigröße ab, und genau so viele Zeichen werden aus der Datei ausgelesen. Vorher war es eine "Schleife EOF kommt".
ABORT "\" - Abort ist in meinen Augen ein ziemlich bescheidenes Konstrukt - findet man aber in den verschiedenen Programmiersprachen. Ich persönlich mag es nicht wirklich, aber da die FATEngine die Funktionalität verwendet, konnte ich es nicht umgehen.
Die Sache funktioniert so: Wenn in einer Routine ein unvorhergesehener Zustand eintritt, kann man diese mit einem "abort <value>" abbrechen. Abort ist ähnlich wie das return-Kommando, mit einem Unterschied: Die Abarbeitung wird nicht unbedingt auf der nächst höheren Ebene (also dm aufrufenden Code) fortgesetzt, sondern die Abarbeitung wird erst bei dem aufrufenden Code mit einem Trab (dem Backslach vor dem Aufruf) fortgesetzt. Ein Beispiel:
Wird in funktion2 das abort-Kommando ausgeführt, landet der SPIN-Interpreter nicht in funktion1, sondern saust solange den Returnstack zurück, bis er eine Falle (Trap) in dem entsprechenden Aufruf <findet. In dem Beispiel ist das die main-Funktion. Als Rückgabewert befindet sich dann TRUE in der Variable err.
Wie gesagt - ich finde das unübersichtlich, aber wahrscheinlcih spart es einigen Code. Wenn in der FATEngine irgendwo ein schwerwiegender Fehler in den tieferen Aufrufschichten auftritt, dann landet das dortige abort in der obersten Ebene vom Administra-Code - halt da wo es in eine \-Falle tritt.
Viel Spaß beim Basteln!

Zu deinen Fragen:
Kommando "free" - Die FATEngine unterstützt bei der Abfrage der freien Sektoren einen schnellen und einen genauen Modus. Irgendwo war da noch ein Fehler in der Parameterübergabe zur Einstellung der Betriebsart, weshalb immer nur der genaue Modus verwendet wurde, der halt leider auch entsprechend (sau)langsam ist (dauert wirklich so lange!).
Funktion "sdeof" - ist ersatzlos gestrichen, da es eine entsprechende Funktion in der FATEngine nicht mehr gibt. Alternativ muss man die Größe der Datei vor der Dateioperation abfragen, und entsprechend verwenden. Als Beispiel die Funktion des type-Kommandos in Regime, in welcher ich beim fsrw auch mit sdeof gearbeitet hatte:
Code: Alles auswählen
PUB cmd_type | stradr,char,n 'cmd: textdatei ausgeben
{{sdtype <name> - textdatei ausgeben}}
stradr := os_nxtoken1 'dateinamen von kommandozeile holen
n := 1
ifnot os_error(ios.sdopen("r",stradr)) 'datei öffnen
repeat ios.sdfattrib(ios#F_SIZE) 'text ausgeben
if ios.printchar(ios.sdgetc) == ios#CHAR_NL 'zeilenzahl zählen und stop
if ++n == (rows - 2)
n := 1
if ios.keywait == "q"
ios.sdclose
return
ios.sdclose 'datei schließen
Die Zeile
repeat ios.sdfattrib(ios#F_SIZE)
fragt die Dateigröße ab, und genau so viele Zeichen werden aus der Datei ausgelesen. Vorher war es eine "Schleife EOF kommt".
ABORT "\" - Abort ist in meinen Augen ein ziemlich bescheidenes Konstrukt - findet man aber in den verschiedenen Programmiersprachen. Ich persönlich mag es nicht wirklich, aber da die FATEngine die Funktionalität verwendet, konnte ich es nicht umgehen.
Die Sache funktioniert so: Wenn in einer Routine ein unvorhergesehener Zustand eintritt, kann man diese mit einem "abort <value>" abbrechen. Abort ist ähnlich wie das return-Kommando, mit einem Unterschied: Die Abarbeitung wird nicht unbedingt auf der nächst höheren Ebene (also dm aufrufenden Code) fortgesetzt, sondern die Abarbeitung wird erst bei dem aufrufenden Code mit einem Trab (dem Backslach vor dem Aufruf) fortgesetzt. Ein Beispiel:
Code: Alles auswählen
PUB main | err
...
err := /funktion1
...
PUB funktion1
...
funktion2
...
return 0
PUB funktion2
...
if irgendwas == 0
abort FALSE
else
...
return 0
Wird in funktion2 das abort-Kommando ausgeführt, landet der SPIN-Interpreter nicht in funktion1, sondern saust solange den Returnstack zurück, bis er eine Falle (Trap) in dem entsprechenden Aufruf <findet. In dem Beispiel ist das die main-Funktion. Als Rückgabewert befindet sich dann TRUE in der Variable err.
Wie gesagt - ich finde das unübersichtlich, aber wahrscheinlcih spart es einigen Code. Wenn in der FATEngine irgendwo ein schwerwiegender Fehler in den tieferen Aufrufschichten auftritt, dann landet das dortige abort in der obersten Ebene vom Administra-Code - halt da wo es in eine \-Falle tritt.

Viel Spaß beim Basteln!
"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
Re: Bitte um Unterstützung bei der Programmierung
Hallo
Mit meine SD karte 4GB format fat32 sofort. Beide von SanDisk.
eine ABORT stehe, dann geht der return back zu metode mit eine \.
Wenn keine \ dort steht, wird der program beendet.
Ich hoffe du es brauchen kann.
Frida
Mit meine SD karte 2GB format fat16 eine zeit von ca. 10 sec.Der "free"-Befehl zur SD-Karten-Speicherplatz-Abfrage hatte bei mir 80-160 (1. Anzeigezeile bis 3. Anzeigezeile) sec gedauert.
Das kam mir doch recht lange vor. Nach der Korrektur ist die Anzeige jedoch sofort da ;>).
Mit meine SD karte 4GB format fat32 sofort. Beide von SanDisk.
Im augenblick keine ahnung.Was mir auffällt ist, das es im IOS die Funktion "sdeof" (zur Datei-Ende-Erkennung) nicht mehr gibt.
Durch welche Funktion ist diese ersetzt wurden oder wie kann ich diese ersetzen, da ich unbedingt die Abfrage eines Datei-Endes benötige?
Abfangen von eine fehler, der 1 bis 2.. calls tiefere liegen. Venn dortKönnt Ihr mir bitte auch einen Tip geben, was der Backslash in den nachfolgenden gekennzeichneten Programmausschnitt genau bewirkt! Habe da im Moment ein großes Verständnisproblem (die Beschreibung im Propeller-Manual alias ABORT-Befehl hat mir nicht wirklich weitergeholfen).
eine ABORT stehe, dann geht der return back zu metode mit eine \.
Wenn keine \ dort steht, wird der program beendet.
Ich hoffe du es brauchen kann.
Frida
Re: Bitte um Unterstützung bei der Programmierung
Hallo Drohne 235 und Frida!
Einen recht herzlichen Dank an Euch für die schnelle und ausführliche Antwort zu meinen Fragen.
Da komme ich mal wieder ein paar Schritte weiter. Manchmal stehe ich halt echt auf dem Schlauch, da ich einfach den Lösungsansatz auf Grund alter Erfahrungen suche, was mich dann aber auf den sogenannten "Holzweg" führt.
Ein besonderer Dank geht auch an Euch beide bezüglich des TRIOS und der Anwendungsprogramme, da habt Ihr wirklich wieder ein ganz schönes Stück an Arbeit / Fortschritt geleistet.
Also noch mal vielen Dank an Euch und einen sonnigen Sontag mit einem positiven Spielergebnis für Deutschland als mein Wunsch für heute.
Gruß Steffen
Einen recht herzlichen Dank an Euch für die schnelle und ausführliche Antwort zu meinen Fragen.
Da komme ich mal wieder ein paar Schritte weiter. Manchmal stehe ich halt echt auf dem Schlauch, da ich einfach den Lösungsansatz auf Grund alter Erfahrungen suche, was mich dann aber auf den sogenannten "Holzweg" führt.
Ein besonderer Dank geht auch an Euch beide bezüglich des TRIOS und der Anwendungsprogramme, da habt Ihr wirklich wieder ein ganz schönes Stück an Arbeit / Fortschritt geleistet.
Also noch mal vielen Dank an Euch und einen sonnigen Sontag mit einem positiven Spielergebnis für Deutschland als mein Wunsch für heute.
Gruß Steffen
Re: Bitte um Unterstützung bei der Programmierung
eine EOF-Funktion ist sinnvoll und m.E. auch nötig. Ich hätte da zwei Ideen:
a) die Fehlernummern in admflash-fat.spin negativ machen. Dann könnte man bei sdfat.readCharacter einfach auf < 0 für Fehler testen
b) eine Funktion in admflash-fat.spin
Beides ist ungetestet!
a) die Fehlernummern in admflash-fat.spin negativ machen. Dann könnte man bei sdfat.readCharacter einfach auf < 0 für Fehler testen
b) eine Funktion in admflash-fat.spin
Code: Alles auswählen
pub eof
result := currentByte => currentSize-1
- drohne235
- Administrator
- Beiträge: 2284
- Registriert: So 24. Mai 2009, 10:35
- Wohnort: Lutherstadt Wittenberg
- Kontaktdaten:
Re: Bitte um Unterstützung bei der Programmierung
Hab heut Zeit gefunden und ein Problem, welches EOF erfordert...volkerp hat geschrieben:eine EOF-Funktion ist sinnvoll und m.E. auch nötig. Ich hätte da zwei Ideen:
a) die Fehlernummern in admflash-fat.spin negativ machen. Dann könnte man bei sdfat.readCharacter einfach auf < 0 für Fehler testen
b) eine Funktion in admflash-fat.spinBeides ist ungetestet!Code: Alles auswählen
pub eof result := currentByte => currentSize-1

Ich hab Variante 2 eingebaut. Die Routine ist jetzt mit ios.sdeof nutzbar. Beispielcode: type-Kommando in regime.spin
Code: Alles auswählen
repeat
...
until ios.sdeof
"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