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

How to write a custom reset() function in C for AVR-Studio?

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

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

叫我疯子,但这是写的那么简单吗:

function reset(){
  goto 0x00000000;
}

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

goto 0x00000000 重新启动程序,但所有 SFR 未初始化,中断未初始化。根据代码的复杂程度,可能会发生错误。您不应该使用 goto 进行软件重置,那是不好的方法。

相反 AVR Libc Reference Manual specifies the usage of watchdog timer for software reset. By using avr/wdt 您可以轻松启用看门狗定时器。

#include <avr/wdt.h>

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

来自 AVR Libc

CAUTION! Older AVRs will have the watchdog timer disabled on a reset. For these older AVRs, doing a soft reset by enabling the watchdog is easy, as the watchdog will then be disabled after the reset. On newer AVRs, once the watchdog is enabled, then it stays enabled, even after a reset! For these newer AVRs a function needs to be added to the .init3 section (i.e. during the startup code, before main()) to disable the watchdog early enough so it does not continually reset the 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了解更多详情。

I'm given this info - "Atmega128 and Pic24e have the reset interrupt at the program address 0x0.

在大多数情况下是的,但如果您使用的是引导加载程序,则起始地址可能会延迟。