Ну да, не крутить счетчики в прерывании это хорошая идея
Переделал RunScheduled() на:
Код
if( static_cast<TimerT>((TimeService::GetTickCount() - timers[I])) >= Task::Period )
{
Task::Run();
timers[I] = TimeService::GetTickCount();
}
Т.е. в массиве timers[] теперь хранится время последнего запуска задачи.
На тестовом примере и по тактам и по байтам получилось очень даже хорошо!
Правда, на AVR при частоте 8МГц мне аппаратный счетчик не удалось заставить работать с миллисекундной частотой и если нужны многомиллисекундные задержки то в каждой задаче дополнительный делитель делать придется.
Но даже когда я сделал миллисекундное прерывание в котором крутится софтовый счетчик
Код
static volatile uint8_t G_TimerTicks;
static uint8_t GetTickCount()
{
return G_TimerTicks;
};
ISR(TIM0_COMPA_vect)
{
G_TimerTicks++;
}
результат всё равно превзошел предыдущий и по байтам(на 4байта) и тем более по тактам!
Я в общем так сосредоточился на шаблонах и рекурсии, что слона в упор не заметил )))))))
The truth is out there...