Bitte um Unterstützung bei der Programmierung

Fragen zu Programmiersprachen und Software für den Hive und die Propellerchips
Antworten
stesch99
Beiträge: 27
Registriert: Mo 16. Nov 2009, 15:47

Bitte um Unterstützung bei der Programmierung

Beitrag von stesch99 »

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 ***
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Bitte um Unterstützung bei der Programmierung

Beitrag von drohne235 »

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:

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
Benutzeravatar
frida
Beiträge: 40
Registriert: Di 1. Sep 2009, 18:28
Wohnort: Middelfart Dänemark

Re: Bitte um Unterstützung bei der Programmierung

Beitrag von frida »

Hallo
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 2GB format fat16 eine zeit von ca. 10 sec.
Mit meine SD karte 4GB format fat32 sofort. Beide von SanDisk.
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?
Im augenblick keine ahnung.
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).
Abfangen von eine fehler, der 1 bis 2.. calls tiefere liegen. Venn dort
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
stesch99
Beiträge: 27
Registriert: Mo 16. Nov 2009, 15:47

Re: Bitte um Unterstützung bei der Programmierung

Beitrag von stesch99 »

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
Benutzeravatar
volkerp
Beiträge: 82
Registriert: Di 30. Jun 2009, 20:19

Re: Bitte um Unterstützung bei der Programmierung

Beitrag von volkerp »

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

Code: Alles auswählen

pub eof
  result := currentByte => currentSize-1
Beides ist ungetestet!
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Bitte um Unterstützung bei der Programmierung

Beitrag von drohne235 »

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.spin

Code: Alles auswählen

pub eof
  result := currentByte => currentSize-1
Beides ist ungetestet!
Hab heut Zeit gefunden und ein Problem, welches EOF erfordert... ;)

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
Antworten