1

短編小説:

ATmega プロセッサのビットを設定しないMCUSRが、それでもリセットを引き起こすリセット条件は何ですか?

長い話:

私は ATmega168 でブラウンアウト検出を使用しており、コード内にそれを処理する場所があります。システムの電源が失われた場合、コンデンサが約 0.5 秒間ブラウンアウト レベルを超えた状態を維持し、電源を回復すると、ブラウンアウト処理ルーチンが正常に実行されます。(ブラウンアウトビットをチェックしMCUSRます。)

ただし、システムの電圧をゆっくりと下げてゆっくりと元に戻すと、プロセッサが再起動し、ブラウンアウト処理ルーチンが実行されません:MCUSRゼロです!!! (DebugWire 経由で外部デバッガを使用して確認します。)

何が原因でしょうか? ウォッチドッグが誤って有効になっているなど、それ以外の場合 (私は使用せず、起動時に無効にします)、MCUSR..

しかし、いいえ、それはウォッチドッグ リセット (ビット 3)、ブラウンアウト リセット (ビット 2)、外部リセット (ビット 1)、またはパワーオン リセット (ビット 0)のいずれでもありませんでした上記??

もう 1 つの奇妙な点は、このような状態の後、場合によっては定期的にリセットが発生し、常に MCUSR の値が 0 になることです。

それ以外の場合、これが発生しない場合、システムは常に完全に実行されます。

編集:

他の場所で決定的な答えを見つけることができませんでした.スタックオーバーフローまたは同様のソフトウェア関連のエラーはどのような種類のリセットにつながりますか? おそらく、これらはプロセッサをリセットし、MCUSR を放置する可能性のある条件でしょうか? このような状況は、RAM またはプログラム カウンターを破損するだけで、リセットは発生しないと思いました。

4

3 に答える 3

3

スタック オーバーフローはリセットを引き起こしません。スタック オーバーフローは純粋にソフトウェアの状態であり、未定義の動作につながる可能性があります。スタック オーバーフローが原因で発生する可能性がある、非常に多くの症状があります。例えば:

  1. 挙動に明らかな変化なし
  2. 隣接するメモリが破損すると、null ポインターの逆参照や無効な命令の実行など、予期しない、または未定義の動作が発生します。

プロセッサが無効な命令を実行し、例外が処理されない場合、スタック オーバーフローによってリセットが発生したように見えることがあります。これもまた、ソフトウェア例外ハンドラに依存するソフトウェア定義の動作です。NULLポインターの逆参照、または無効なメモリ空間へのポインターでも同じことが発生する可能性があります。

リセットの理由を指定する可能性のある追加のレジスタがないことを再確認することもできます。

あなたは電圧を下げてから上げると言いました。単純に電圧を下げるとリセットされますか?電圧を監視しているコードはありますか? ハードウェアの条件を変更しているのに、なぜソフトウェアの条件のバグを原因として疑っているのだろうか。

于 2011-12-12T00:53:12.473 に答える
2

違いがある場合は、BODLEVEL ヒューズで遊んでみましたか?

ただし、これはスタック オーバーフローやその他のソフトウェアの問題によって簡単に発生する可能性があります。特に関数ポインターを使用している場合は、0 へのジャンプにすぎない可能性があります。私は過去にそのような問題を抱えていました。

実際にそれを行ったことはありませんが、ソフトウェアで変更した他のレジスタの値を確認すれば、リセットと「ジャンプ」を簡単に区別できると思います。本当にリセットだった場合は、レジスタも再初期化する必要があります。たとえば、コードのどこかで PORTB を 0x55 に設定します。次に、起動時にその値を確認します。リセットの場合は 0x00 にする必要があり、そうでない場合は 0x55 のままにする必要があります。

于 2011-12-11T22:22:31.057 に答える
0

avrgccを使用する場合は、次のことを試してください。

volatile char mcusr __attribute__ ((section (".noinit")));
void main(void){
  mcusr=MCUSR;
  ...
  if(mcusr&0x01)printf("WD");
  if(mcusr&0x02)printf("EX");
  if(mcusr&0x04)printf("BO");
  if(mcusr&0x08)printf("PO");
  ...
}
于 2012-12-22T12:58:55.697 に答える