ARMベースのプロジェクトで開発していると、データアボートがランダムに発生します。つまり、ARMベースのプロジェクトで遊ぶと、データアボート割り込みが発生します。ただし、関数のコールバックを確認しても、r14またはr13を使用してレジスタマップを確認すると、データの中止が常に同じポイントになるとは限りません。とにかく、データアボートの根本原因に関する情報を正確に取得できることはありますか?ref 2を試しましたが、割り込みに関するデータをトラップしたときに同じポイントを取得できませんでした。
質問する
5898 次
1 に答える
1
上記のKeilリンクで説明されているようにリンクレジスタ(r14)をチェックすると、データアボートをトリガーした命令が表示されます。そこから、なぜそれがデータの中止を引き起こしたのか、そしてそれがどのように起こったのかを理解する必要があります。これは難しい部分です。
私の経験では、おそらく起こったことは、無効なポインタにアクセスしたことです。多くの理由で無効になる可能性があります。ここにいくつかの候補があります:
- 初期化される前にポインタを使用しました
- ポインタまたはそれを含むメモリが解放された後にポインタを使用しました(その後、別の関数がポインタを割り当てたときに変更されました)
- スタックオーバーフローによりポインタが破損しました
- ポインタが、メモリを踏みにじっている他の無関係な不正なコードによって破損しました
- ポインタはローカル変数としてスタックに割り当てられ、割り当て関数が終了した後に使用されました
- ポインタのタイプの配置が正しくありません(たとえば、uint32_tとして0x4001にアクセスしようとしています)
ご覧のとおり、ARMデータアボートの根本的な原因はさまざまです。根本的な原因を見つけることは、ARMソフトウェア/ファームウェアの開発をとても楽しいものにする理由の一部です!あなたのパズルを理解するために頑張ってください。
于 2012-07-13T18:33:58.023 に答える