Важная информация

User Tag List

Показано с 1 по 10 из 10

Тема: Часы реального времени.

  1. #1
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,570
    Благодарностей: 2690
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Часы реального времени.

    Поскольку в следующей версии "эмулятора ДВК" появится устройство HC, реализующее концепцию "блочных часов реального времени" - есть смысл обсудить некоторые подробности.

    Главная особенность предлагаемой концепции в том, что часы реального времени реализуются как контроллер одноблочного диска, позволяющий читать или писать "блок времени" переменной длины. В эмуляторе ДВК - HC будет работать через интерфейс HD по командам "прочитать таймблок" и "записать таймблок". HD t1, t2 и t3 будут читать/писать блок времени через прямой доступ к ОЗУ, а HD t4 и t5 - получать/отдавать таймблок через регистр данных.

    Поскольку таймблок может иметь произвольную длину - первым словом блока должна идти его длина в байтах. Это слово должно не только находиться в начале программного буфера при его отдаче контроллеру через ДМА, но и передаваться первым словом пакета в случае записи блока времени в контроллер через регистр данных.

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

    Если программа рассчитана на более продвинутую версию таймблока и пытается записать в контроллер слишком большой для него блок - контроллер считывает поддерживаемые им поля и выставляет бит ошибки в CSR с кодом ошибки "превышен размер блока" в регистре данных. Узнать поддерживаемую контроллером версию таймблока можно выполнив чтение - контроллер всегда отдаёт полный таймблок максимального поддерживаемого размера, который ( размер ) однозначно соответствует реализованной спецификации таймблока. Программа, наоборот - может писать в контроллер блоки любого размера, меньшего или равного размеру блока контроллера.


    Относительно конкретного формата таймблока однозначного понимания пока нет - возможный вариант выглядит так:

    Скрытый текст


    000000 Размер блока в байтах.

    000002 Номер года - int16, содержащий число лет в дате новой эры или отрицательное число лет в дате до новой эры ( номер 0 - недопустим, поэтому при записи означает запись блока времени без даты, а при чтении - отсутствие даты в контроллере ).

    000004 Номер месяца в диапазоне 1..12 или 0 - если дата в контроллере не установлена. -1 при записи = игнорировать это поле.

    000006 Номер дня в диапазоне 1..31 или 0 - если дата в контроллере не установлена. -1 при записи = игнорировать это поле.

    000010 Read Only Номер дня в неделе в диапазоне 1..7 ( 1 = понедельник, 7 = воскресенье ), 0 - если дата не установлена или -1, если контроллер не поддерживает день недели.

    000012 Номер часа в диапазоне 0..23 или ( при записи ) -1, если это поле не должно измениться при записи блока.

    000014 Номер минуты в диапазоне 0..59 или ( при записи ) -1, если это поле не должно измениться при записи блока.

    000016 Номер секунды в диапазоне 0..59 или ( при записи ) -1, если это поле не должно измениться при записи блока.

    000020 Номер миллисекунды в секунде в диапазоне 0..999 или -1, если контроллер не поддерживает это поле или оно не должно измениться при записи блока.

    000022 000024 Int32 - Номер миллисекунды после полуночи в диапазоне 0..86399999 или -1, если контроллер не поддерживает это поле. При записи игнорируется, если хотя бы одно из 4-х предыдущих полей не содержит -1.

    000026 000030 Int32 - Время в тиках от 0 до TickMax ( зависит от поля частоты тиков ) или -1, если контроллер не поддерживает это поле. При записи игнорируется, если хотя бы одно из 5 предыдущих полей не содержит -1.

    000032 Частота тиков ( Гц ) в диапазоне 0..10000 или -1, если контроллер не поддерживает это поле или оно не должно измениться при записи. При изменении этого поля - значение предыдущего поля пересчитывается для новой частоты.

    000034 Вектор циклического прерывания: 0 - прерывания запрещены, 0100..0464 - прерывания разрешены, -1 - контроллер не поддерживает генерацию этого прерывания или поле не должно измениться при записи.

    000036 Приоритет циклического прерывания в диапазоне 4..7 или -1, если контроллер не поддерживает приоритет циклического прерывания или поле не должно измениться при записи.

    000040 Коррекция 60 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 60 секунд с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000042 Коррекция 3600 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 60 минут с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000044 Коррекция 216000 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 60 часов с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000046 Коррекция 12960000 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 3600 часов с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000050 000052 Read Only Int32 - База 3600 - число секунд, прошедших с последнего изменения времени или поля "Коррекция 3600", 0 - если эта коррекция не активирована или -1, если контроллер не поддерживает это поле.

    000054 000056 Read Only Int32 - База 216000 - число секунд, прошедших с последнего изменения времени или поля "Коррекция 216000", 0 - если эта коррекция не активирована или -1, если контроллер не поддерживает это поле.

    000060 000062 Read Only Int32 - База 12960000 - число секунд, прошедших с последнего изменения времени или поля "Коррекция 12960000", 0 - если эта коррекция не активирована или -1, если контроллер не поддерживает это поле.
    [свернуть]


    Текущую спецификацию HC см. ЗДЕСЬ
    Последний раз редактировалось Patron; 14.10.2017 в 17:46.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Activist
    Регистрация
    27.11.2013
    Адрес
    г. Санкт-Петербург
    Сообщений
    277
    Благодарностей: 81
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  4. #3
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,570
    Благодарностей: 2690
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AlexG Посмотреть сообщение
    если указывать только длину, то если потребуется поменять формат(при неизменной длине данных) - потребуется "присваивать" фиктивную длину.
    Сложно представить часы без информации о годе. Если информация о годе в новом формате данных есть - все неиспользуемые поля контроллер нового формата может заполнять предусмотренными форматом "заглушками", добавляя свои поля в конце. Это позволяет даже самым старым программам читать из нового контроллера правильную дату.

    Однако, сложно представить, что может заставить настолько изменить формат данных часов реального времени, чтобы в нём не осталось информации о дате и времени. Идеи вроде "хочу номер месяца не от 1 до 12, а от 0 до 11" - вряд ли требуют полной смены формата при неизменном размере блока, скорее надо просто научиться вычитать единицу из содержимого стандартного поля стандартного блока.

  5. #4
    Guru Аватар для MiX
    Регистрация
    13.12.2013
    Адрес
    г. Санкт-Петербург
    Сообщений
    2,413
    Благодарностей: 796
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Patron Посмотреть сообщение
    Поскольку в следующей версии "эмулятора ДВК" появится устройство HC, реализующее концепцию "блочных часов реального времени" - есть смысл обсудить некоторые подробности.
    Реализация TOY в PDP11/93 на адресе 177526 (17 777 526).
    Всё остальное можно почитать - здесь.
    Страница 1-49

    - - - Добавлено - - -

    Цитата Сообщение от Patron Посмотреть сообщение
    В эмуляторе ДВК - HC будет работать через интерфейс HD
    В эмуляторе лучше сделать отдельное устройство TOY со своим адресом.

  6. #5
    Guru Аватар для form
    Регистрация
    27.05.2009
    Адрес
    СССР, Новосибирск
    Сообщений
    5,111
    Благодарностей: 1928
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от MiX Посмотреть сообщение
    Реализация TOY в PDP11/93 на адресе 177526
    Делать для эмулятора побитовое чтение информации ради нерабочей совместимости (RSX, RSTS такой TOY не найдут только от того, что его повесят на тот же адрес ASR) - не лучшая идея. Вот если со временем будет эмулироваться KDJ11-E - там оно в самый раз, причем регистр будет более функциональным чем на 1 бит

    - - - Добавлено - - -

    Касаемо же прочего, считаю, что всякие коррекции абсолютно бесполезны (равно как и ведение независимых часов с возможностью установки) - это бы имело смысл если бы эмулировался TOY, совместимый с чем-то существующим. В данном же случае вполне достаточно возможности прочитать время из системы в которой эмулятор работает для синхронизации.
    PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
    Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
    PMI: KDJ11-BF, MSV11-JE
    VT220, CM7209

  7. #6
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,570
    Благодарностей: 2690
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от form Посмотреть сообщение
    Касаемо же прочего, считаю, что всякие коррекции абсолютно бесполезны (равно как и ведение независимых часов с возможностью установки) - это бы имело смысл если бы эмулировался TOY, совместимый с чем-то существующим. В данном же случае вполне достаточно возможности прочитать время из системы в которой эмулятор работает для синхронизации.
    А вот при аппаратной реализации контроллера типа HD есть потребность в интерфейсе для комплектных батареечных часов реального времени. Чтобы добиться от батареечных часов реального времени приемлемого дрейфа показаний - коэффициенты коррекции могут быть довольно полезны. Если установлена (например) ежечасовая коррекция и контроллер включается спустя 100 часов после выключения, то в случае запоминания времени выключения - контроллер при включении может сам определить интервал бездействия и применить к батареечным часам необходимую коррекцию. Мне при помощи коэффициентов коррекции удавалось добиваться от батареечных часов реального времени довольно неплохой точности.

  8. #7
    Guru Аватар для form
    Регистрация
    27.05.2009
    Адрес
    СССР, Новосибирск
    Сообщений
    5,111
    Благодарностей: 1928
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Patron Посмотреть сообщение
    А вот при аппаратной реализации
    Для аппаратной реализации согласен - может пригодиться. Но будет ли она?
    PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
    Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
    PMI: KDJ11-BF, MSV11-JE
    VT220, CM7209

  9. #8
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,570
    Благодарностей: 2690
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от form Посмотреть сообщение
    Для аппаратной реализации согласен - может пригодиться. Но будет ли она?
    Это не принципиально. Главное - разработать универсальную спецификацию.

    ...

    При реализации часов реального времени в составе дискового контроллера - полезно иметь интерфейс таких часов максимально "дискообразным", поэтому (возможно) есть смысл отказаться от специальных команд работы с таймблоком и вместо этого - работать с "приводом времени" как с обычным диском, выбираемым специальным номером привода за пределами разрешённых номеров приводов 0..255 ( например - восьмеричный номер привода 0444 = 292 ).

    Тогда, в случае успешного выбора "привода времени" - следующие команды задания адреса буфера и счётчика слов сообщат контроллеру размер буфера пользователя для приёма таймблока, а команда задания номера блока - выберет интересующий раздел для чтения/записи.

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

    Блок 0 - Дата и время.

    000000 Размер блока в байтах.

    000002 Номер года - int16, содержащий число лет в дате новой эры или отрицательное число лет в дате до новой эры ( номер 0 - недопустим, поэтому при записи означает запись блока времени без даты, а при чтении - отсутствие даты в контроллере ).

    000004 Номер месяца в диапазоне 1..12 или 0 - если дата в контроллере не установлена. -1 при записи = игнорировать это поле.

    000006 Номер дня в диапазоне 1..31 или 0 - если дата в контроллере не установлена. -1 при записи = игнорировать это поле.

    000010 Read Only Номер дня в неделе в диапазоне 1..7 ( 1 = понедельник, 7 = воскресенье ), 0 - если дата не установлена или -1, если контроллер не поддерживает день недели.

    000012 Номер часа в диапазоне 0..23 или ( при записи ) -1, если это поле не должно измениться при записи блока.

    000014 Номер минуты в диапазоне 0..59 или ( при записи ) -1, если это поле не должно измениться при записи блока.

    000016 Номер секунды в диапазоне 0..59 или ( при записи ) -1, если это поле не должно измениться при записи блока.

    000020 Номер миллисекунды в секунде в диапазоне 0..999 или -1, если контроллер не поддерживает это поле или оно не должно измениться при записи блока.

    000022 000024 Int32 - Номер миллисекунды после полуночи в диапазоне 0..86399999 или -1, если контроллер не поддерживает это поле. При записи игнорируется, если хотя бы одно из 4-х предыдущих полей не содержит -1.

    000026 000030 Int32 - Время в тиках от 0 до TickMax ( зависит от поля частоты тиков ) или -1, если контроллер не поддерживает это поле. При записи игнорируется, если хотя бы одно из 5 предыдущих полей не содержит -1.

    000032 Частота тиков ( Гц ) в диапазоне 0..10000 или -1, если контроллер не поддерживает это поле или оно не должно измениться при записи. При изменении этого поля - значение предыдущего поля пересчитывается для новой частоты.



    Блок 1 - Управление циклическим прерыванием

    000000 Размер блока в байтах.

    000002 Вектор циклического прерывания: 0 - прерывания запрещены, 0100..0464 - прерывания разрешены, -1 - контроллер не поддерживает генерацию циклического прерывания или поле не должно измениться при записи.

    000004 Приоритет циклического прерывания в диапазоне 4..7 или -1, если контроллер не поддерживает приоритет циклического прерывания или поле не должно измениться при записи.

    Если контроллер не поддерживает управление циклическим прерыванием - задание номера блока 1 должно завершаться ошибкой с кодом "выход за пределы устройства".



    Блок 2 - Управление коррекцией

    000000 Размер блока в байтах.

    000002 Коррекция 60 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 60 секунд с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000004 Коррекция 3600 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 60 минут с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000006 Коррекция 216000 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 60 часов с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000010 Коррекция 12960000 - Int16, содержащий число миллисекунд, прибавляемое к таймеру каждые 3600 часов с момента изменения времени или этого поля, или 0100000, если контроллер не поддерживает это поле или оно не должно измениться.

    000012 000014 Read Only Int32 - База 3600 - число секунд, прошедших с последнего изменения времени или поля "Коррекция 3600", 0 - если эта коррекция не активирована или -1, если контроллер не поддерживает это поле.

    000016 000020 Read Only Int32 - База 216000 - число секунд, прошедших с последнего изменения времени или поля "Коррекция 216000", 0 - если эта коррекция не активирована или -1, если контроллер не поддерживает это поле.

    000022 000024 Read Only Int32 - База 12960000 - число секунд, прошедших с последнего изменения времени или поля "Коррекция 12960000", 0 - если эта коррекция не активирована или -1, если контроллер не поддерживает это поле.

    Если контроллер не поддерживает коэффициенты коррекции - задание номера блока 2 должно завершаться ошибкой с кодом "выход за пределы устройства".

    - - - Добавлено - - -

    Если контроллер не поддерживает изменение выбранного блока - выполнение записи должно завершаться ошибкой с кодом "попытка записи на защищённое устройство".
    В случае записи таймблока с ошибочным параметром в любом из полей - контроллер должен игнорировать переданный блок и возвращать ошибку записи с кодом IE_NUM = "параметр вне диапазона" ( 0356 ).
    В случае, если поле размера таймблока превышает размер выбранного таймблока контроллера - контроллер должен обработать поддерживаемые поля и возвратить ошибку записи с кодом "выход за пределы устройства".
    Если размер таймблока превышает счётчик слов, заданный дисковой командой "установить счётчик слов", контроллер должен при чтении блока - использовать размер из первого поля блока, а при записи - выдавать в первом поле полный размер выбранного блока, но передавать программе количество слов блока, равное текущему значению счётчика слов.
    Последний раз редактировалось Patron; 14.10.2017 в 20:33.

  10. #9
    Veteran
    Регистрация
    02.03.2015
    Адрес
    г. Караганда, Казахстан
    Сообщений
    1,034
    Благодарностей: 331
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    С миллисекундами имеется некоторая напряженка - у STM32 RTC сделан по-простому. Есть два счетчика, один считает такты 32768, второй, в UNIX-стиле, считает секунды в 32-разрядном счетчике. Еще есть сигнал его переполнения, остальные разряды, сверх 32, рекомендуют считать программно. Рулёжке поддаётся только делитель для 32768. То есть, конечно, рассчитать все это программно - не вопрос, только точность будет не очень, лучше как-то учесть эти 32768...
    Последний раз редактировалось AFZ; 13.10.2017 в 18:08.
    Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)

  11. #10
    Guru
    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,570
    Благодарностей: 2690
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я делал так - при подаче питания на контроллер ( в моём случае это был запуск программы сервера точного времени ) - контроллер считывает значение счётчика секунд RTC и на его основе вычисляет базу счётчика миллисекунд после полуночи, как [ значение секунд RTC после полуночи +1 ]*1000, потом запускает собственный счётчик тысячных долей текущей секунды от делителя своей тактовой частоты и затем непрерывно опрашивает счётчик секунд RTC, а при его изменении - детектирует "срез секунды" и обнуляет свой счётчик тысячных долей секунды, также обнуляя дополнительный счётчик - секунд с момента последней синхронизации.

    После этого, при каждом достижении счётчиком долей секунды значения 1000 - это значение прибавляется к счётчику миллисекунд после полуночи и обнуляется, а значение счётчика секунд с момента последней синхронизации увеличивается на 1.

    Если счётчик секунд с момента последней синхронизации превышает 60 - свободный контроллер снова запускает процедуру синхронизации с RTC, но на этот раз запоминает значение счётчика миллисекунд после полуночи и счётчика тысячных долей текущей секунды на момент синхронизации для вычисления ежеминутного расхождения своего счёта и счёта RTC.

    Задача контроллера - максимально точно предсказывать момент смены секунды в RTC, чтобы дрейф его собственного кварца не влиял на вычисление пользователем коэффициентов коррекции для показаний RTC.

    Когда пользователь вводит коэффициенты коррекции - контроллер просто их запоминает, также запоминая базу значения счётчика секунд RTC в момент ввода коррекции. После этого при каждом запросе времени - вычисляется количество прошедших интервалов коррекции, умножается на коэффициент коррекции и прибавляется к счётчику миллисекунд после полуночи перед началом вычисления откорректированного значения даты и времени.

    Корректировать значение счётчика секунд RTC в таком случае не требуется - надо только вводить коррекции в момент вычисления даты и времени.

    - - - Добавлено - - -

    В принципе - такой алгоритм несложно адаптировать для использования счётчика тактов 32768 в качестве счётчика долей секунды. Тогда не будет мороки с синхронизацией счёта контроллера и счёта RTC, но для вычисления номера миллисекунды текущей секунды - потребуются вычисления на основе текущего значения счётчика тактов 32768.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 186
    Последнее: 02.10.2017, 14:29
  2. PseudoTR-DOS для NEMO IDE без реального TR-DOS %)
    от fan в разделе Внешние накопители
    Ответов: 14
    Последнее: 15.01.2010, 17:01
  3. Ответов: 74
    Последнее: 09.07.2009, 11:39
  4. Spectrum как система реального времени
    от King of a S†ellar War в разделе ZX Концепции
    Ответов: 55
    Последнее: 21.12.2008, 20:57

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •