TriOS [aktuelle Arbeitsversion und Log im ersten Beitrag]

Du hast ein Betriebssystem für den Hive geschrieben oder beschäftigst dich mit den grundlegenden Systemfunktionen, dann bist du hier richtig!
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: TriOS

Beitrag von drohne235 »

Hmm, der Ogg war schon wieder fleißig - da kommt man kaum nach... ;)

Also, TriOS hatte ich eigentlich als Namen für die überarbeitete Version des jetzigen Codes angedacht, denn so richtig hatten wir ja bisher keinen Namen. Momentan möchte ich, wie oben beschrieben, den bestehenden Quelltext systematisch ordnen und vervollständigen, um ihn von einer Werkstattversion in eine einfache, weiterhin vordergründig auf Spin basierende Version zu überführen. Einfach und gut dokumentiert für Einsteiger und erste Experimente, Basis für weitere Schritte. Später kann man dann das ganze erweitern (mehrere Anwendungen, Nachrichtensystem...) Momentan ist es ja mehr eine Copy-Past-Version um ein wenig zu spielen - ungeordnet, keine einheitliche Struktur der Dokumentation, teilweise keine Dokumentation, keine Programmbeispiele usw. Der Aufbau, Doku und erste Programmbeispiele wird dann Teil 3 vom Tutorial. Mit Verzeichnissen hat man dann erstmal mehr Komfort und mit dem Administra-Loader kann man zur Laufzeit mit einem entsprechenden Kommando (ohne Flashen) ein komplett anderes System laden.

Ich hab jetzt ein wenig über das Konzept eines Nachrichtensystems nachgedacht, drei mal mit schreiben angefangen und einen Haufen Text gerade wieder gelöscht... :) Die Essenz: Für mich persönlich unterscheide ich momentan zwei verschiedene Aspekte in Bezug auf das TriOS:

1. Eine sinnvollere und universellere Adressierung.
2. Ein multitaskingfähiges Nachrichtensystem.

Ich möchte diese beiden Punkte gern trennen, da ich denke, dass Punkt 1 wichtig ist für eine geordnete und sinnvolle Erweiterung des Hive, aber Punkt 2 (noch) nicht unbedingt für die netten kleinen Experimente und Spielereien nötig ist. Punkt 2 sehe ich quasi als Level 3 ... ;)

Der Grund ist ganz einfach:

Der Hive ist auf der einen Seite ein Retrospielzeug, ein netter Zeitvertreib, um mal ein kleines Spiel zu schreiben, um zu lernen wie das Ganze im Detail funktioniert. Alle diese Dinge kann man ganz gut mit der schon per Hardware realisierten Multitaskingmöglichkeit realisieren. Ein Grund warum es den Hive gibt, ist, dass ich es liebe einen Computer einzuschalten, und in Sekunden erscheint ohne großes Geschwafel ein einfache "ok" und der Spaß kann beginnen. :) Bei einem solchen System ist man noch ganz dicht an der Hardware, aber man kann dennoch schon damit experimentieren. Um ein Game zu schreiben oder wie beim Magischen Auge einen Motor, ein paar LED's und Sensoren zu bedienen ist das genau richtig. Wenn man an diesem Punkt die Sache zu kompliziert macht ist der Spaß an diesen Sachen erledigt und ein ausgewachsenes Nachrichtensystem wäre zu komplex denke ich.

Momentan "schmiegt" sich das IOS ja ganz geschmeidig an das System an und ist deshalb, trotz der fast ausschließlichen Verwendung von SPIN, noch ausreichend schnell. Die meisten Funktionsaufrufe sind sehr einfach im IOS - die Komplexität wird dabei in die Slaves verlagert. Fast alle Funktionen sind aus der Sicht von Regnatix "Primitive", rufen also keine weiteren Unterfunktionen auf. Das ist natürlich nicht ganz korrekt, denn man muß ja quasi die Subroutinen in Administra und Bella mit hinzurechnen, aber durch die physische Trennung ist die Anwendung in Regnatix echt gekapselt und in einer robusten Art unabhängig. Auch mental ist man ein wenig gezwungen die Dinge nicht zu sehr zu vermischen und exakter zu modularisieren: Für mein Schachprogramm habe ich einen Bellatrix-Code geschriebe, der die kompletten grafischen Ausgaben und Eingaben zur Verfügung stellt. So wird Bella quasi zu einer "Schachgrafikkarte". Ich kann einen Prop mit diesem Code theoretisch an einen anderen Prozessor hängen und er kann diese Funktionen nutzen, ein Schachbrett darstellen und steuern, Figuren bewegen, Markierungen setzen, Abfragen, welche Figuren angeklickt wurden, Text in zwei Logfenstern anzeigen usw. Der eigentliche Schachcode braucht sich um diese Sachen nicht mehr zu kümmern, ist völlig davon getrennt. Das gleiche machen ja letztlich auf Softwareebene auch alle Bibliotheken und auch Spin-Objekte, aber im Hive ist man da ein wenig mehr gezwungen die beiden Pole - Hardware und Software - auseinanderzuhalten. Ist wahrscheinlich eine rein mentale Sache, aber ich finde das ganz gut. Was ich aber letztlich sagen will: eine komplexere Struktur wie zum Beispiel ein Nachrichtensystem könnte da die klaren Grenzen wieder verwischen, weil es halt schon wieder ein Stück "virtueller" ist.

Ist so eine Virtualisierung nun gut oder schlecht? Auf der anderen Seite soll der Hive ja auch die Möglichkeit bieten mit seiner "sonderbaren" Struktur zu experimentieren, und wenn es dann sogar möglich wäre mehrere Benutzeranwendungen gleichzeitig zu starten - tolle Geschichte. Aber ich denke, letztlich ist das der Gegenpol zum Retro- und Hardware-Experimentalplattform, also mehr der nächste Schritt (und wahrscheinlich nix für mich ;).

Nochmal zurück zum Ausgangspunkt: Ich denke eine universellere Adressierung wäre vielleicht ganz interessant. In jedem Fall macht sie Erweiterungen einfach, obgleich man auch das wahrscheinlich mit einem kleinen softwaretechnischen Wasserkopf, und damit mit Geschwindigkeit erkauft. Aber die Adressierung muß wirklich einfach und schnell sein, ohne viel Aufwand, da das Ganze ja in Spin laufen soll.
"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
oog
Beiträge: 103
Registriert: Do 30. Jul 2009, 14:12
Kontaktdaten:

Re: TriOS

Beitrag von oog »

drohne235 hat geschrieben:Hmm, der Ogg war schon wieder fleißig - da kommt man kaum nach... ;)
Vielleicht hätte ich Ogg als Nicknamen verwenden sollen anstatt oog. Aber ich finde oog schöner, weil man es mit langgezogenem "O" aussprechen kann. Ich bin ja auch kein CODEC. ;)
drohne235 hat geschrieben:Also, TriOS hatte ich eigentlich als Namen für die überarbeitete Version des jetzigen Codes angedacht, denn so richtig hatten wir ja bisher keinen Namen.
Aaah, also hatte ich das mit dem Namen irgendwie falsch verstanden. Natürlich macht es erstmal Sinn, das bestehende System zu optimieren. :!:

Ist eigentlich am OS weiter gearbeitet worden? Ich meine, wenn man nun Erweiterungen einbringt und testet, sollte vorher klar sein, wo die neuesten offiziellen Sourcen liegen. Nicht, dass man in altem Kram herumwühlt und die Arbeit dann wegwerfen muss, weil an anderer Stelle schon weiterentwickelt wurde.

Ich habe keine Ahnung, wie das SVN bei Guggel-Code funktioniert, :roll: aber wir werden wohl nicht drum herum kommen, dass sich einer bereit erklärt die Sourcen zu pflegen, Erweiterungen, die aus der Community kommen, einzuarbeiten, und den anderen dann als neue Version offiziell bereitzustellen.

Braucht man für den Guggel-Code Zugang zwingend eine Software, oder geht es auch über ein Web-Frontend?
Ich kann damit leben, mir die jeweils aktuelle Version von TriOS aus dem Forum oder von der Homepage zu laden. Das führt vielleicht schneller zum Ziel, als wenn man sich in die Bedienung eines SVN einarbeiten muss.

@drohne:
Kannst Du mal die aktuelle API posten, damit wir gemeinsam überlegen können, was noch fehlt und was man verbessern könnte?
Dies sollte vielleicht in einen neuen Thread "TriOS-API" oder so. Ich bin mir nicht sicher, ob ich tatsächlich die neuesten Sourcen habe, sonst würde ich es selbst machen. Meine neueste ios.spin ist vom 4.6.2009.


Hier ist mein 1. Verbesserungsvorschlag zur API :geek:

API-Versionierung

Wir sollten TriOS von vornherein mit einer Versionierung der API ausstatten. Im Laufe der Zeit werden Funktionen hinzukommen. Dann ist es für ein Programm wichtig, überprüfen zu können, ob die auf dem Hive vorhandenen API-Version die benötigten Funktionen mitbringt, insbesondere, wenn es nach einem Download auf einem anderen Hive mit vielleicht älterer OS-Version laufen soll.

Für die Versionierung schlage ich ein zweistelliges System vor, mit zwei Bytes zur Angabe der Versionsnummer, die dann von 0.0 bis 255.255 zählen.
Beginnen wir beispielsweise mit 1.0.

Solange man OS-Funktionen hinzufügt, ohne bestehende zu ändern, erhöht man die hintere Zahl, also 1.1, 1.2, 1.3 und so weiter. Ein Programm, dass für Version 1.1 compiliert wurde, läuft dann auch auf Version 1.3.

Ergeben sich Änderungen an bereits definierten Funktionen, muss man die vordere Zahl erhöhen und die hintere auf Null setzen, beispielsweise von Version 1.3 auf 2.0.
Der "Loader", der das Programm starten soll, prüft, für welche Version es compilert wurde und gibt gegebenenfalls eine entsprechende Fehlermeldung aus, wenn man versucht, ein Programm, das V2.0 benötigt, auf V1.x zu starten.

Für den Anfang reicht eine simple Funktion, z.B. "ios.getversion", die den Wert $0100 (für 1.0) zurückliefert. Vielleicht tut's am Anfang auch eine globale Variable.

Gruß, oog :B4
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: TriOS

Beitrag von drohne235 »

Ist eigentlich am OS weiter gearbeitet worden? Ich meine, wenn man nun Erweiterungen einbringt und testet, sollte vorher klar sein, wo die neuesten offiziellen Sourcen liegen. Nicht, dass man in altem Kram herumwühlt und die Arbeit dann wegwerfen muss, weil an anderer Stelle schon weiterentwickelt wurde.
Rainer hat an Regime und einige kleine Änderungen an den Flash's gemacht, aber leider kann ich ihn nicht mehr erreichen. :( Um für Erweiterungen eine Basis zu haben räume ich ja grad den bestehenden Code auf und überarbeite ihn. Die gravierendste Änderung ist momentan die Verwendung der FATEngine. Bin grad dabei: da ist einiges zu tun. Das Konzept ist ein wenig anders und ich bin mir jetzt sicher, dass ich auch von der FATEngine eine an den Hive angepasste Version machen muss. So reagieren die Routinen auf Fehler mit der Übergabe eines Stringpointers, der dann auf die Fehlermeldung weist. Das ist zwar lustig, wenn man diese Fehlermeldung gleich ausgeben will, aber so richtig "maschienenlesbar" ist das nicht. Da müssen Fehlernummern rein. Aber letztlich gibt es keine Alternative. Ich ändere lieber die FATEngine (Code gut strukturiert und lesbar), als das fsrw-Objekt (grausig strukturierter Code). Zumal fsrw nicht mit Verzeichnissen umgehen kann, der seek-Code nicht funktioniert und keine Bootfunktion drin ist.

Also momentan bin ich primär mit dem Administra-Code beschäftigt und natürlich mit den entsprechenden Routinen im IOS. Um alles testen zu können wird parallel Regime angepasst.

Ich glaube es lohnt sich das Projekt auf google-code zu nutzen. Leider braucht man dafür aber einen Client, aber ich vermute das es echt nötig ist sobald mehrere am Programm arbeiten. Das System überwacht ständig, ob sich Codeänderungen in die Quere kommen und zeigt die Differenzen auch an. Ich hänge trotzdem mal die aktuelle IOS an.

Eine Versionierung habe ich in einfacher Form schon eingefügt, habe sie aber dreistufig gemacht: Der oberste Versionswert zeigt den grundsätzlichen Typ des Codes an. So kann ja in Bellatrix grad statt dem normalen VGA-Texttreiber mein Chess/Texttreiber laufen, der völlig verschieden ist. Die Routine zur Abfrage heißt "get_version" und fragt momentan Bella und Administra ab. Wahrscheinlich sollte man noch eine Version von Regnatix (quasi Loader/IOS-Version) abfragen. In Regime werden momentan mit dem Kommando "ver" diese Werte erstmal angezeigt.

Für die unteren beiden Versionsnummern finde ich dein System klasse, das werd ich so machen. :)
Dateianhänge
ios.spin
(71.81 KiB) 709-mal heruntergeladen
"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
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: TriOS

Beitrag von drohne235 »

Hey cool: Das Baby bootet schon mit der neuen FAT-Engine und zeigt das Verzeichnis an. :) Er ist halt nur noch ein wenig bockig bei Fehlern - da gibt es keine Meldung, sondern das System hängt nur. Naja, besser als ein Bluescreen...

So, Feierabend für heute - ich will noch eine Stunde den Super-Nerds in "Extraleben" folgen... :mrgreen:
"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
oog
Beiträge: 103
Registriert: Do 30. Jul 2009, 14:12
Kontaktdaten:

Re: TriOS

Beitrag von oog »

drohne235 hat geschrieben:...dass ich auch von der FATEngine eine an den Hive angepasste Version machen muss. Da müssen Fehlernummern rein...
Es überrascht mich immer wieder, wie schnell es Dir gelingt, fremden Code zu assimilieren. Daher bin ich zuversichtlich, dass wir bald eine Testversion mit dem neuen Treiber haben. :shock:

drohne235 hat geschrieben:Eine Versionierung habe ich in einfacher Form schon eingefügt.
Oh ja, das ist eine andere Version, als ich sie habe. Die Versionsabfrage und die Abfrage der belegten Cogs gibt es in meiner Version noch nicht. :?

drohne235 hat geschrieben:Hey cool: Das Baby bootet schon mit der neuen FAT-Engine und zeigt das Verzeichnis an.
Herzlichen Glückwunsch! *Sektkorkenknall* Tataaa. :D
Das Kollektiv freut sich mit Dir.

Toll, dass es jetzt weiter geht. Ich hoffe, Du hältst uns weiter über Deine Fortschritte auf dem laufenden.

oog :B4
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: TriOS

Beitrag von drohne235 »

Nochmal zum Thema Treiber: An diesem Punkt ist es schade, dass es in Spin keine wirkliche vektorielle Ausführung gibt. Routinen über Zeiger auszuführen würde halt eine Virtualisierung schneller machen hab ich so den Eindruck - man setzte einfach ein paar Zeiger um und fertig. In Spin muss man immer einen "Wrapper" als Zwischenschicht verwenden, was natürlich entsprechend langsamer ist. Zumindest hab ich da noch nix gefunden.
"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
oog
Beiträge: 103
Registriert: Do 30. Jul 2009, 14:12
Kontaktdaten:

Re: TriOS

Beitrag von oog »

drohne235 hat geschrieben:Nochmal zum Thema Treiber: An diesem Punkt ist es schade, dass es in Spin keine wirkliche vektorielle Ausführung gibt...
Stellt sich die Frage, wie ich das bei einem Treiber nutzen will.

Ruft man eine Routine über einen Zeiger auf, dann wird der Inhalt des Zeiger in den Adresszähler der CPU geladen. Es erfolgt dann ein Sprung zu gewählten Adresse.
Im Prop-Assembler müsste man bei einem JMP oder CALL-Befehl die unteren neun Bits überschreiben, welche die Zieladresse enthalten, da ein JMP nur eine direkte Adressierung unterstützt. Man muss also einen selbst modifizierenden Code schreiben. In SPIN habe ich noch gar keine adäquate Möglichkeit gefunden.

Beim Propeller müssen wir berücksichtigen, dass Unterprogramme eines Treibers in einer _anderen_ CPU laufen. Ein vektorisierter Programmaufruf über CPUs hinweg kann nicht funktionieren. Die Kommunikation funktioniert wohl nur über einen globalen Speicher (eine Variable), in den man die Funktionsnummer und optionale Parameter ablegt.


Wo ich so darüber nachdenke, drängt sich bei mir folgende Fragestellung auf:

Ich kann ein monolithisches SPIN-Programm für einen Propeller erstellen, das unterschiedliche Tasks für Cogs enthält, die parallel gestartet werden können. Sozusagen ein komplettes BIOS für einen Chip. Soweit ist alles klar. 8-)

Aber kann ich auch ein SPIN-Programm für einen einzelnen Cog schreiben, dieses dann zur Laufzeit nachladen (in einen freien Speicherbereich) und dann in einem freien Cog starten? Oder kann ich nur Programme für den kompletten Chip erzeugen? :?

Kann ich im Bellatrix-BIOS einen kleinen Loader implementieren, dann einen _einzelnen_ Treiber für TV oder VGA laden und starten kann und dann in weiterem freiem Speicher zusätzlich einen Tastaturtreiber laden und starten kann?

Falls das überhaupt geht, können die Treiber dann gegenseiteig ihre Funktionen aufrufen? Dies würde ja einen Link-Vorgang zu Laufzeit erfordern. Das kann doch nicht funktionieren, oder doch?

oog :B4
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: TriOS

Beitrag von drohne235 »

Beim Propeller müssen wir berücksichtigen, dass Unterprogramme eines Treibers in einer _anderen_ CPU laufen. Ein vektorisierter Programmaufruf über CPUs hinweg kann nicht funktionieren.
Mit dem Begriff "Treiber" hab ich mich da wahrscheinlich etwas falsch oder ungenau ausgedrückt. Ich meinte damit alles was softwaretechnisch unterhalb der Anwendung liegt, also ab IOS. Wenn man sich das genau betrachtet hat man da ja folgenden Strang:

Regnatix.[Anwendung --> IOS] --> Slave.[Kommandointerpreter --> Hardwaresteuerung]

Am schönsten wäre es, wenn man in der IOS ein universelles IO-Modell hätte. Ich denke an dem Punkt immer an den Atari 800 zurück: Jeder Treiber hatte dort eine Kennung (S:, K:, D:...) und einen immer gleichen Satz von Routinen (putc, getc, putrec, getrec, status). Die Kennungen und die Zeiger auf die entsprechenden Routinen waren in einer Tabelle zusammengefasst. Für das Betriebssystem war dabei egal um was für ein Gerät es sich handelte. Mit einem Kopierbefehl von D0:test.txt nach S: (Screen) wurde die Datei auf dem Screen ausgegeben. Man konnte es aber auch mit dem gleichen Code in eine andere Datei kopieren. Das ganze würde halt bequem über Zeiger realisiert, die man einfach umhängen konnte. Oder man konnte von E: nach D0:test.txt kopieren. E: war dabei der Screeneditor. So konnte man auf dem Screen einen Text schreiben und wenn man die Tastenkombi für EOF oder so drückte, wurde der Text einfach durch den Kopierbefehl in der Datei gespeichert. Oder man konnte einfach von einer Diskettendatei auf den Drucker kopieren. Das geniale war halt, das der gleiche Code der Kopierroutine nur durch diese Virtualsierung verschiedene Funktionen ausführen konnte, da alle Treiber (oder "Objekte") sich gleich verhalten haben. Es wurden halt Daten von einem Gerät zu einem anderen Gerät kopiert, unabhängig was das genau für ein Gerät war. Das hat funktioniert, weil man alle Geräte auf ein einheitliches und universelles Modell abgebildet hat. (Die Routinen und Namen beim Atari 800 waren im Detail sicher etwas anders, ich kann mich da nicht mehr so genau erinnern, aber das Prinzip war und ist genau so.)

Das macht sich mit Zeigern die man einfach "umhängen" kann ziemlich elegant. Spin kann das leider nicht. Man muß immer einen Code bauen, der das vektorisiert und man muß den Code auch ändern, wenn ein Vektor dazu kommt. In PASM würde das natürlich gehen, da man mit dem selbstmodifizierenden Code quasi Zeiger realisieren kann.
Aber kann ich auch ein SPIN-Programm für einen einzelnen Cog schreiben, dieses dann zur Laufzeit nachladen (in einen freien Speicherbereich) und dann in einem freien Cog starten?
Das geht und wird in Ansätzen ja auch schon zum Beispiel von dem Loader in Regnatix so gemacht. Der Loader (wird in den EEProm geflasht) ist quasi ein Miniprogramm, welches eine beliebige BIN-Datei an eine definierte Stelle in den hRAM lädt und dann eine Cog mit diesem Code startet. Da der Loader im Prinzip die Größe und Ladeadresse des Spin-Objektes kennt, kann er auch ein weitere Objekte in den noch verbleibenden Speicher laden. Im Prinzip - das bedeutet, eine Verwaltung von MEHREREN Objekten ist momentan im Regnatix-Loader nicht integriert, aber es wäre mäglich. Wenn du in der Kommandozeile eine BIN-Datei startest, so wird dem Loader der Dateiname übergeben und ein Signal mit einem Flag an den Loader gesendet, damit dieser in Aktion treten kann. Der Loader knipst nun allen aktuell laufenden COG's die Lichter aus (außer sich selbst natürlich ;) und startet ein neues Spin-Objekt in einer Cog im Speicher. Der Loader läuft also immer resident im Hintergrund.
Kann ich im Bellatrix-BIOS einen kleinen Loader implementieren, dann einen _einzelnen_ Treiber für TV oder VGA laden und starten kann und dann in weiterem freiem Speicher zusätzlich einen Tastaturtreiber laden und starten kann?
Im Prinzip kann man das mit einem erweiterten Loader wie oben beschrieben. Direkt in Spin ist das aber nicht vorgesehen, was bedeutet, man hat keinen einfach Spin-Befehl "loadobj xyz.bin". Ist auch klar, da der Propeller als Mikrocontroller ja sowas nicht unbedingt braucht. Für Bella und Administra fände ich das auch (noch) etwas zu komplex, aber prinzipiell bräuchte man nur eine entsprechende Routine schreiben, bzw. die bestehende erweitern. In PASM könnte man so einen Loader mit Sicherheit auch inklusive der zugehörigen hRAM-Verwaltung komplett in einer Cog unterbringen - das wäre der Königsweg (oder in unserem Fall der "Regnatixweg" :).
Falls das überhaupt geht, können die Treiber dann gegenseiteig ihre Funktionen aufrufen? Dies würde ja einen Link-Vorgang zu Laufzeit erfordern. Das kann doch nicht funktionieren, oder doch?

Direkt durch einen Spin-Aufruf geht das nach meinem Wissen nicht, denn da wären ja die Aufrufe der Routinen + Adressen durch den Compiler erzeugt, was schwer zur Laufzeit änderbar ist, und es ist ja unbestimmt, wo sich die Objekte zur Laufzeit befinden. Man kann also nicht direkt durch eine laufende Spin-Cog den Code einer Funktion eines anderen Objektes aufrufen. Allerdings kann man durchaus die Funktionalität aufrufen. :) Bei dem oben beschriebenen Loder wird das ja gemacht, wenn eine Anwendung wie Regime ein anderes Programm (BIN-Datei) startet. Dann sendet ein Objekt/Cog (die Anwendung) ein Signal an ein anderes Objekt/Cog (den Loader), der dann diese Funktionalität ausführt. Ist hat echtes Multitasking in Hardware... :mrgreen:

Aber nebenbei mal ein anderes Thema über das ich grad grüble: Die abort-Direktive. In der FATEngine wird davon reichlich gebrauch gemacht. Ich selbst hab bisher immer versucht das zu umgehen - mehr aus dem Grund weil ich keine Notwendigkeit dafür hatte - und ich muß sagen, dass ich da intuitiv richtig liege. Denn: ABORT IST ECHT ABORT! Ich kann nur jedem empfehlen davon die Finger zu lassen. Ich suche gerade die Ursache für einen falschen Rückgabewert, aber wenn man nicht genau sagen kann, woher dieser Wert stammt, da man ja bei "abort" der Return-Pfad nicht deterministisch ist, dann ist das echt Mist! Also echt: In Basic gab es das goto für den perfekt chaotischen Spaghetticode, da ist man froh das es solchen Unsinn in Spin nicht gibt, aber abort ist quasi die "inverse" Variante des Goto, denn es macht Spaghettireturncode. Absolut grausig das! :B4
"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
oog
Beiträge: 103
Registriert: Do 30. Jul 2009, 14:12
Kontaktdaten:

Re: TriOS

Beitrag von oog »

drohne235 hat geschrieben:Aber nebenbei mal ein anderes Thema über das ich grad grüble: Die abort-Direktive... ABORT IST ECHT ABORT! Ich kann nur jedem empfehlen davon die Finger zu lassen. Ich suche gerade die Ursache für einen falschen Rückgabewert, aber wenn man nicht genau sagen kann, woher dieser Wert stammt, da man ja bei "abort" der Return-Pfad nicht deterministisch ist, dann ist das echt Mist!... Absolut grausig das!
Genau so liest es sich auch in der etwas chaotischen Beschreibung. :shock: Es ist jedenfalls nicht mit dem "break" von C vergleichbar, das jeweils die übergeordnete Struktur, beispielsweise eine "switch" Anweisung verlässt.

Per Definition wird mit "abort" immer eine Subroutine verlassen.

Code: Alles auswählen

ABORT is one of two commands (ABORT and RETURN) that terminate a PUB or PRI method’s execution.
So weit so gut, aber das mit dem Rückgabe-Wert ist etwas konfus:

Code: Alles auswählen

ABORT causes a return from a PUB or PRI method with abort status; meaning it pops the call stack repeatedly until either the call stack is empty or it reaches a caller with an Abort Trap, ( \ ), and delivers a value in the process.
Was ist denn ein "Abort Trap"? Vielleicht die Falle, die Abort dem Programmierer stellt. :lol:
drohne235 hat geschrieben:Am schönsten wäre es, wenn man in der IOS ein universelles IO-Modell hätte. Ich denke an dem Punkt immer an den Atari 800 zurück:...
Ja, die alten Kisten hatten schon was. Wichtig ist, dass IO-Routinen auf eine zentrale Zeichen-Eingabe und -Ausgabe zurückgreifen. Dann kann man alles umleiten. Beispielsweise kann man die Eingabe zur Shell von Tastatur auf eine Datei umleiten und sofort wird die Datei als Batch ausgeführt. Auch die von Dir beschriebenen Funktionen des Atari wären damit wohl möglich.

Gruß, oog :B4
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: TriOS

Beitrag von drohne235 »

Was ist denn ein "Abort Trap"? Vielleicht die Falle, die Abort dem Programmierer stellt.
Genau so sieht es aus. Einfach ausgedrückt, saust der Code zurück bis zu einer Stellen an der man mit "\routine" (die Betonung liegt hier auf dem Backslash) ein Geflecht von Routinen aufruft. Natürlich erhält man keine Information, von welcher Ebene der Verschachtelung man "beamt". Da ist ein "break" wirklich ein sehr geordneter Ansatz, da man ja wenigstens die Quelle verorten kann.

Und wie du treffend sagst, stellt man mit dem Backslash als Programmierer eine Falle - allerdings auch für die Psyche anderer Programmierer... ;)

Aber ich habe den Fehler jetzt geortet und die Arbeit geht weiter. Ansonsten ist der Code eigentlich ganz gut, wenn da nicht die extreme Verwendung von Strings als Parameter wäre. Die Rückgabewerte habe ich ja schon auf universellere Fehlernummern umgestellt. Jetzt hab ich aber auch noch eine andere "Falle" gefunden: Der Modus (R - Read, W - Write, A - Append) wird dort auch als Zeiger auf einen 0-term String erwartet, was schon ein wenig seltsam ist, denn es reicht ja quasi ein 1-Byte-Parameter mit dem entsprechenden Zeichen. Naja, Gefahr erkannt, Gefahr gebannt... :) Zwei Zeilen Code geändert und es geht jetzt.

Dafür sind im Gegensatz zum fsrw wirklich tolle Funktionen leicht realisierbar: Volumelabel, Anzahl freier und genutzter Sektoren, Volume gemounted, Datei geöffnet - kann alles jetzt einfach per IOS-Funktion abgefragt werden. Ich fräse mich da jetzt systematisch und stückweise durch und erarbeite gleich noch die Dokumentation direkt im Propellertool. Das ist im Propeller Tool ganz gut gelöst: per "Summary" bzw. "Documentation" Schalter kann man sich das gut anzeigen lassen und auch abspeichern, um es in einer Doku einzufügen. So hat man die Doku gleich im Quelltext und auch in einem getrennten Text und kann es mit relativ geringem Aufwand pflegen.
Dateianhänge
Documentation-Ansicht
Documentation-Ansicht
Summary-Ansicht
Summary-Ansicht
Testprogramm
Testprogramm
"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