簡體   English   中英

Atmel 處理器已復位,但 MCUSR 中沒有指示復位源

[英]Atmel processor is reset, but there is no reset source indicated in MCUSR

小故事:

哪些復位條件不會在 ATmega 處理器的MCUSR中設置位,但仍會導致復位?

長長的故事:

我在 ATmega168 中使用掉電檢測,並在我的代碼中有一個地方來處理它。 如果我的系統斷電,電容器會使其保持在欠壓水平以上約半秒,當我恢復供電時,欠壓處理程序成功運行。 (我檢查了MCUSR中的MCUSR 。)

但是,當我慢慢降低系統電壓,然后慢慢恢復時,處理器重新啟動,掉電處理程序不運行: MCUSR為零!!! (我通過 DebugWire 使用外部調試器來檢查它。)

什么會導致這種情況? 如果是其他原因,例如意外啟用了看門狗(我不使用它,並在啟動時禁用它),那么MCUSR中至少會有一些東西。

但是,沒有,這既不是看門狗復位(第3位),掉電復位(第2位),外部復位(第1位),或上電復位(位0),所以有什么做的原因復位,如果沒有的以上??

另一件奇怪的事情:在這種情況之后,在某些情況下,復位會周期性地發生,MCUSR 中的值總是為零。

否則,如果沒有發生這種情況,系統將始終完美運行。

編輯:

我在其他地方找不到決定性的答案,堆棧溢出或類似的與軟件相關的錯誤會導致什么樣的重置? 也許這些條件可能會重置處理器,而不管 MCUSR? 我認為這種情況只會損壞 RAM 甚至程序計數器,但不會導致重置。

堆棧溢出不會導致復位。 堆棧溢出純粹是一種軟件條件,可能會導致未定義的行為。 堆棧溢出可能導致許多症狀。 例如:

  1. 行為無明顯變化
  2. 相鄰內存的損壞會導致意外或未定義的行為,例如推遲空指針或執行無效指令

如果處理器執行無效指令並且未處理異常,則堆棧溢出可能導致復位。 這又是取決於軟件異常處理程序的軟件定義行為。 取消引用NULL指針或指向無效內存空間的指針也會發生同樣的事情。

您可能需要仔細檢查是否有其他寄存器也可以指定重置原因。

你提到你降低電壓然后升高它。 如果您只是降低電壓,它會重置嗎? 你有監控電壓的代碼嗎? 我想知道為什么您在更改硬件條件時懷疑軟件條件錯誤是原因。

如果有任何不同,您是否嘗試過使用 BODLEVEL 保險絲?

但是,這很容易由堆棧溢出或其他一些軟件問題引起。 特別是如果您正在使用函數指針 - 它可能只是跳轉到 0。我過去曾遇到過這樣的問題。

從未真正這樣做過,但我相信如果您檢查在軟件中更改的其他寄存器的值,您可以輕松區分重置和“跳轉”。 如果它真的是一個復位寄存器也應該重新初始化。 例如,將 PORTB 設置為代碼中某處的 0x55。 然后在啟動時檢查它的值。 如果是復位,則應為 0x00,否則應保持為 0x55。

如果你使用 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");
  ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM