わかりました、私は長い間この問題を自分で解決しようとしてきましたが、単にあきらめました。もう我慢できなくなり、助けが必要になるまで、すべてのウェブを検索しました。
「C18 Compiler User's Guide」全体を読みましたが、C18 は 256 バイトを超えるサイズのスタックの使用をサポートしていると書かれています。しかし、彼らが要求したことはすべて実行し、リンカー スクリプトを変更し、マルチバンク スタック モデル コンパイラ オプション (-ls) を使用しましたが、スタックの最初のバンクがいっぱいになった後も、変数へのアクセスに問題があります。
関数を単純に再帰的に呼び出す単純なコードをデバッグしました。この関数には 5 つの float パラメーターと 5 つの float ローカル変数があり、各呼び出しでスタック内の約 42 バイトを使用します (パラメーター用に 5*4 + ローカル変数用に 5*4 + 古い SFR2 値を保存するための 2 バイト)。6 回目の呼び出しの後、スタック値は上書きされます。
Web を検索しているときに、大きな配列 (256 バイトを超える) を作成して使用する方法について具体的な指示を出している人がたくさんいるのを見つけました。手順の 1 つは、ポインターを使用して配列の要素にアクセスすることを推奨しています。私の問題は、この「ポインターを使用して異なるバンクの変数にアクセスする」に関連しているように感じますが、関数呼び出しでローカル変数をすべてポインターに変更する方法がわかりません。意味がありません。
正直に言うと、私は本当にばかげたことをしているだけだと思います (この問題について話し合っている人が誰もいなかったので)。私が見つけたスタックサイズの増加に関連するすべてのトピックは、静的変数の使用を提案しただけです。私はこの方法で問題を解決しましたが、C18 がより大きなスタックサイズをサポートする方法を知りたいです。
以下は、この問題を理解するために使用したテスト コードです。デバッグ中に、FSR1 レジスタが正しく更新され、次の関数パラメーターと変数を配置する必要がある次のバンクの次のアドレスを指すようになっていることに気付きました。しかし、ローカル変数が書き込まれると、それらはスタックの一番上に移動します (デバッグ モードで MPLABX IDE によって変数に指定されたアドレスであっても、アドレスの下位バイトのみがデータをスタックに移動すると見なされます。正しい)。このため、問題は、コンパイラが生成したコードがスタックを使用するために 16 ビット アドレスを使用していないことだと確信しています。それでも、私はそれを解決する方法がわかりません。
このトピックに関する議論は大歓迎です:)ありがとう!
float testFunction1(float p1, float p2, float p3, float p4, float p5)
{
float v1, v2, v3, v4, v5;
v1 = p1 + p2;
v2 = p2 + p3;
v3 = p3 + p4;
v4 = p4 + p5;
v5 = p5 + p1;
v1 = testFunction1(v1, v2, v3, v4, v5);
}
void main()
{
float v1, v2, v3, v4, v5;
v1 = 0x11ABCDEF;
v2 = 0xAABBCCDD;
v3 = 0xABCABCAB;
v4 = 0xFFEEDDCC;
v5 = 0x11223344;
v1 = testFunction1(v1, v2, v3, v4, v5);
}