IAR ワークベンチ ツールチェーンを使用して、組み込みシステムで奇妙な ARM 例外をデバッグしています。例外がトラップされると、SVC_STACK が範囲外 (非常に範囲外!) と報告されることがあります。SVC_STACK は何に使用されますか? サイズは 0x1000 に設定されていますが、範囲外の場合はヒープ領域を大きく超えています。ありがとう!
1 に答える
ARMのSVCモードは、例外が発生したときに開始されます(IRQまたはFIQではなく-高速IRQ)。CPRSレジスタを設定することにより、非ユーザーモードで実行するコードで直接入力することもできますが、システムの初期化時を除いて、これは珍しいことだと思います。
例外が発生すると、プロセッサはSVCスタックに切り替わります。これは、システムの初期化の非常に早い段階で設定する必要があります。初期化コードがSVCスタックを適切に設定していないか、例外ハンドラーの1つが適切にコード化されておらず、スタックを破棄している可能性があります。
3番目の可能性は、ARMスタックを希望どおりにセットアップするRTOSを使用していることです(基本的に、IARの初期化コードがセットアップする可能性のあるSVCスタックをオーバーライドします)。この場合、すべてがOKである可能性がありますが、IARデバッガーはSVCスタックが範囲外であると見なします-デバッガーはリンカー構成ファイルから情報を取得します-しかし、何かがスタックをメモリの別の領域に変更した場合、そうすると、デバッガーが混乱します。
これは、RTOSを使用しているときにIARのユーザーモードスタックで常に発生しました-スタックは、デバッガーが含めるべきと考えたCSTACKセグメントにないタスク制御ブロックに基づいて割り当てられ、デバッガーは苛立たしい警告を発行しました。警告を静めるために使用できるプロジェクト構成設定がいくつかありましたが、それが何であったかを頭のてっぺんから思い出せません。私たちはそれを気にすることはめったになく、ただノイズに耐えました。
スタックが「ヒープ内で」有効であることを確認する必要があります。これを明示的に実行するコードがない場合は、間違っている可能性があります(または、 RTOSベンダー)。
ARMアーキテクチャリファレンスマニュアル(ARM ARM)は、arm.comから無料で入手でき、ARMスタックがどのように機能するかについて非常に詳細に説明されています。もう1つの優れたリファレンスは、AndrewSloss他によるARMシステム開発者ガイドです。