2

Stellaris LM3S8962 cortex-m3 チップ用のクロスコンパイル ツールチェーンを構築しています。私が作成したテスト用の C++ アプリケーションは、しばらく実行されてから失敗します。メモリ マップされたハードウェア デバイスにアクセスしようとすると、障害が発生します。現時点での私の作業仮説は、起動シーケンスで重要なチップの初期化が欠落しているというものです。

私が理解したいのは、gdb での実行が停止し、プログラム カウンターが 0 に設定されるのはなぜですか? 0x0 にベクター テーブルがありますが、最初の値はスタック ポインターです。ベクター テーブルで指定したフォールト ハンドラーのいずれかになるべきではありませんか?

(gdb) 
187     UARTSend((unsigned char *)secret, 2);
(gdb) cont

Continuing.

lm3s.cpu -- clearing lockup after double fault


Program received signal SIGINT, Interrupt.
0x00000000 in g_pfnVectors ()

(gdb) info registers 
r0             0x1      1
r1             0x32     50
r2             0xffffffff       4294967295
r3             0x0      0
r4             0x74518808       1951500296
r5             0xc24c0551       3259762001
r6             0x42052dac       1107635628
r7             0x20007230       536900144
r8             0xf85444a9       4166272169
r9             0xc450591b       3293600027
r10            0xd8812546       3632342342
r11            0xb8420815       3091335189
r12            0x3      3
sp             0x200071f0       0x200071f0
lr             0xfffffff1       4294967281
pc             0x1      0x1 <g_pfnVectors+1>
fps            0x0      0
cpsr           0x60000023       1610612771

ツールチェーンは、gcc、gdb、openocd に基づいています。

4

1 に答える 1

4

GDBは喜んであなたにいくつかの手がかりを与えました:

二重障害後のロックアップのクリア

CPUはロック状態でした。これは、「ハードフォールト」割り込みハンドラーを実行できなかったことを意味します(ベクトルに0がある可能性があります)。

私は通常、ペリペリアルに「電力を供給する」のを忘れたときにこれらを取得します。結果として生じるバスエラーは、最初に「ハードフォールト」にエスカレートし、次にロック状態にエスカレートします。ところで、MCUのマニュアルに記載されている必要があります。

于 2011-03-22T17:54:51.320 に答える