Возвращаясь к 1) проектирование программ - пример: есть реализованный мной счёт времени подобный ntp под
STM32F407 на SysTick, с хранением целой и дробной части секунд, на
него повешан протокол синхронизации, который подстраивается
приемлемой для применения точностью. Как уже сделано - ниже.
ntptime_t __attribute__((weak)) ntp_getFineTime(void)
{
uint32_t val = SysTick->VAL;
uint32_t load = SysTick->LOAD;
ntptime_t ntp = SystemTime;
ntptime_t retval = { 0, 0 };
uint64_t prFrac;
// Calculate ntptime from catched
prFrac = load - val;
prFrac *= SYSTICK_STEP;
prFrac = prFrac / (load+1);
retval.fraction = (uint32_t)prFrac;
retval = ntp_add( retval, ntp);
return(retval);
}
Теперь надо то же реализовать для нувотона. Выяснилось на разности реализаций, что те моменты, которые я относил к ntp на деле относятся к таймерам, которые - сюрприз! - имеют разный функционал. Если уточнить вопрос - на основе каких критериев выделяется слой абстракции? Как определить интерфейс, необходимый для реализации? В данном конкретном случае установить_время(), ускорить счёт(), замедлить_счёт(). Опять же - изменение скорости счёта с каким аргументом должно быть - доля от текущей или какой-то другой?
У кого какие соображения или практика есть, которыми допустимо поделиться?
Был совет смотреть как реализую подобные штуки другие, и вот как запрос сформулировать? Тот же ntp implementation выводит ссылки на реализации демона и синхронизации с кучей серверов, то есть явно не то.