pistoletov решать Вам, но мне не очень понравилась такая архитектура в применении к простой (как Вы сказали) задаче.
Особенно не понравилось выполнение чего - либо в прерывании. Лично мне кажется, что в прерывании таймера без крайней необходимости в точной синхронизации ничего кроме установки флагов делать нельзя. Остальное все в main().
Для задач, которые нужно вызывать по времени можно завести полупрограммные таймеры. Тогда код может выглядеть как-то так:
CODE
enum
{
timer_100ms,
timer_1000ms,
number_of_timers
}
static uint16_t timer_counts[number_of_timers];
void timer_interrupt_handler ()
{
for (i = 0; i<number_of_timers)
{
if (timer_counts[i] > 0)
{
timer_counts[i] -= 1;
}
}
}
void main(void)
{
init_timer ();
while (!Error)
{
gprs_handler();
sale_handler();
if(!get_count(timer_100ms))
{
supply_control();
reinit(timer_100ms) = 0;
}
if (timer_1000ms)
{
coin_control();
reinit(timer_1000ms) = 0;
}
}
}
Естественно, объявление функций, переменных таймера следует вынести в свои модули, чтобы не превращать код в нечто нечитаемое.
От описанного мной приема я тоже не в восторге, но он сопровождаем и понимаем даже для новичков. Значительно проще и короче, чем по вашей ссылке.
Самый главный совет: начните работать над программой. Только на практике Вы сможете выработать свой стиль и понять, какая архитектура больше подходит.