Что значит системное время
Вся правда об ОСРВ. Статья #27. Системное время
Понятие времени в контексте ОСРВ была введена в одной из предыдущих статей, вместе с идеей о связанных со временем функциях, доступных в ОСРВ.
Тик таймера
Все функции, связанные со временем, управляются аппаратными часами. Это простой осциллятор, который генерирует запросы на прерывание с постоянными интервалами. Чтобы номера тактов имели смысл для прикладных программ, частота генератора должна быть известна.
Обработки таймерных прерываний
Прерывания, генерируемые аппаратным таймером, должны обслуживаться определенным образом в обработчике прерываний (англ. Interrupt Service Routine, ISR), в котором реализованы все функции ОСРВ, связанные со временем. Детали обработчика прерываний таймера в Nucleus SE будут рассмотрены в одной из следующих статей.
Функции, связанные со временем
Nucleus RTOS и Nucleus SE содержат несколько механизмов, связанных со временем:
Точность
А сейчас стоит вкратце рассказать о точности системного таймера.
Точность временных функций напрямую зависит от частоты тактового генератора. Например, если импульсы поступают каждые 10 миллисекунд, а задаче приложения необходима задержка в 100 миллисекунд, ей очевидно нужно 10 импульсов. Однако неизвестно, когда был получен предыдущий импульс: это могло произойти только что или почти 10 миллисекунд назад. Поэтому 100-миллисекундная задержка может занять вплоть до 110 миллисекунд.
Очевидный способ решения этой проблемы — повышение частоты генератора. Если импульсы следуют с интервалами в 1 миллисекунду, 100-миллисекундная задержка никогда не займет больше ста одной миллисекунды. Недостатком такого решения будет то, что обработчика прерываний таймера заберет в 10 раз больше процессорного времени, что будет чрезмерным. Разработчик системы должен найти баланс между необходимой точностью таймера и доступными мощностями процессора.
Настройка системного времени
Как и для большинства объектов Nucleus SE, настройка системного времени по большей части управляется директивами #define в файле nuse_config.h. Основным параметром является NUSE_SYSTEM_TIME_SUPPORT, который активирует механизм поддержки системного времени. Количество объектов указывать не нужно: системное время либо активировано, либо нет.
Выбор ненулевого значения является главным активатором системного времени. Этот параметр используется при определении структур данных, о которых будет подробно рассказано далее в этой статье. Кроме того, ненулевое значение активирует настройки API.
Активация API
Каждая функция API (служебный вызов) в Nucleus SE имеет активирующую директиву #define в файле nuse_config.h. Для системного времени такими символами являются:
NUSE_CLOCK_SET
NUSE_CLOCK_RETRIEVE
По умолчанию, им присваивается значение FALSE, таким образом все служебные вызовы отключены, блокируя включение реализующего их кода. Для настройки системного времени в приложении нужно выбрать необходимые служебные вызовы API и присвоить им значение TRUE.
Ниже приведен фрагмент кода из файла nuse_config.h по умолчанию.
При попытке использования служебного вызова API системного времени при выключенном активаторе системного времени произойдет ошибка компиляции. Если ваш код использует вызов API, который не был активирован, произойдет ошибка компоновки, так как код реализации не был включен в приложение.
Служебные вызовы системного времени
Nucleus RTOS поддерживает два служебных вызова, которые относятся к системному времени и обеспечивают следующий функционал:
Служебные вызовы установки и получения системного времени
С системным временем можно выполнять только операции установки в заданное значение и получения текущего значения. Nucleus RTOS и Nucleus SE предоставляют по два базовых вызова API для реализации этих операций.
Интерпретация значения системного времени зависит от приложения, так как является по своей сути счетчиком количества «тактов» часов, которые произошли с момента последнего сброса счетчика. Для использования этой информации должна быть известна частота генератора.
Установка времени
Любая задача может установить системное время при помощи вызова этой функции API.
Вызов для установки системного времени в Nucleus RTOS
Прототип служебного вызова:
VOID NU_Set_Clock(UNSIGNED new_value);
Параметры:
new_value – значение, которое будет присвоено системному времени
Возвращаемое значение: отсутствует.
Вызов для установки системного времени в Nucleus SE
Этот вызов API поддерживает основной функционал Nucleus RTOS API.
Прототип служебного вызова:
void NUSE_Clock_Set(U32 new_value);
Параметры:
new_value – значение, которое будет присвоено системному времени
Возвращаемое значение: отсутствует
Реализация установки времени в Nucleus SE
Код очень прост. Предоставленное значение записывается в NUSE_Tick_Clock внутри критической секции.
Получение системного времени
Задача может получить значение системного времени при помощи этой функции API.
Вызов для получения системного времени в Nucleus RTOS
Прототип служебного вызова:
UNSIGNED NU_Retrieve_Clock(VOID);
Возвращаемое значение: текущее значение системного времени
Вызов для получения системного времени в Nucleus SE
Прототип служебного вызова:
U32 NUSE_Clock_Retrieve(void);
Возвращаемое значение: текущее значение системного времени
Реализация получения времени в Nucleus SE
Код очень прост. Функция возвращает значение NUSE_Tick_Clock, полученное в критической секции.
Структуры данных
Системное время использует одну структуру данных (находящуюся в ОЗУ), которая представляет из себя 32-битное слово.
Настоятельно рекомендую, чтобы код приложения не использовал прямой доступ к этой структуре данных, а обращался к ней через предоставляемые функции API. Это позволит избежать несовместимости с будущими версиями Nucleus SE и нежелательных побочных эффектов, а также упростит портирование приложений на Nucleus RTOS. Подробная информация о структурах данных приведена ниже, чтобы упростить понимание работы кода служебных вызовов и для отладки.
Данные ОЗУ
Структура данных:
NUSE_Tick_Clock – переменная типа U32, в которой хранится счетчик тактов системного времени.
Эта структура данных инициализируется нулём функцией NUSE_Init_Task() при запуске Nucleus SE. Одна из следующих статей будет содержать полное описание процедур запуска Nucleus SE.
Данные ПЗУ
В ПЗУ нет структур данных, связанных с системным временем.
Объем памяти для системного времени
Как и у всех других объектов Nucleus SE, объем памяти, необходимый для системного времени, предсказуем.
Объем памяти в ПЗУ равен 0.
Объем памяти в ОЗУ (в байтах) всегда равен 4.
Нереализованные вызовы API
Все служебные вызовы API Nucleus RTOS, относящиеся к системному времени, имеют эквивалент в Nucleus SE.
Совместимость с Nucleus PLUS
Как и в случае со всеми другими объектами Nucleus SE, моей целью было обеспечение максимально возможной совместимости кода приложений с Nucleus RTOS. Системное время не является исключением и, с точки зрения пользователя, оно реализовано во многом также, как и в Nucleus RTOS. Вызовы API Nucleus RTOS могут быть напрямую перенесены на Nucleus SE.
В следующей статье мы рассмотрим программные таймеры.
Что можно узнать на нашем сайте в разделе “Время”?
Здесь вы можете проверить разницу между системным временем устройства и часовым поясом, определенным по IP.
Что такое системное время и часовой пояс (IP)?
Системное время — это дата и время, установленные на устройстве.
Часовой пояс, наоборот, определяется по IP с помощью метода IP-геолокации.
Как разница в системном времени и часовом поясе (IP) раскрывает анонимность?
Системное время на устройстве могут видеть все сайты. Но если вы используете Proxy/VPN, то по IP адресу можно определить и часовой пояс. Если системное время будет отличаться от часового пояса (IP), то это скажет о том, что вы скрываете IP, а значит ваша анонимность будет раскрыта.
Необходимо ли вручную задавать системное время?
Да. Если вы используете средства для сокрытия IP, то рекомендуется менять и системное время на устройстве.
С помощью утилиты Run as Date можно запустить любую программу с нужным системным временем (без изменения времени в системе устройства).
Можно использовать качественные программы для сокрытия IP и шифрования трафика с автоматической сменой часового пояса (например, утилиту Privatix).
Как вручную установить системное время:
Windows 10 :
Нажмите на часы в правом нижнем углу экрана и затем на “Date and time settings”.
Отключите “Set time Automatically” и “Set time zone automatically”, после чего нажмите кнопку “Change” под надписью “Change data and time”, где и можно изменить время. Ниже можно отключить “Automatically adjust clock for daylight saving changes” (автоматический переход на летнее время и обратно).
Системное время
Системное время использует системные часы и используется в Unix системах для слежения за временем. Его можно установить с помощью аппаратных часов или с помощью внешнего сервера времени.
Contents
Предисловие
Программные или аппаратные часы
Системные часы, предоставляемые ядром, реализуются простым подсчетом числа секунд, прошедших с 1 января 1970 года 00:00:00 UTC по настоящее время. Это число называется Unix-время.
Аппаратные часы, также известные как часы реального времени (real-time clock или RTC), обычно представляют из себя элемент материнской платы. Они работают все время, независимо от состояния операционной системы, даже когда компьютер выключен.
UTC или местное время
Настройка времени аппаратных часов может быть осуществлена исходя из двух стандартов: локальное время или время UTC. Локальное время — это реальное время часового пояса, учитывающее переход на DST. Предпочтительно использовать UTC, поскольку системное время вычисляется посредством прибавления к нему разницы времени часового пояса с учётом летнего времени. Благодаря этому перевод часов на летнее время учитывается автоматически, а изменение часового пояса возможно без изменения значения аппаратных часов. Исключение может быть сделано при использовании систем с двойной загрузкой, когда одна операционная система не поддерживает или не настроена для аппаратных часов с UTC (по умолчанию Windows настроена на использование локального времени).
Конфигурация
Часовой пояс
Для поддержания правильного исчисления времени необходимо выбрать соответствующий часовой пояс, чтобы системе было известно её текущее местоположение.
OpenRC
systemd
В systemd существует команда timedatectl для настройки часового пояса:
Проверка текущего часового пояса:
Вывод доступных часовых поясов:
Чтобы изменить часовой пояс, пример для Германии:
LC_TIME
Эта переменная окружения определяет форматирование даты и времени. Для более детальной информации смотрите The GNU C Library
Системные часы
Обычно время системных часов устанавливается аппаратными часами во время загрузки системы. Также системные часы возможно установить вручную либо с помощью сервера сетевого времени.
Для изменения системного времени можно воспользоваться командой date :
Вывод текущего времени программных часов:
Установка нового системного времени, например на 6 мая 2016 года в 12:34:
Сервер времени
Смотрите статью NTP, чтобы получить информацию по использованию сервера времени.
systemd
systemd существует команда timedatectl для управления системным временем:
Вывод текущего времени программных часов:
Установка системного времени:
Аппаратные часы
Чтобы получить доступ к аппаратным часам, нужно собрать ядро со следующими включенными параметрами:
Следующая команда выводит текущее на данный момент время аппаратных часов:
Следующая команда устанавливает время аппаратных часов в соответствии с системным временем:
Синхронизация аппаратных часов и системного времени
Обычно аппаратные часы используются при загрузке для установки системного времени. Это может быть осуществлено ядром самостоятельно, либо с помощью загрузочного сервиса init-скрипта при загрузке. Завершение работы ядра или сервиса также может вызвать сохранение времени системных часов в аппаратные часы. Благодаря этому у системы будет правильное время при следующей загрузке.
Синхронизация с помощью ядра
В свежих версиях (3.9 и выше) ядро Linux можно сконфигурировать таким образом, чтобы оно устанавливало системное время автоматически. Чтобы добиться этого, необходимо включить в ядре параметры Set system time from RTC on startup and resume ( CONFIG_RTC_HCTOSYS ) и Set the RTC time based on NTP synchronization ( CONFIG_RTC_SYSTOHC ):
Чтобы убедиться, что время аппаратных часов обновилось, установите пакет net-misc/adjtimex и запустите следующую команду:
Выведенное число 64 бит должно быть не задано (0). Более подробная информация в man-странице hwclock (ищите ’11 minute mode’).
OpenRC
Перезапустите сервис hwclock и добавьте его init-скрипт в уровень запуска boot:
systemd
Для установки системного времени во время загрузки можно использовать systemd. Для управления аппаратными часами используйте команду timedatectl :
Вывод текущего времени аппаратных часов:
Следующая команда устанавливает аппаратные часы в соответствии с системным временем (в стандарте времени UTC):
Следующая команда устанавливает аппаратные часы в соответствии с системным временем в стандарте времени localtime (местное время):
Устранение проблем
Двойная загрузка с Windows
Системы с возможностью загрузки другой операционной системы, например Windows, обычно будут испытывать проблемы с переназначением аппаратных часов. Чтобы сделать так, чтобы Windows не меняла аппаратные часы назад в локальное время, добавьте в реестр следующую запись.
Как изменить системные дату и время
Часто мы сталкиваемся с необходимостью сменить системное время и дату. Например, при переходе на летнее время или в поездке в местность с другим часовым поясом. На сегодняшний день переход на летнее в России отменен. Если автоматический переход на летнее время все же производится, нужно снять галочку в настройках даты и времени «Автоматический переход на летнее время и обратно». Однако, операционные системы многих пользователей не обновлены, такой галочки в настройках нет и данный переход осуществляется в автоматическом режиме.
Настройки даты также могут изменяться пользователями при обходе контроля лицензий приложений, если они привязаны к дате, а также при использовании VPN. В этой статье рассмотрим некоторые способы изменения системных даты и времени.
Изменение системных даты и времени в операционной системе Windows
Меняем дату и время через параметры даты и времени
Независимо от версии Windows можно сменить дату и время, щелкнув левой кнопкой мыши по часам в правом нижнем углу либо открыть Панель инструментов. В версиях более ранних, Windows 10, необходимо выбрать «Изменение настроек даты и времени», в Windows 10 для изменения даты и времени необходимо открыть «Параметры даты и времени». При этом может потребоваться ввод пароля администратора системы.
Далее меняете часовой пояс, дату и время на необходимые.
Меняем дату и время через командную строку
Чтобы воспользоваться командной строкой для изменения даты и времени, откройте командную строку с правами администратора. В Windows 7 и более поздних версий просто введите в строке поиска командная строка или cmd, щелкните по результату правой кнопкой мыши и выберите запуск от имени администратора. (подробнее о работе с командной строкой можно прочитать тут).
Команда для изменения времени time ЧЧ:ММ:СС (где ЧЧ – часы, ММ – минуты, СС – секунды), введите ее и нажмите Enter на клавиатуре.
Команда для изменения даты date ДД/ММ/ГГГГ (где ДД – день, ММ – месяц, ГГГГ – год), введите ее и нажмите Enter на клавиатуре.
Параметры даты и времени изменятся моментально, но сохранятся до первой перезагрузки. При следующем включении компьютера или после перезагрузки дата и время вернутся к исходному значению.
Такой способ удобен, если изменение системных даты и времени необходимы для временной настройки в целях обхода лицензии или использования VPN.
Статья #27. Системное время
Понятие времени в контексте ОСРВ была введена Колином Уоллсом в одной из предыдущих статей (#6), вместе с идеей о связанных со временем механизмах, доступных в ОС.
Все функции, связанные со временем, управляются аппаратными часами. Это простой осциллятор, который генерирует запросы на прерывание с постоянными интервалами. Чтобы номера тактов имели смысл для прикладных программ, частота генератора должна быть известна.
Обработки таймерных прерываний
Прерывания, генерируемые аппаратным таймером, должны обслуживаться определенным образом в обработчике прерываний (англ. Interrupt Service Routine, ISR), в котором реализованы все функции ОСРВ, связанные со временем. Детали обработчика прерываний таймера в Nucleus SE будут рассмотрены в одной из следующих статей.
Функции, связанные со временем
Nucleus RTOS и Nucleus SE содержат несколько механизмов, связанных со временем:
А сейчас стоит вкратце рассказать о точности системного таймера.
Точность временных функций напрямую зависит от частоты тактового генератора. Например, если импульсы поступают каждые 10 миллисекунд, а задаче приложения необходима задержка в 100 миллисекунд, ей очевидно нужно 10 импульсов. Однако неизвестно, когда был получен предыдущий импульс: это могло произойти только что или почти 10 миллисекунд назад. Поэтому 100-миллисекундная задержка может занять вплоть до 110 миллисекунд.
Очевидный способ решения этой проблемы — повышение частоты генератора. Если импульсы следуют с интервалами в 1 миллисекунду, 100-миллисекундная задержка никогда не займет больше ста одной миллисекунды. Недостатком такого решения будет то, что обработчика прерываний таймера заберет в 10 раз больше процессорного времени, что будет чрезмерным. Разработчик системы должен найти баланс между необходимой точностью таймера и доступными мощностями процессора.
Настройка системного времени
Как и для большинства объектов Nucleus SE, настройка системного времени по большей части управляется директивами #define в файле nuse_config.h. Основным параметром является NUSE_SYSTEM_TIME_SUPPORT, который активирует механизм поддержки системного времени. Количество объектов указывать не нужно: системное время либо активировано, либо нет.
Выбор ненулевого значения является главным активатором системного времени. Этот параметр используется при определении структур данных, о которых будет подробно рассказано далее в этой статье. Кроме того, ненулевое значение активирует настройки API.
Каждая функция API (служебный вызов) в Nucleus SE имеет активирующую директиву #define в файле nuse_config.h. Для системного времени такими символами являются:
По умолчанию, им присваивается значение FALSE, таким образом все служебные вызовы отключены, блокируя включение реализующего их кода. Для настройки системного времени в приложении нужно выбрать необходимые служебные вызовы API и присвоить им значение TRUE.
Ниже приведен фрагмент кода из файла nuse_config.h по умолчанию.
При попытке использования служебного вызова API системного времени при выключенном активаторе системного времени произойдет ошибка компиляции. Если ваш код использует вызов API, который не был активирован, произойдет ошибка компоновки, так как код реализации не был включен в приложение.
Служебные вызовы системного времени
Nucleus RTOS поддерживает два служебных вызова, которые относятся к системному времени и обеспечивают следующий функционал:
Служебные вызовы установки и получения системного времени
С системным временем можно выполнять только операции установки в заданное значение и получения текущего значения. Nucleus RTOS и Nucleus SE предоставляют по два базовых вызова API для реализации этих операций.
Интерпретация значения системного времени зависит от приложения, так как является по своей сути счетчиком количества «тактов» часов, которые произошли с момента последнего сброса счетчика. Для использования этой информации должна быть известна частота генератора.
Любая задача может установить системное время при помощи вызова этой функции API.
Вызов для установки системного времени в Nucleus RTOS
Прототип служебного вызова:
VOID NU_Set_Clock(UNSIGNED new_value);
Параметры:
new_value – значение, которое будет присвоено системному времени
Возвращаемое значение: отсутствует.
Вызов для установки системного времени в Nucleus SE
Этот вызов API поддерживает основной функционал Nucleus RTOS API.
Прототип служебного вызова:
void NUSE_Clock_Set(U32 new_value);
Параметры:
new_value – значение, которое будет присвоено системному времени
Возвращаемое значение: отсутствует
Реализация установки времени в Nucleus SE
Код очень прост. Предоставленное значение записывается в NUSE_Tick_Clock внутри критической секции.
Получение системного времени
Задача может получить значение системного времени при помощи этой функции API.
Вызов для получения системного времени в Nucleus RTOS
Прототип служебного вызова:
UNSIGNED NU_Retrieve_Clock(VOID);
Возвращаемое значение: текущее значение системного времени
Вызов для получения системного времени в Nucleus SE
Прототип служебного вызова:
U32 NUSE_Clock_Retrieve(void);
Возвращаемое значение: текущее значение системного времени
Реализация получения времени в Nucleus SE
Код очень прост. Функция возвращает значение NUSE_Tick_Clock, полученное в критической секции.
Системное время использует одну структуру данных (находящуюся в ОЗУ), которая представляет из себя 32-битное слово.
Настоятельно рекомендую, чтобы код приложения не использовал прямой доступ к этой структуре данных, а обращался к ней через предоставляемые функции API. Это позволит избежать несовместимости с будущими версиями Nucleus SE и нежелательных побочных эффектов, а также упростит портирование приложений на Nucleus RTOS. Подробная информация о структурах данных приведена ниже, чтобы упростить понимание работы кода служебных вызовов и для отладки.
Структура данных:
NUSE_Tick_Clock – переменная типа U32, в которой хранится счетчик тактов системного времени.
Эта структура данных инициализируется нулём функцией NUSE_Init_Task() при запуске Nucleus SE. Одна из следующих статей будет содержать полное описание процедур запуска Nucleus SE.
В ПЗУ нет структур данных, связанных с системным временем.
Объем памяти для системного времени
Как и у всех других объектов Nucleus SE, объем памяти, необходимый для системного времени, предсказуем.
Объем памяти в ПЗУ равен 0.
Объем памяти в ОЗУ (в байтах) всегда равен 4.
Нереализованные вызовы API
Все служебные вызовы API Nucleus RTOS, относящиеся к системному времени, имеют эквивалент в Nucleus SE.
Совместимость с Nucleus PLUS
Как и в случае со всеми другими объектами Nucleus SE, моей целью было обеспечение максимально возможной совместимости кода приложений с Nucleus RTOS. Системное время не является исключением и, с точки зрения пользователя, оно реализовано во многом также, как и в Nucleus RTOS. Вызовы API Nucleus RTOS могут быть напрямую перенесены на Nucleus SE.
В следующей статье мы рассмотрим программные таймеры.
Об авторе: Колин Уоллс уже более тридцати лет работает в сфере электронной промышленности, значительную часть времени уделяя встроенному ПО. Сейчас он – инженер в области встроенного ПО в Mentor Embedded ( подразделение Mentor Graphics). Колин Уоллс часто выступает на конференциях и семинарах, автор многочисленных технических статей и двух книг по встроенному ПО. Живет в Великобритании. Профессиональный блог Колина: https://blogs.mentor.com/colinwalls/, e-mail: colin_walls@mentor.com
Теги: ОСРВ, RTOS, очереди, взаимодействие задач, микроконтроллеры