所以我被分配了为 AVR 编译编写自定义 Reset() 函数的任务。
我得到了这个信息 - “Atmega128 和 Pic24e 在程序地址 0x0 处有复位中断。编写一个函数 Reset() 来复位程序。我还听说强制系统重新启动的一个简单方法是发送它进入无限循环。
你可以说我疯了,但这只是写这么简单吗:
function reset(){
goto 0x00000000;
}
不确定你是否可以做到这一点,并且不需要寻找复杂的解释,因为我很确定这是一个通用问题。如果可以的话,简短而甜蜜:)
goto 0x00000000
重新启动程序,但所有 SFR 均未初始化,中断也未初始化。根据代码的复杂程度,可能会发生错误。你不应该使用goto
对于软件重置,这是不好的方法。
Instead AVR Libc 参考手册指定软件复位时看门狗定时器的使用。通过使用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;
}
.init3
之前执行过main
函数,看一下内存部分更多细节。
我得到了这个信息 - “Atmega128 和 Pic24e 在程序地址 0x0 处有复位中断。
在大多数情况下是的,但如果您使用引导加载程序,起始地址可能会延迟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)