singlskv (21.03.2008 00:43, просмотров: 76) ответил Ксения на С полной очисткой надо, чтобы программа будто заново родилась. Но про теплый рестарт я бы тоже с интересом послушала, если есть оригинальные идеи.
Пользовался теплым рестартом несколько раз, никаких проблем не обнаружил, просто нужно для всей используемой переферии предусмотреть вход и выход
типа:
void UartInit()
{
........................
UBRR0 = UART_UBRR0; // настраиваем Uart; Rx и Tx выключены
UCSR0A = (1 << TXC0)|(1<<U2X0);
UCSR0B = 0;
UCSR0C = UART_UCSR0C;
........................
}
//-------------------------------------------------------------------
// Останавливаем Uart
//-------------------------------------------------------------------
void UartStop()
{
UCSR0B = 0; // выключить прием/передачу
UCSR0A = (1 << TXC0)|(1<<U2X0); // сбросить флаг
UDR0; // сбросить флаги ошибок
}
Ну и процедура ресета примерно так:
//-------------------------------------------------------------------
// Перезагрузка (рестарт с адреса 0)
//-------------------------------------------------------------------
void Reset()
{
__asm__ __volatile__ ("cli"); // запретить прерывания
// останавливаем всю переферию
SysTimerStop();
AdcStop();
SpiStop();
PwmStop();
PortsReset();
UartStop();
// переходим на адрес 0
__asm__ __volatile__("ldi r30,0\n\t"\
"ldi r31,0\n\t"\
"ijmp");
}