如何在C中为AVR-Studio编写自定义reset()函数?

时间:2015-09-26 21:29:41

标签: c gcc avr avr-gcc

所以我被分配了为AVR编译编写自定义reset()函数的任务。

我得到了这个信息 - “Atmega128和Pic24e在程序地址0x0处有复位中断。写一个函数reset()来复位程序。我也听说过一种强制系统重启的简单方法是通过将其发送到无限循环。

叫我疯了,但这就像写作一样简单:

function reset(){
  goto 0x00000000;
}

不确定你是否可以这样做,而不是寻找复杂的解释,因为我很确定这是一个通用的问题。如果可以的话,简短而甜蜜:)

1 个答案:

答案 0 :(得分:6)

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。

在开始时禁用看门狗。

#include <avr/wdt.h>

// Function Pototype
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init3")));


// Function Implementation
void wdt_init(void)
{
    MCUSR = 0;
    wdt_disable();

    return;
}

.init3main函数之前执行,请查看Memory Sections以获取更多详细信息。

  

我收到了这个信息 - “Atmega128和Pic24e在程序地址0x0处有复位中断。

对于大多数情况是,但如果您使用的是bootloader,则起始地址可能会延迟。