Opcja 1: Języki interpretowane
To nie odpowiada bezpośrednio na pytanie (które jest doskonałym pytaniem, BTW i mam nadzieję wyciągnąć naukę z odpowiedzi, która odnosi się do niego bezpośrednio), ale jest bardzo częste podczas wykonywania projektów, które mogą ładować programy zewnętrzne w celu pisania programów zewnętrznych język interpretowany. Jeśli zasoby są napięte (które będą na tym procesorze, czy myślałeś o użyciu do tego PIC32 lub małego procesora ARM?), Często ogranicza się język do podzbioru pełnej specyfikacji. Jeszcze niżej znajdują się języki specyficzne dla domeny, które robią tylko kilka rzeczy.
Na przykład projekt elua jest przykładem języka interpretowanego o niskim poziomie zasobów (64 kB RAM). Możesz zmniejszyć to do 32 KB pamięci RAM, jeśli usuniesz niektóre funkcje (Uwaga: nie będzie działać na bieżącym procesorze, który jest architekturą 8-bitową. Korzystanie z zewnętrznej pamięci RAM prawdopodobnie będzie zbyt wolne dla grafiki). Zapewnia szybki, elastyczny język, w którym nowi użytkownicy mogliby z łatwością programować gry, jeśli zapewnią minimalny interfejs API. Istnieje wiele dokumentacji dostępnych dla tego języka online. Są inne języki (jak Forth i Basic), których można użyć w podobny sposób, ale myślę, że Lua jest obecnie najlepszą opcją.
W podobny sposób możesz stworzyć własny język specyficzny dla domeny. Musisz podać pełnoprawny interfejs API i zewnętrzną dokumentację, ale jeśli wszystkie gry byłyby podobne, nie byłoby to zbyt trudne.
W każdym razie PIC18 prawdopodobnie nie jest procesorem, którego użyłbym do czegoś, co wymaga niestandardowego programowania / skryptów i grafiki. Być może znasz tę klasę procesorów, ale sugerowałbym, że byłby to dobry czas na użycie czegoś ze sterownikiem ekranu i większą pamięcią.
Opcja 2: Po prostu przeprogramuj całość
Jeżeli jednak jesteś już planuje programowania wszystkie gry się w C, to nie przejmuj się ładuje tylko logikę gry z karty SD. Masz tylko 32kB Flasha do przeprogramowania i możesz łatwo uzyskać kartę microSD o pojemności 4 GB. (Uwaga: większe karty są często SDHC, z którymi trudniej jest się połączyć). Zakładając, że używasz każdego ostatniego bajtu swojego 32 kB, co pozostawia miejsce na karcie SD na 131 072 kopii oprogramowania układowego z dowolną logiką gry, jakiej potrzebujesz.
Istnieje wiele aplikacji do pisania programów ładujących dla PIC, takich jak AN851 . Musisz zaprojektować program ładujący tak, aby zajmował określony region pamięci (prawdopodobnie górną część regionu pamięci, określiłbyś to w linkerze) i określił, że projekty pełnego oprogramowania układowego nie docierają do tego regionu. W przypisie wyjaśniono to bardziej szczegółowo. Wystarczy zamienić „sekcję rozruchową PIC18F452” na „sekcję rozruchową, którą określam w linkerze”, a wszystko to będzie miało sens.
Następnie program ładujący musi tylko pozwolić użytkownikowi wybrać program do uruchomienia z karty SD i skopiować całość. Interfejs użytkownika może oznaczać, że użytkownik musi przytrzymać przycisk, aby przejść do trybu wyboru. Zwykle bootloader sprawdza status tego przycisku po zresetowaniu i, jeśli nie jest przytrzymany, uruchamia się w grze. Jeśli zostanie przytrzymany, użytkownik musi wybrać plik na karcie SD, skopiować program i kontynuować uruchamianie w [nowej] grze.
To jest moje obecne zalecenie.
Opcja 3: Głęboka magia polegająca na przechowywaniu tylko części pliku hex
Problem z przewidywanym mechanizmem polega na tym, że procesor nie obsługuje interfejsów API i wywołań funkcji, zajmuje się liczbami - adresami, do których wskaźnik instrukcji może przeskakiwać i oczekiwać, że pojawi się kod wykonujący wywołanie funkcji zgodnie ze specyfikacją API. Jeśli spróbujesz skompilować tylko część programu, linker nie będzie wiedział, co zrobić, gdy zadzwonisz check_button_status()
lub toggle_led()
. Możesz wiedzieć, że funkcje te istnieją w pliku szesnastkowym procesora, ale musi dokładnie wiedzieć, pod jakim adresem się znajdują.
Linker już dzieli twój kod na wiele sekcji; Teoretycznie można przełamać to na dodatkowe sekcje z niektórymi -section
i #pragma
zaklęć. Nigdy tego nie robiłem i nie wiem jak. Dopóki powyższe dwie metody mnie nie zawiodą (lub ktoś nie opublikuje tutaj niesamowitej odpowiedzi), prawdopodobnie nie nauczę się tego mechanizmu, więc nie mogę cię tego nauczyć.