  Общее описание
  ========================
  
  Библиотека ltimer представляет собой набор функций для реализации таймера на основе
  системных часов процессора (контроллера) или ОС.

  Работа таймера основана на системном счетчике, который должен равномерно
  увеличиваться с течением времени.

  Реализация порта
  ========================

  Реализация логики счетчика своя для каждой платформы и определяется портом
  под конкретную платформу (каждый в своей поддиректории в директории ports).

  Порт в файле lclock_arch.h определяет беззнаковый целый тип t_lclock_ticks для
  хранения значения счетчика и определяет с помощью константы LCLOCK_TICKS_PER_SECOND, на сколько увеличивается счетчик за секунду . 
  
  Счетчик должен равномерно увеличиваться до тех пор пока не дойдет до максимального значения, которое может быть представлено данным типом, после чего переходит снова к нулевому значению
  и начинает считать заново. Допускается инкремент счетчика с шагом больше 1.

  В текущей реализации должны использоваться все биты объявленного типа, т.е. не
  допускается использовать например 24-битный счетчик при 32-битном типе
  (это можно реализовать добавлением маски к оперециям в будущем, если возникнет
   необходимость).

  При преобразовании между системным счетчиком и временем в мс по умолчанию используется для сохранения промежуточных значений тот же тип t_lclock_ticks. В случае больших значений LCLOCK_TICKS_PER_SECOND и интервала возможно переполнение при переводе из мс в значение системного счетчика, в момент умножения и до выполнения деления на 1000. С одной стороны это решается тем, что если значение LCLOCK_TICKS_PER_SECOND больше порога, определенного LCLOCK_TICKS_PER_SECOND_CONV_THRESHOLD, то используется деление до умножения, что позволяет избежать переполнения за счет погрешности при делении. Также возможно для результата умножения использовать тип большего размера, для этого необходимо определить макрос LCLOCK_TICKS_CUSTOM_CONV_VAL_TYPE и явно определить тип t_lclock_ticks_conv_val, в который будет преобразовываться значение перед выполнением умножения.

  Порт должен реализовать функции:
  
  - void lclock_init_val(t_lclock_ticks init_val)
  
    Если требуется, запускает системный счетчик, иначе может быть реализована
    пустая фукнция. Если есть возможность запуска счетчика с определенного значения,
    то в качестве этого значения должно быть использован переданный параметр init_val.

  - t_lclock_ticks lclock_get_ticks(void)
  
    Возвращает текущее значение системного счетчика

  - char lclock_is_initialized(void);
  
    Возвращает 1, если таймер возможно использовать
    (инициализирован или не треубует инициализации)

  - lclock_disable(void)
  
    Запрет работы системного таймера, если требуется



  Пользовательское API
  ========================

  Функции порта могут использоваться как напрямую, используя определения из lclock.h,
  так и через общее API для работы с таймером из ltimer.h, который может 
  использоваться для отсчета интервалов времени.

  Базовые функции принимают значения в отсчетах системного счетчика, поэтому необходимо
  использовать константу LCLOCK_TICKS_PER_SECOND для перевода времени в количество отсчетов.
  Также можно использовать макросы LTIMER_MS_TO_CLOCK_TICKS() и LTIMER_CLOCK_TICKS_TO_MS()
  для перевода интервалов в миллисекундах в количество отсчетов и наоборот.
  Для удобства также есть функции с суффиксом _ms, которые принимают время в миллисекундах
  и сами вызывают указанные макросы для выполнения преобразования в отсчеты таймера.

  Следует учитывать, что в связи с тем, что момент запуска таймера и увеличения
  системного счетчика не синхронизированы, факт завершения интервала может быть
  задержан вплоть до одного интервала системного счетчика. Кроме того, при переводе
  из миллисекунд в отсчеты системного таймера в зависимости от заданного времени
  и параметра LCLOCK_TICKS_PER_SECOND может быть также ошибка в большую сторону
  при округлении до целого числа отсчетов системного таймера.

  Для работы с модулем в проекте нужно добавить в стандартные пути
  для включения заголовочных файлов пути к файлу ltimer.h и к директории с портом
  для используемой платформы, а также путь к файлу lcspec.h, в котором
  описаны специфические для компилятора макросы (в данном случае используется
  LINLINE для определения inline-функций). Также необходимо в исходники
  добавить файл lclock.c из нужного порта.

  При работе с системным счетчиком контроллера перед вызовом функций данного модуля
  необходимо вызвать функцию lclock_init() (или lclock_init_val(), если нужно задать
  начальное значение системного счетчика). При работе с системными часами ОС
  обычно эта функция не требуется, так как таймер ОС уже инициализирован
  самой ОС (однако ее вызов можно оставить, так как каждый порт реализует хотя бы
  "пустую" версию этой функции).

  Для работы с системным счетчиком напрямую используется функция lclock_get_ticks(),
  возвращающая значение системного счетчика.

  Для работы с API таймера, необходимо объявить переменную типа #t_ltimer, которая
  будет хранить состояние таймера. Работать с полями структуры напрямую не рекомендуется.
  Вместо этого следует использовать функции из ltimer.h, которые принимают эту
  переменную в качестве первого аргумента.

  При стандартной работе, сперва таймер устанавливается для отсчета заданного
  интервала с помощью ltimer_set() или ltimer_set_ms(). Проверить, истек ли заданный интервал,
  можно с помощью ltimer_expired(). Количество отсчетов системного счетчика
  до истечения интервала можно получить с помощью ltimer_expiration().
  Перезапустить таймер на установленный в предыдущем ltimer_set() интервал можно
  с помощью ltimer_reset() или ltimer_restart() (относительно времени последнего
  истечения таймера или текущего времени соответственно).

  Например, если какие-то действия нужно выполнять в течении заданного интервала,
  то это можно сделать следующим образом:

  ```c
  //время интервала в мс
  #define TIMEOUT_MS   200

  void main(void) {
    t_ltimer tmr;
    //инициализируем системный счетчик
    lclock_init();
    // устанавливаем таймер на заданное кол-во мс
    ltimer_set_ms(&tmr, TIMEOUT_MS);
    while (!ltimer_expired(&tmr)) {
        //выполняем требуемые действия

    }

    //интервал завершился
  }
  ```


  В качестве основной идеи была взята реализация таймера для стека uIP от
  Adam Dunkels <adam@sics.se>
