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

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

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

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

function reset(){ goto 0x00000000; } 

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

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

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

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

来自AVR Libc

警告! 较旧的AVR将在复位时禁用看门狗定时器。 对于这些较旧的AVR,通过启用看门狗进行软复位非常简单,因为看门狗将在复位后被禁用。 在较新的AVR上,一旦启用了看门狗,即使在复位后它也会保持启用状态! 对于这些较新的AVR,需要将一个函数添加到.init3部分(即在启动代码期间,在main()之前)以尽早禁用看门狗,以便它不会不断地重置AVR。

在开始时禁用看门狗。

 #include  // 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,则起始地址可能会延迟。