適用先: ARM 開発ツール
回答
この記事に含まれている情報の適用先:
- Keil Development Tools for ARM
質問
ローカル変数が上書きされる問題が自分のアプリケーション内で発生しました。このエラーの原因を分析する方法を教えてください。
簡略化したコードは以下のようなものです。
func1 () {
int var; // this variable is in R6
:
func2 (); // after call of func2 var is destroyed
:
}
func2 () を分析したところ、すべてのレジスタは PUSH 命令によって正しく保存されています。
STMDB R13!,{R4-R7,R14}
func2 () の最後も問題ない様子で、対応する POP 命令が使用されています。
LDMIA R13!,{R4-R7,PC}
関数 func2 () は非常に複雑で、複数の関数が呼び出されます。関数の実行中にスタック領域が上書きされたようです。
この問題の原因を突き止める方法はありますか?
回答
あります。µVision Debugger では、シミュレータと ULINK USB JTAG Adapter を用いたブレークポイントへのアクセスがサポートされています。この機能を利用して、内容または R6 を保存するメモリ アドレスにブレークポイントを設定できます。この設定は以下の手順で行います。
1. 関数 func2 () に入ります。
2. [View]→[Memory] ウィンドウを使用して、アドレスとして SP-100 を入力します。メモリ ウィンドウ内のコンテキスト メニューを使用して、[unsigned int] を表示形式として選択します。ここで、スタック上に保存されている状態の var の値が見えるはずです。
3. ここで、メモリ ウィンドウにはスタック上に保存されている状態の var の値が表示されるはずです。メモリ アドレスを確認します(この例では 0x40001000 と仮定します)。
4. [Debug]→[Breakpoints] ダイアログを開き、以下のようにしてアクセス ブレークポイントを定義します。
Expression: 0x40001000
Access: Write
Size: 4 Bytes
5. ここでアプリケーションを実行すると、デバッガはスタック位置を上書きする命令で停止します。
注: ULINK で作業している場合、設定できるアクセス ブレークポイントは 1 つのみです。ARM Embedded ICE の制限によって、Flash 内で他のブレークポイントを設定することはできません。
詳細
- µVision User's Guide の Breakpoints を参照してください。