Option 1: Interpretierte Sprachen
Dies beantwortet die Frage nicht direkt (was übrigens eine hervorragende Frage ist, und ich hoffe, aus einer Antwort zu lernen, die sie direkt anspricht), aber es ist sehr häufig, wenn Projekte ausgeführt werden, in die externe Programme geladen werden können, um die externen Programme zu schreiben eine interpretierte Sprache. Wenn die Ressourcen knapp sind (welche Ressourcen auf diesem Prozessor sind, haben Sie darüber nachgedacht, einen PIC32- oder kleinen ARM-Prozessor zu verwenden?), Ist es üblich, die Sprache auf eine Teilmenge der vollständigen Spezifikation zu beschränken. Noch weiter unten in der Kette befinden sich domänenspezifische Sprachen, die nur ein paar Dinge tun.
Das elua-Projekt ist beispielsweise ein Beispiel für eine ressourcenarme (64 kB RAM) interpretierte Sprache. Sie können dies auf 32 KB RAM reduzieren, wenn Sie einige Funktionen entfernen (Hinweis: Auf Ihrem aktuellen Prozessor, einer 8-Bit-Architektur, funktioniert dies nicht. Die Verwendung von externem RAM ist für Grafiken wahrscheinlich zu langsam). Es bietet eine schnelle, flexible Sprache, in der neue Benutzer Spiele problemlos programmieren können, wenn Sie eine minimale API bereitstellen. Für die Sprache Online steht eine Vielzahl von Dokumentationen zur Verfügung. Es gibt andere Sprachen (wie Forth und Basic), die Sie auf ähnliche Weise verwenden könnten, aber ich denke, dass Lua derzeit die beste Option ist.
In ähnlicher Weise können Sie Ihre eigene domänenspezifische Sprache erstellen. Sie müssten eine umfassendere API und externe Dokumentation bereitstellen, aber wenn die Spiele alle ähnlich wären, wäre dies nicht allzu schwierig.
In jedem Fall ist der PIC18 wahrscheinlich nicht der Prozessor, den ich für etwas verwenden würde, das kundenspezifische Programmierung / Skripterstellung und Grafiken umfasst. Sie sind vielleicht mit dieser Prozessorklasse vertraut, aber ich würde vorschlagen, dass dies ein guter Zeitpunkt ist, um etwas mit einem Bildschirmtreiber und mehr Speicher zu verwenden.
Option 2: Programmieren Sie einfach das Ganze neu
Wenn Sie jedoch bereits vorhaben, alle Spiele selbst in C zu programmieren, müssen Sie nicht nur die Spielelogik von der SD-Karte laden . Sie müssen nur 32 kB Flash neu programmieren und können problemlos eine 4-GB-microSD-Karte dafür erwerben. (Hinweis: Bei größeren Karten handelt es sich häufig um SDHC-Karten, mit denen eine Schnittstelle schwieriger ist.) Angenommen, Sie verwenden jedes letzte Byte Ihrer 32 kB, so bleibt auf der SD-Karte Platz für 131.072 Kopien Ihrer Firmware mit der von Ihnen benötigten Spielelogik.
Es gibt viele Appnotes zum Schreiben von Bootloadern für PICs wie AN851 . Sie müssen Ihren Bootloader so gestalten, dass er einen bestimmten Speicherbereich belegt (wahrscheinlich den oberen Bereich des Speicherbereichs, den Sie im Linker angeben würden), und angeben, dass die vollständigen Firmware-Projekte diesen Bereich nicht erreichen. In der Appnote wird dies näher erläutert. Ersetzen Sie einfach "Boot-Bereich des PIC18F452" durch "Boot-Bereich, den ich im Linker angegeben habe", und alles macht Sinn.
Dann muss Ihr Bootloader dem Benutzer lediglich erlauben, ein Programm auszuwählen, das von der SD-Karte ausgeführt werden soll, und das Ganze zu kopieren. Eine Benutzeroberfläche kann sein, dass der Benutzer einen Druckknopf gedrückt halten muss, um in den Auswahlmodus zu gelangen. Normalerweise überprüft der Bootloader beim Zurücksetzen nur den Status dieser Schaltfläche und bootet das Spiel, wenn er nicht gedrückt gehalten wird. Wenn es gedrückt gehalten wird, muss der Benutzer eine Datei auf der SD-Karte auswählen, das Programm kopieren und mit dem Booten des [neuen] Spiels fortfahren können.
Dies ist meine aktuelle Empfehlung.
Option 3: Deep Magic, bei dem nur ein Teil der Hex-Datei gespeichert wird
Das Problem mit Ihrem geplanten Mechanismus besteht darin, dass der Prozessor keine APIs und Funktionsaufrufe verarbeitet, sondern nur Zahlen - Adressen, zu denen der Befehlszeiger springen kann, und erwartet, dass Code vorhanden ist, der einen Funktionsaufruf gemäß einer API-Spezifikation ausführt. Wenn Sie versuchen, nur einen Teil des Programms zu kompilieren, weiß der Linker nicht, was zu tun ist, wenn Sie check_button_status()
oder aufrufen toggle_led()
. Möglicherweise wissen Sie, dass diese Funktionen in der Hex-Datei auf dem Prozessor vorhanden sind, aber es muss genau bekannt sein, unter welcher Adresse sie sich befinden.
Der Linker unterteilt Ihren Code bereits in mehrere Abschnitte. Sie könnten dies theoretisch in zusätzliche Abschnitte mit einigen -section
und #pragma
Beschwörungsformeln aufteilen. Ich habe das noch nie gemacht und weiß nicht wie. Solange die beiden oben genannten Methoden nicht erfolgreich sind (oder jemand hier eine großartige Antwort veröffentlicht), lerne ich diesen Mechanismus wahrscheinlich nicht und kann es Ihnen daher nicht beibringen.