2015-09-26 85 views
2

所以我已經分配了編寫AVR編譯的自定義reset()函數的任務。如何在C中爲AVR-Studio編寫自定義reset()函數?

我給出了這個信息 - 「Atmega128和Pic24e在程序地址0x0處有復位中斷,寫一個函數reset()來重置程序,我也聽說過一個簡單的方法來強制你的系統重啓是通過發送它變成一個無限循環

叫我瘋了,但是這是寫作一樣簡單:

function reset(){ 
    goto 0x00000000; 
} 

不知道,如果你能做到這一點,而不是尋找一個複雜的解釋,因爲我我很確定這是一個通用的問題,如果你可以的話,簡短而又甜蜜:

+0

不,不是,'goto'語句用於執行(或跳轉到)C代碼中的標籤部分,但是需要中斷0x0,因此可能需要使用程序集內聯彙編和中斷代碼 –

回答

5

goto 0x00000000啓動程序結束,但所有SFR未初始化,且中斷未初始化。取決於代碼的複雜性,可能會發生錯誤。您不應該使用goto進行軟件重置,這是不好的方法。

而是AVR Libc Reference Manual指定軟件復位的看門狗定時器的用法。通過使用avr/wdt,您可以輕鬆啓用看門狗定時器。

#include <avr/wdt.h> 

#define soft_reset()  \ 
do       \ 
{       \ 
    wdt_enable(WDTO_15MS); \ 
    for(;;)     \ 
    {      \ 
    }      \ 
} while(0) 

從AVR libc庫

小心!較舊的AVR將在復位時禁用看門狗定時器。對於這些較老的AVR,通過啓用看門狗來進行軟復位很容易,因爲看門狗在復位後將被禁用。在較新的AVR中,一旦啓用了看門狗,即使在復位後,它仍保持啓用狀態!對於這些較新的AVR,需要將一個函數添加到.init3部分(即在啓動代碼期間,在main()之前)以足夠早地禁用看門狗,以便它不會不斷地重置AVR。

在開始時禁用看門狗。

​​

.init3之前main功能執行,看Memory Sections瞭解更多詳情。

我給這個信息 - 「Atmega128的和PIC24E具有復位中斷的程序地址0x0

在大多數情況下,是的,但如果你使用引導程序,起始地址可能推遲。

+0

goto 0x00000000'根本無法跳轉到某個特定地址嗎? –

+0

@ Rev1.0 add p ointer的地址,它會正常工作。 'goto *(0x00)'在AVR的情況下,它將跳轉到ROM的地址0。 – Nasr

+0

@Nasr ...但是,它不會重置AVR。它將跳轉到復位向量,但MCU的狀態將不會被重置。這可能會導致應用程序發生故障,因爲外設不會處於復位狀態。 – duskwuff

相關問題