ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
116366 Топик полностью
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"); }