Обычно, делаю так
Код
{
static timer_t time;
if(oldvar != newvar)
{
time = get_tick();
newvar = oldvar;
}
else if(tick_diff(time) > T1SEC)
{
EE_write(&Datamemory, &newvar, sizeof(newvar)); // void EE_write(void *dst, void*src, size_t size)
}
}
Несколько пояснений.
1.timer_t, get_tick(), tick_diff(time) - не думаю, что будут вопросы, но - есть некоторая переменная, которая каждые 1мС инкрементируется в прерывании. Но она доступна только через get_tick().
2. Я бы нагло проигнорировал эту сладенькую фичу
Код
Datamemory=variable;
потому что запись в еепром это и ожидание его освобождения, и сравнение считанных данных с записываемыми для того, чтобы не допускать лишней перезаписи, и выполнение критических задач на время записи. Это как минимум. Можно добавлять еще и коррекцию контрольной суммы, запись в резервную страницу памяти, обновление образа еепром в озу - кому и что надобно для конкретного девайса.
3. Приведенная операция производится в бесконечном цикле обработки событий, собсна как и построено 99,9% задач для МК без оси. Но никак не в прерывании. Задача прерывания - быстро все сделать и выйти. Подобные зависоны, как у Вас - очень большая редкость, и они должны быть сильно обоснованы