こんにちは、皆さん
私はGreen Hills Software(GHS)コンパイラを使ってS32K3 MCUを開発しており、DumpCallStack関数を実装しています。
フレームポインタ(FP)を取得するために、以下のインラインアセンブリを使用しています。
__asm volatile ("mov %0, r7" : "=r" (locals.fp));
しかし、locals.fp の値は 0x02B1 であり、これは有効なフレームポインタではないようです。この設定はアラインされておらず、有効なスタック位置を指ささないため、コールスタックを正しくアンワイルできません。
私の質問は以下のとおりです。
S32K3(Arm Cortex-M7)のGHSコンパイラを使う場合、現在のフレームポインタを取得する正しい方法は何でしょうか?
GHSコンパイラは常にR7をフレームポインタとして使うのでしょうか?それとも最適化レベルに応じてフレームポインタを省略したり、別のレジスタを使うことは可能でしょうか?
スタックアンワインドのためにフレームポインタを保持するために、有効にしなければならないコンパイラオプションはありますか?
インラインアセンブリを使用する代わりに、フレームポインタを取得するための推奨されるGHS固有のAPIまたは組み込み関数はありますか?
S32K3上でGHSコンパイラを使用してスタックアンワインディングまたはDumpCallStack関数を実装した経験のある方がいらっしゃいましたら、ご指導やサンプルコードをいただけると幸いです。
ご回答をお待ちしています。
こんにちは、
R7が常にフレームポインタとして使用されるとは限りません。GHSのバージョン、最適化レベル、コンパイラオプションによっては、コンパイラが異なるレジスタを使用したり、フレームポインタを完全に省略してR7を汎用レジスタとして使用したりする場合があります。値0x02B1は、R7がビルド内でフレームポインタとして機能していない可能性を示唆しています。
生成されたアセンブリを確認し、GHSがフレームレコードを全く作成していないかどうかを確認してください。フレームポインタが有効になっている場合、フレームポインタを保存/復元する一貫した関数プロローグが表示されるはずです。そうでない場合、R7/R11に基づくスタックアンワインドは信頼できません。
これは主にコンパイラ固有の質問なので、Green Hills Softwareのサポートに連絡することもおすすめします。彼らは以下の点でアドバイスを提供できます:
彼らはあなたのコンパイラのバージョンや設定に特化したガイダンスを提供するのに最適です。
BR、ペトル