0

私は、同様の他のデバイスと無線で通信し、データをフラッシュに記録する単純な MSP430 アプリケーションに取り組んでいます。電力を節約するためにウェイク オン ラジオを使用しています。Cでのプログラミングにmspgccとmspdebugを使用しています。

私の問題は次のとおりです。タイマーはしばらくすると動作を停止しますが、デバイスはデータを受信し続けます。つまり、受信割り込みは動作し続けますが、タイマーが停止し、メインループがタイマーに依存するため、すべてが停止します。

スタックが破損している可能性があることを理解しています。デバイスが動かなくなって現在のレジスタ値を出力すると、それらは常に同じになります:

    pc/r0: 8092  sp/r1: 053e  sr/r2: 0059  r3: 0000  
    fp/r4: ffff  r5: 5a08     r6: ffff     r7: ffff  
    r8: ffff     r9: ffff     r10: ffff    r11: 0000  
    r12: 0009    r13: 000c    r14: 0009    r15: 0001 

単純なバックトレースでは、スタックに何も表示されません。main() だけです。SP と SR に対して常に同じ値が得られます。私は現在のスタックを持っていますが、アセンブリの知識はほとんどありません。アセンブリを学習してすべてを手動でバックトレースするのではなく、何が起こっているのかを理解する方法はありますか? さらに情報が必要な場合は、お知らせください。このような質問をして本当に申し訳ありませんが、Google はほとんど役に立ちませんでした。メモリダンプ全体を持っている場合、(手動ではなく) バックトレースできる方法はありますか?

4

1 に答える 1

1

スタック オーバーフローが発生する場合があります。サイトではなく本物です:)

0x0530 は、スタック ポインターにとって非常に低い値です。私のデバイスのメモリマップでは、周辺機器用です。

なぜこの値を取得するのですか?推測することしかできません。

  1. 起動時にSPを初期化しますか? あなたのコンパイラがあなたのためにそれをするかもしれません。わからない場合は、実行前 (プログラムの開始時) にデバッガーで SP の値を確認してください。数秒実行して停止し、もう一度確認してください。
  2. コンパイル時に生成されたリストまたはマップ ファイルで「stack」を検索します。スタックの場所とサイズに関する情報を見つけることができますか?
  3. 再帰関数はありますか?
  4. 関数で大きなローカル配列を宣言していますか?
  5. 他に RAM を大量に消費している可能性があるものはありますか?
于 2013-09-20T08:55:20.080 に答える