Цитата(Метценгерштейн @ May 22 2010, 13:55)

Интересует как это делает народ.
Идея у вас правильная, но реализация не совсем корректная. Не нужно в main-е или любой другой функции сбрасывать "тиковую" переменную, которая инкрементируется (считает тики прерывания, выраженные в единицах времени) в прерывании. Достаточно иметь в функции свою статическую (для которой выделяется постоянная память) переменную временной отметки/засечки, значение которой в свою очередь сравнивать с "тиковой" переменной беззнаковым вычитанием. Естественно обе этих переменных должны быть беззнаковыми, а "тиковая" еще глобальной с квалификаторлм
volatile. Если переделать ваш вариант, то будет примерно так
Код
#define LED_BLINK_PERIOD 200U
volatile unsigned int CntMC;
#pragma vector = TIMER1_COMPA_vect
__interrupt void overflow_timer1(void)
{
CntMC++; // инкремент "тиковой" переменной
}
void main(void)
{ BOOL active = TRUE;
static unsigned int timeStamp=CntMC;
initTickTimer(); // инициализация таймера, выделенного под счет времени
for (;;)
{ if (active) // устанавливаем состояние LED в соответствии с состоянием переменной active
on (LED);
esle
off (LED);
if ((CntMC-timeStamp)>=LED_BLINK_PERIOD) // проверяем окончание выделенного инетервала времени
{ if (active)
active=FALSE;
else
active=TRUE;
timeStamp=CntMC; // синхронизируем текущее состояние переменной временной отметки
}
}
}
Достоинство такого способа в том, что у вас в системе будет только
один источник времени - "тиковая" переменная. В то же время переменных для временных засечек вы можете сделать столько, сколько вам будет нужно по количеству процессов, требующих временных отсчетов. Только следует учитывать два нюанса.
1. максимальный измеряемый временной период определяется периодом переполнения "тиковой" переменной. Если нужен сравнительно большой период, то нужна 32-х битная или даже 64-х битная переменная. Из этого следует второй нюанс.
2. если разрядность "тиковой" переменной превышает нативную разрядность архитектуры, то следует специальными методами обеспечит атомарность доступа к "тиковой" переменной. Атомарность доступа предполагает, что при копирования значения переменной по частям ее значение не может (не должно) изменяться (в прерывании, где она инкрементируется)