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

Eri*_*ney 2 c gcc avr avr-gcc

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

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

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

function reset(){
  goto 0x00000000;
}
Run Code Online (Sandbox Code Playgroud)

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

Nas*_*asr 6

goto 0x00000000启动程序,但所有SFR未初始化,中断未初始化.可能会发生错误,具体取决于代码的复杂程度.你不应该使用goto软件重置,这是不好的方法.

相反,AVR Libc参考手册指定了用于软件复位的看门狗定时器的使用.通过使用avr/wdt,您可以轻松启用看门狗定时器.

#include <avr/wdt.h>

#define soft_reset()        \
do                          \
{                           \
    wdt_enable(WDTO_15MS);  \
    for(;;)                 \
    {                       \
    }                       \
} while(0)
Run Code Online (Sandbox Code Playgroud)

来自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;
}
Run Code Online (Sandbox Code Playgroud)

.init3在执行main功能之前执行,请查看内存部分以获取更多详细信息.

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

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