Brainstorming zum Administra-Loader
Verfasst: Sa 15. Aug 2009, 17:38
Wie man an diversen Beiträgen im Forum sehen kann, stellt der Loader für Administra ein zentrales Problem dar, welches wir noch gemeinsam lösen müssen. Deshalb denke ich, ist es vielleicht an der Zeit diesem Hindernis jetzt ein wenig zu Leibe zu rücken.
Vielleicht an erster Stelle nochmal grundlegend: Warum ist der Administra-Loader so wichtig? Bisher haben wir für zwei der drei Propellerchips, für Regnatix und Bellatrix, schon einen funktionierenden Loader. Solch eine Struktur bietet für den Hive die maximale Flexibilität: Unabhängig von dem konkreten Code der beim Systemstart in die beiden Propeller geladen wird, kann jede Anwendung zur Laufzeit einen eigenen Code in die Propeller laden und somit eine komplette eigene Laufzeitumgebung schaffen. Es gibt dabei keine Inkompatibilitäten, wenn sich der normale Funktionsumfang, z.B. des Bildschirmtreibers vga.bin ändert, wenn jedes Programm seinen eigenen Treiber mitbringt und startet. Unabhängig von Kompatibilittsproblemen hat man durch diese Methode auch die Möglichkeit, alle Ressourcen wirklich selbst zu kontrollieren. Nehmen wir an, die eigene Anwendung benötigt weiter Ressourcen um die Performance zu steigern und in Regnatix sind schon alle Kerne in Verwendung, so können mit einem eigenen Code in Bellatrix evtl. dort freie Kerne in die Verarbeitung mit einbezogen werden.
Auch wird es sicher so sein, dass sich auf dem Hive vielleicht verschiedene experimentelle Systeme etablieren - ob Betriebssystem, Anwenderprogramm oder Game - schön wäre es für all diese Experimente, eine gemeinsame Basis zu besitzen, ohne die EEProms umzuflashen. Der kleinste gemeinsame Nenner für all diese Projekte ist eine universelle Loaderstruktur für alle drei Propellerchips. Bellatrix und Regnatix besitzen einen Loader, Administra fehlt noch in diesem heiligen Reigen.
So sieht der momentane Systemstart aus
- Administra startet ihr komplettes BIOS aus dem EEProm und stellt ihre Funktionen auf dem Bus zur Verfügung.
- Bellatrix startet ihren Loader aus dem EEProm und wartet auf die Übertragung einer BIN-Datei als Treibercode.
- Regnatix startet ihren Loader aus dem EEProm. Dieser öffnet über Administra die Datei "sys.bin" auf der SD-Card (eine ganz normale BIN-Datei), lädt diese in den HubRam und startet den Code. Der Loader in Regnatix bleibt dabei resident und wird vom IOS zum laden von Programmen benutzt.
- Diese gestartete BIN-Datei (sys.bin) in Regnatix öffnet die BIN-Datei für den Grafiktreiber (normalerweise vid.bin) und überträgt diese Datei zum Bellatrix-Chip. Bellatrix empfängt diese Datei, speichert sie im HubRam und startet sie danach - das Grafiksubsystem läuft an. So initialisiert Regnatix Bellatrix.
- Das Anwendersystem in "sys.bin" hat nun die Grafik initialisiert und damit stehen der Anwendung (meist die Kommandozeile "Regime" die sich in "sys.bin" befindet) alle Funktionen von Administra und Bellatrix zur Verfügung.
Kurz sieht das fogendermaßen aus:
EEProm --> Administra (Bios)
sd-card/sys.bin --> Regnatix (Anwendung)
sd-card/vid.bin --> Bellatrix (Grafiktreiber)
Aktuelle Struktur
Zwar wird der Programmcode von Administra und Bellatrix momentan noch in unterschiedlicher Weise beim Systemstart initialisiert, aber bei beiden Chips gleicht sich die grundlegende Struktur, denn beide Damen stellen Regnatix ihre Funktionen zur Verfügung. In beiden Chips ist eine COG als Funktions- und Buscontroller abgestellt: Dieser lauscht am Bus ob Regnatix eine Funktion abruft und steuert dabei den Ablauf der Funktionsausführung. Zu jeder Funktion gibt es in dem Objekt "ios.spin" eine Routine, welche die entsprechende Funktion in einem Programm abrufbar macht. Die entsprechende Routine im ios und in den Slaves müssen im Ablauf dabei genau aufeinander abgestimmt sein.
Momentan gibt es für Administra in TriOS zwei BIOS-Versionen:
os-1-adm-bios.spin Stack/Free ~1250 Longs
os-1-adm-biosw.spin Stack/Free ~550 Longs
Die "biosw"-Version enthält dabei eine noch nicht korrekt funktionierende Version von Routinen, um Wav-Dateien direkt von SD abspielen zu können. Das entsprechenden Kommandozeilentool "wplay" benutzt diese Funktionen. Es ist natürlich fraglich, ab man einen solchen Player unbedingt braucht - für mich war es ein interessantes Experiment. Zu beachten ist außerdem, dass es sich bei beiden Versionen bzgl. der verwendetetn Puffer wirklich nur um eine erste Näherung handelt. So wird aktuell 16384 KByte Puffer für HSS-Dateien reserviert, wenn ich die momentan verfügbaren Sounddateien anschaue finde ich aber nur wenige, welche größer 10 KByte sind und wahrscheinlich könnte man diese ebenso optimieren. Was ich damit sagen will ist folgendes: Hier ist noch viel Raum für Optimierungen.
Der TCP/IP-Socket aus dem PropTCP-Projekt von Harrison Pham ist 2186 Longs groß, da wird es also mächtig eng wenn man das übernehmen möchte.
Problem eines Administra-Loaders
Neben der verfügbaren Speichergröße gibt es aber noch ein anderes Problem bei der Realisierung eines Loaders für Administra. Betrachtet man die Loader für Regnatix und Bellatrix erkennt man folgendes: Beide Codes können sehr klein gehalten werden, da sie die fsrw-Routinen von Administra nutzen. Das ist für Administra selbst aber nicht möglich, ein Loader mit der gleichen Struktur müsste also selbst ein fsrw enthalten und somit wäre er auch wesentlich großer als bei den anderen beiden Propellerchips im Hive.
Realisierungsvarianten
Ich denke schon einige Zeit über dieses Problem nach, komme aber immer noch nicht auf ein einfaches Konzept. Was wäre eigentlich die Wunschvorstellung?
- Der Code von Administra sollte zur Laufzeit durch eine Anwendung ausgetauscht werden können.
- So könnte man verschiedene modulare Versionen mit speziellem Funktionsumfang realisieren.
- Struktur und Handhabung sollte so einfach wie möglich sein.
- Der Wechsel des Administracodes sollte in möglichst kurzer Zeit stattfinden.
Mir sind bisher folgende Varianten eingefallen:
1. Loader über Regnatix: Einfacher Loader wie in Bellatrix; der Code wird von Regnatix in den externen Ram geladen und danach findet ein upload zu Administra statt.
2. Loader enthält fsrw, startet restliche Funktionen im Heap und routet die geladenen fsrw-Funktionen zum geladenen Code (unübersichtlich/kompliziert)
3. Loader lädt Treiber in Heap, verschiebt danach den Code nach unten und startet ihn; restlicher Platz oberhalb wird universeller Puffer für Sound/LAN/Screens
4. Größerer EEProm und ein SPI-Loader, welcher die EEProm-Blöcke selektiv startet.
5. Administra-Funktionen zum flashen des EEProms und für Reset; Treiber wird zur Laufzeit umgeflasht und macht dann einen Reset.
6. Kombination aus 4. & 5.
Ansonsten bleibt natürlich auch noch die bisherige Variante: Der "perfekte" Administra-Code ohne Loader fest im EEProm. Ist zwar unflexibel, aber einfach und funktioniert. So richtig haut mich das alles noch nicht um, am einfachsten finde ich noch Version 4/5/6 - das ist recht einfach in der Handhabung und man müsste mal testen wie schnell das geht. Das könnte man mit ein oder zwei Routinen erledigen, wie groß der Codeumfang dabei ist muß ich mal recherchieren. Femto-Basic enthält entsprechende Routinen (sdspiFemto.spin), an denen man sich orientieren könnte, aber der ist mit 700 Longs auch recht fett. Mal schauen, vielleicht findet sich noch ein schlanker Code direkt in Spin der entsprechend kleiner ist.
Ok, hat noch jemand eine Eingebung?
Vielleicht an erster Stelle nochmal grundlegend: Warum ist der Administra-Loader so wichtig? Bisher haben wir für zwei der drei Propellerchips, für Regnatix und Bellatrix, schon einen funktionierenden Loader. Solch eine Struktur bietet für den Hive die maximale Flexibilität: Unabhängig von dem konkreten Code der beim Systemstart in die beiden Propeller geladen wird, kann jede Anwendung zur Laufzeit einen eigenen Code in die Propeller laden und somit eine komplette eigene Laufzeitumgebung schaffen. Es gibt dabei keine Inkompatibilitäten, wenn sich der normale Funktionsumfang, z.B. des Bildschirmtreibers vga.bin ändert, wenn jedes Programm seinen eigenen Treiber mitbringt und startet. Unabhängig von Kompatibilittsproblemen hat man durch diese Methode auch die Möglichkeit, alle Ressourcen wirklich selbst zu kontrollieren. Nehmen wir an, die eigene Anwendung benötigt weiter Ressourcen um die Performance zu steigern und in Regnatix sind schon alle Kerne in Verwendung, so können mit einem eigenen Code in Bellatrix evtl. dort freie Kerne in die Verarbeitung mit einbezogen werden.
Auch wird es sicher so sein, dass sich auf dem Hive vielleicht verschiedene experimentelle Systeme etablieren - ob Betriebssystem, Anwenderprogramm oder Game - schön wäre es für all diese Experimente, eine gemeinsame Basis zu besitzen, ohne die EEProms umzuflashen. Der kleinste gemeinsame Nenner für all diese Projekte ist eine universelle Loaderstruktur für alle drei Propellerchips. Bellatrix und Regnatix besitzen einen Loader, Administra fehlt noch in diesem heiligen Reigen.
So sieht der momentane Systemstart aus
- Administra startet ihr komplettes BIOS aus dem EEProm und stellt ihre Funktionen auf dem Bus zur Verfügung.
- Bellatrix startet ihren Loader aus dem EEProm und wartet auf die Übertragung einer BIN-Datei als Treibercode.
- Regnatix startet ihren Loader aus dem EEProm. Dieser öffnet über Administra die Datei "sys.bin" auf der SD-Card (eine ganz normale BIN-Datei), lädt diese in den HubRam und startet den Code. Der Loader in Regnatix bleibt dabei resident und wird vom IOS zum laden von Programmen benutzt.
- Diese gestartete BIN-Datei (sys.bin) in Regnatix öffnet die BIN-Datei für den Grafiktreiber (normalerweise vid.bin) und überträgt diese Datei zum Bellatrix-Chip. Bellatrix empfängt diese Datei, speichert sie im HubRam und startet sie danach - das Grafiksubsystem läuft an. So initialisiert Regnatix Bellatrix.
- Das Anwendersystem in "sys.bin" hat nun die Grafik initialisiert und damit stehen der Anwendung (meist die Kommandozeile "Regime" die sich in "sys.bin" befindet) alle Funktionen von Administra und Bellatrix zur Verfügung.
Kurz sieht das fogendermaßen aus:
EEProm --> Administra (Bios)
sd-card/sys.bin --> Regnatix (Anwendung)
sd-card/vid.bin --> Bellatrix (Grafiktreiber)
Aktuelle Struktur
Zwar wird der Programmcode von Administra und Bellatrix momentan noch in unterschiedlicher Weise beim Systemstart initialisiert, aber bei beiden Chips gleicht sich die grundlegende Struktur, denn beide Damen stellen Regnatix ihre Funktionen zur Verfügung. In beiden Chips ist eine COG als Funktions- und Buscontroller abgestellt: Dieser lauscht am Bus ob Regnatix eine Funktion abruft und steuert dabei den Ablauf der Funktionsausführung. Zu jeder Funktion gibt es in dem Objekt "ios.spin" eine Routine, welche die entsprechende Funktion in einem Programm abrufbar macht. Die entsprechende Routine im ios und in den Slaves müssen im Ablauf dabei genau aufeinander abgestimmt sein.
Momentan gibt es für Administra in TriOS zwei BIOS-Versionen:
os-1-adm-bios.spin Stack/Free ~1250 Longs
os-1-adm-biosw.spin Stack/Free ~550 Longs
Die "biosw"-Version enthält dabei eine noch nicht korrekt funktionierende Version von Routinen, um Wav-Dateien direkt von SD abspielen zu können. Das entsprechenden Kommandozeilentool "wplay" benutzt diese Funktionen. Es ist natürlich fraglich, ab man einen solchen Player unbedingt braucht - für mich war es ein interessantes Experiment. Zu beachten ist außerdem, dass es sich bei beiden Versionen bzgl. der verwendetetn Puffer wirklich nur um eine erste Näherung handelt. So wird aktuell 16384 KByte Puffer für HSS-Dateien reserviert, wenn ich die momentan verfügbaren Sounddateien anschaue finde ich aber nur wenige, welche größer 10 KByte sind und wahrscheinlich könnte man diese ebenso optimieren. Was ich damit sagen will ist folgendes: Hier ist noch viel Raum für Optimierungen.
Der TCP/IP-Socket aus dem PropTCP-Projekt von Harrison Pham ist 2186 Longs groß, da wird es also mächtig eng wenn man das übernehmen möchte.
Problem eines Administra-Loaders
Neben der verfügbaren Speichergröße gibt es aber noch ein anderes Problem bei der Realisierung eines Loaders für Administra. Betrachtet man die Loader für Regnatix und Bellatrix erkennt man folgendes: Beide Codes können sehr klein gehalten werden, da sie die fsrw-Routinen von Administra nutzen. Das ist für Administra selbst aber nicht möglich, ein Loader mit der gleichen Struktur müsste also selbst ein fsrw enthalten und somit wäre er auch wesentlich großer als bei den anderen beiden Propellerchips im Hive.
Realisierungsvarianten
Ich denke schon einige Zeit über dieses Problem nach, komme aber immer noch nicht auf ein einfaches Konzept. Was wäre eigentlich die Wunschvorstellung?
- Der Code von Administra sollte zur Laufzeit durch eine Anwendung ausgetauscht werden können.
- So könnte man verschiedene modulare Versionen mit speziellem Funktionsumfang realisieren.
- Struktur und Handhabung sollte so einfach wie möglich sein.
- Der Wechsel des Administracodes sollte in möglichst kurzer Zeit stattfinden.
Mir sind bisher folgende Varianten eingefallen:
1. Loader über Regnatix: Einfacher Loader wie in Bellatrix; der Code wird von Regnatix in den externen Ram geladen und danach findet ein upload zu Administra statt.
2. Loader enthält fsrw, startet restliche Funktionen im Heap und routet die geladenen fsrw-Funktionen zum geladenen Code (unübersichtlich/kompliziert)
3. Loader lädt Treiber in Heap, verschiebt danach den Code nach unten und startet ihn; restlicher Platz oberhalb wird universeller Puffer für Sound/LAN/Screens
4. Größerer EEProm und ein SPI-Loader, welcher die EEProm-Blöcke selektiv startet.
5. Administra-Funktionen zum flashen des EEProms und für Reset; Treiber wird zur Laufzeit umgeflasht und macht dann einen Reset.
6. Kombination aus 4. & 5.
Ansonsten bleibt natürlich auch noch die bisherige Variante: Der "perfekte" Administra-Code ohne Loader fest im EEProm. Ist zwar unflexibel, aber einfach und funktioniert. So richtig haut mich das alles noch nicht um, am einfachsten finde ich noch Version 4/5/6 - das ist recht einfach in der Handhabung und man müsste mal testen wie schnell das geht. Das könnte man mit ein oder zwei Routinen erledigen, wie groß der Codeumfang dabei ist muß ich mal recherchieren. Femto-Basic enthält entsprechende Routinen (sdspiFemto.spin), an denen man sich orientieren könnte, aber der ist mit 700 Longs auch recht fett. Mal schauen, vielleicht findet sich noch ein schlanker Code direkt in Spin der entsprechend kleiner ist.
Ok, hat noch jemand eine Eingebung?