Цитата(prottoss @ Sep 24 2007, 14:44)

Код
void (*fn_reset)(void) = NULL;
...
if(error)
{
fn_reset();
}
...
А вот так:
Код
#define FN_RESET ((void (*)()) 0)
...
if(error) {
FN_RESET();
}
...
не сожрёт лишнего ОЗУ на переменную fn_reset
Только этого мало - сначала надо прерывания запретить и привести вручную все регистры устройств в исходное состояние. И того может не хватить - например, если не ошибаюсь, в USART незавершённая передача будет продолжать молотить даже если TXEN снять, т.е. будет не полный эквивалент аппаратного сброса.
В каждом конкретном случае надо очень аккуратно смотреть.