Есть прерывание с периодом 1 мс, где инкрементируется 32-разрядный счетчик:
Код
void SysTick_Handler(void)
{
TSysTimer::Counter++;
}
При необходимости формирования интервала программа может запустить один из программных счетчиков:
Код
void TSoftTimer::Start(uint32_t t)
{
FinalCount = TSysTimer::Counter + t;
}
Истек ли интервал, проверяется так:
Код
bool TSoftTimer::Over(void)
{
return(TSysTimer::Counter >= FinalCount);
}
Всё хорошо, но примерно через 50 дней счетчик TSysTimer::Counter переполнится и всё сломается. Как красиво это обойти? При этом можно наложить ограничение, что формируемый интервал никогда не превышает половины (или даже четверти) периода счетчика, а проверка переполнения тоже делается часто, много раз за период счетчика.