オプション1:解釈された言語
これは直接質問に答え(これは素晴らしい質問です、ところで、私はそれに直接対処する答えから学びたいと思っています)が、外部プログラムをロードして外部プログラムを書くことができるプロジェクトを行うときは非常に一般的ですインタプリタ言語。リソースが限られている場合(このプロセッサ上にある場合、PIC32または小さなARMプロセッサを使用することを考えましたか?)、言語を完全な仕様のサブセットに制限するのが一般的です。チェーンのさらに下にあるのは、ドメイン固有の言語であり、いくつかのことだけを行います。
たとえば、eluaプロジェクトは、低リソース(64 kB RAM)の解釈言語の例です。一部の機能を削除すると、これを32kのRAMに圧縮できます(注:8ビットアーキテクチャである現在のプロセッサでは機能しません。外部RAMの使用はおそらくグラフィックスには遅すぎます)。最小限のAPIを提供すれば、新しいユーザーが簡単にゲームをプログラムできる高速で柔軟な言語を提供します。オンライン言語用のドキュメントがたくさんあります。同様の方法で使用できる他の言語(ForthやBasicなど)もありますが、現時点ではLuaが最適な選択肢であると思います。
同様に、独自のドメイン固有言語を作成できます。より本格的なAPIと外部ドキュメントを提供する必要がありますが、ゲームがすべて類似している場合、これはそれほど難しくありません。
いずれにせよ、PIC18はおそらく、カスタムプログラミング/スクリプティングおよびグラフィックスを伴うものに使用するプロセッサではありません。このクラスのプロセッサに精通している方もいるかもしれませんが、ディスプレイドライバーとより多くのメモリを備えた何かを使用する良い機会になることをお勧めします。
オプション2:全体を再プログラムする
ただし、すべてのゲームを自分でCでプログラミングすることを既に計画している場合は、SDカードからゲームロジックのみをロードすることに煩わされないでください。再プログラムするのに32kBのフラッシュしかないので、4 GBのmicroSDカードを簡単に入手できます。(注:大容量のカードは多くの場合SDHCであり、インターフェイスがより困難です)。32 kBのすべての最後のバイトを使用すると仮定すると、必要なゲームロジックを備えたファームウェアの131,072コピーのためにSDカード上に空きができます。
APPノートの多くは次のように、PICのためにブートローダを書き込むためにありますAN851。メモリの特定の領域(おそらくメモリ領域の最上部、これをリンカーで指定します)を占有するようにブートローダーを設計し、完全なファームウェアプロジェクトがこの領域に到達しないように指定する必要があります。このノートでは、これについて詳しく説明します。「PIC18F452のブートセクション」を「リンカで指定したブートセクション」に置き換えるだけで、すべて意味があります。
次に、ブートローダーは、ユーザーがSDカードから実行するプログラムを選択し、全体をコピーできるようにするだけです。UIは、ユーザーが選択モードに入るためにプッシュボタンを押さなければならないことです。通常、ブートローダーはリセット時にこのボタンのステータスを確認するだけで、押されていない場合はゲームを起動します。それが押されている場合、ユーザーがSDカード上のファイルを選択し、プログラムをコピーし、[新しい]ゲームを起動し続けることを許可する必要があります。
これが私の現在の推奨事項です。
オプション3:HEXファイルの一部のみを保存するディープマジック
あなたの想定されるメカニズムとのトラブルは、プロセッサがAPIや関数呼び出しを扱っていないということです、それはを扱う数字命令ポインタがジャンプして、APIの仕様に応じて関数呼び出しを実行するコードがあることを期待することができます先のアドレス- 。プログラムの一部だけをコンパイルしようとすると、リンカはcheck_button_status()
またはを呼び出したときに何をすべきかを知りませんtoggle_led()
。これらの関数はプロセッサの16進ファイルに存在することを知っているかもしれませんが、どのアドレスにあるかを正確に知る必要があります。
リンカはすでにコードを複数のセクションに分割しています。理論的には、いくつかの呪文-section
と追加のセクションにこれを分割できます#pragma
。私はこれをやったことがないし、どのようにわからない。上記の2つの方法が失敗するまで(または誰かがここに素晴らしい答えを投稿するまで)、私はおそらくこのメカニズムを学習しないので、あなたにそれを教えることはできません。