現存するすべての PIC コンパイラを使用したわけではありませんが、2 つのスタイルがあります。私が使用したスタイルは、プログラムの呼び出しグラフを分析することによって、すべてのローカル変数を静的に割り当てます。すべての可能な呼び出しが実際に実行された場合、ローカルによって消費されるスタック メモリの量は、いくつかの注意事項 (HiTech の PICC-18 "標準" コンパイラの動作を説明します。他のものは異なる場合があります)
- 可変個引数関数は、 callerのスコープでローカル変数ストレージを定義し、そのストレージへの 2 バイト ポインターを呼び出される関数に渡すことによって処理されます。
- 間接関数ポインターのさまざまなシグネチャごとに、コンパイラーはコールグラフに「疑似関数」を生成します。その署名の関数を呼び出すものはすべて疑似関数を呼び出し、その疑似関数は、そのアドレスが取得されたその署名を持つすべての関数を呼び出します。
このスタイルのコンパイラでは、ローカル変数への連続アクセスは、グローバル変数への連続アクセスと同じくらい高速です。ただし、合計で 64 ~ 128 バイト (PIC のモデルによって異なります) を超えてはならない「near」として明示的に宣言されたグローバル変数と静的変数を除き、各モジュールのグローバル変数と静的変数は、ローカル変数とは別に配置されます。また、異なるバンクにあるものにアクセスするには、バンク切り替え命令が必要です。
私が使用していない一部のコンパイラは、「拡張命令セット」オプションを採用しています。このオプションは、「近い」バンクの 96 バイト (または 96 バイト未満の PIC ではそのすべて) を飲み込み、それを使用して FSR2 レジスタに関連する 96 バイトにアクセスします。最初の 16 バイト、または 32 バイトをスタック フレームとして使用する場合、これは素晴らしいコンセプトです。96 バイトを使用するということは、「近い」ストレージをすべて放棄することを意味し、これはかなり厳しい制限です。それにもかかわらず、この命令セットを使用するコンパイラは、スタック上のローカル変数に、グローバル変数と同じくらい高速ではないにしても、アクセスできます (バンク切り替えは必要ありません)。Microchip がスタック フレーム用に 16 バイト程度だけを確保して、「共通バンク」RAM の有用な量を残すオプションがあればいいのにと思いますが、それでも一部の人々はそのモードで幸運に恵まれています。