2009-08-29 11 views
3

IARワークベンチのツールチェーンを使用して、組み込みシステムでいくつかの奇妙なARM例外をデバッグしています。例外がトラップされると、SVC_STACKが範囲外(非常に範囲外です)として報告されます。これは、J-Link JTAGデバッガの関連性、またはアーティファクトのみですか? SVC_STACKは何のために使用されていますか?これは0x1000サイズに設定されていますが、範囲外の場合はヒープ領域で上がります。ありがとう!ARM9 SVC_STACKが範囲外ですか?

答えて

4

ARM例外が発生すると(IRQまたはFIQ - 高速IRQではなく)、SVCモードになります。 CPRSレジスタを設定して非ユーザモードで実行するコードで直接入力することもできますが、システムを初期化するときを除いてこれは珍しいと思います。

例外が発生すると、プロセッサはSVCスタックに切り替わります。このSVCスタックは、システムの初期化時に非常に早く設定する必要があります。あなたの初期化コードがSVCスタックを適切に設定していないか、例外ハンドラの1つが正しくコーディングされておらず、スタックを破棄している可能性があります。

第3の可能性は、ARMスタックを必要に応じてセットアップするRTOSを使用していることです(基本的にIARの初期化コードが設定するSVCスタックを上書きする)。この場合、すべてがOKである可能性がありますが、IARデバッガはSVCスタックが範囲外であると判断します。デバッガはリンカ設定ファイルからその情報を取得しますが、スタックがメモリの別の領域に変更された場合、デバッガは混乱します。

これは、RTOSを使用しているときにIARのユーザーモードスタックで常に起こったことです。スタックは、デバッガが必要と思っているCSTACKセグメントにないタスク制御ブロックに基づいて割り当てられました。デバッガ刺激的な警告を出すでしょう。警告を静かにするために使用できるプロジェクト設定がいくつかありましたが、私の頭の上を思い出してはいません。私たちはそれほど気にならず、騒音で暮らしていました。

ヒープ領域のスタックが有効であることを確認する必要があります。明示的にこれを行うコードがない場合は、間違っている可能性がありますあなたのRTOSベンダーに尋ねる必要があります)。

ARM Architecture Reference Manual(ARM ARM)は、arm.comから自由に入手でき、ARMスタックの動作について非常に詳しく説明しています。もう1つの良い参考文献は、Andrew Sloss、et al。によるARM System Developer's Guideです。

+0

ありがとうございます。 IARから - "EWARMのバージョン4.42のスタックプラグインはRTOS対応ではないので、スタックオーバーフローについては常に不平を言いますので、RTOSを使用している場合はスタックプラグインを無効にする必要があります。"ダーン - 私はそれが望んでいた - より多くのデバッグ! – Jeff

関連する問題