2

組み込みシステム、コプロセッサー、MMU、Atmel 9263の実行中に、未定義の命令エラーが発生します。組み込みシステムのメモリは0x20000000〜0x23FFFFFFの範囲です。これまでに2つのケースがありました。

  1. SP 0x0030B840、LR 2000AE78-LRは有効なコードを指しているため、SPは偽物ですが、例外の原因はわかりません。他にどのようなアドレス、レジスタ、メモリ位置を確認する必要がありますか?

  2. SP 0x20D384A8、LR 0x1FFCA59C-SPは問題なく、LRは偽物です。LRがどのように押しつぶされたかを調べるために私ができるある種の事後分析はありますか?アドレス空間の端から後方に転がっているように見えますが、その方法がわかりません。

現在、コードの大きなチャンクをシミュレーションに置き換え、テストを実行して問題を特定しようとしています。問題が発生するまでに4時間かかる場合があります。

そこに何かヒントをいただければ幸いです、ありがとう!

チップはAT91SAM9263で、IAREWARMツールチェーンを使用しています。ストレートARMだと思いますが、確認します。

編集

UndefInstructのもう1つの例-今回はSP/LRは問題ないように見えます。LR = 0x2000b0c4、そして私がその近くで分解するとき:

2000b0bc e5922000 LDR R2、[R2、#+ 0]
2000b0c0 e12fff32 BLX R2
2000b0c4 e1b00004 MOVS R0、R4

LRはUndef例外に続く命令であるため、BLXはどのように未定義として識別されますか?CPSRは0x00000013であるため、これはすべてARMモードであることに注意してください。ただし、R2はヒープ領域にある0x226d2a08であり、間違っていると思います。分解すると、ANDEQ R0、R0、R12があり、命令は0x0000000Cであり、他の命令はデータのように見えます。だから私は悪いR2が問題だと思う、私はBLXでUndefがなぜなのか理解しようとしているだけなのか?

ありがとう!

4

2 に答える 2

2

CPSRのTビットを確認してください。誤ってARMモードからThumbモードに(またはその逆に)変更した場合、未定義の命令が発生します。

SPまたはLRが破損している限り、いくつかの命令を間違ったモードで実行すると、未定義の命令に到達する前にそれらが破損する可能性があります。

編集

質問の編集における新しいエラーケースへの対応:

LRにはBLXR2からのリターンアドレスが含まれているため、BLXの後の1つの命令を指していることは理にかなっています。

BLX R2の実行時にR2がヒープを指していた場合は、ヒープにジャンプして、命令であるかのようにデータの実行を開始します。これにより、短い順序で未定義の命令例外が発生します...

未定義の正確な命令を確認したい場合は、R14_undレジスタ(未定義の命令ハンドラーにいるときに定義されます)を確認してください。これには、未定義の命令の次の命令のアドレスが含まれています。

根本的な原因は、R2の値が悪いことです。これがCコードであると仮定すると、私の推測は悪いポインター逆参照ですが、確実に知るためにソースを確認する必要があります。

于 2009-09-02T23:48:25.407 に答える
1

アラインされていないアドレスから読み取っているため、これは未定義の命令ですか、それともデータアボートですか?

編集:

未定義の例外では、CPSR [4:0]は0b11011または0x1Bであり、0x13ではありません。0x13はアームアームに応じてリセットされます。

于 2009-09-03T21:05:25.570 に答える