User Tag List

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

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

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #8

    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,805
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    147
    Поблагодарили
    78 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    000032 - FTime - Частота тиков ( Гц ) в диапазоне 1..10000 ( допустимые значения: 1, 10, 50, 60, 100, 200, 500, 1000, 2000, 5000, 10000 ) или -1, если контроллер не поддерживает это поле или оно не должно измениться при записи. При изменении этого поля - значение предыдущего поля пересчитывается для новой частоты тиков. При разрешении циклического прерывания - определяет его частоту.

    000034 000036 - ED - Int32 - Номер дня от начала эры ( -1 == 31.12.-1 | 1 == 01.01.01 ) в диапазоне: -106751992 .. +106751992 или 0, если контроллер не поддерживает это поле или оно не должно измениться при записи. При записи игнорируется, если хотя бы одно из предыдущих полей даты ( год, месяц, день ) было записано.

    000040 000042 000044 000046 - E0 - Int64 - Число секунд с момента начала эры ( -1 == 31.12.-1 23:59:59 | 0 == 01.01.01 00:00:00 | 1 == 01.01.01 00:00:01 ) в диапазоне: -9223372036854 .. +9223372036854 или 0x8000000000000000 ( 0x0000 0x0000 0x0000 0x8000 ), если контроллер не поддерживает это поле или оно не должно измениться при записи. При записи игнорируется, если хотя бы одно из предыдущих полей даты или времени ( кроме поля номера миллисекунды в текущей секунде ) было записано.

    000050 - LS - Величина високосной коррекции секунд в значении полей E0 и E6. Если контроллер или программа рассчитывает значения E0 и E6 без учёта високосных секунд UTC - это поле должно быть нулевым. Если при записи блока значение коррекции секунд, использованное программой, не соответствует правильному значению - контроллер исправляет разницу.

    000052 000054 000056 000060 - E6 - Int64 - Число микросекунд с момента начала эры в диапазоне: -0x7FFFFFFFFFFF .. +0x7FFFFFFFFFFF или 0x8000000000000000 ( 0x0000 0x0000 0x0000 0x8000 ), если контроллер не поддерживает это поле или оно не должно измениться при записи. При записи игнорируется, если хотя бы одно из предыдущих полей даты или времени было записано.


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

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

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

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

    Если контроллер не поддерживает управление циклическим прерыванием - задание номера блока 1 ( как и попытка чтения или записи блока 1 ) возвращает ошибку с кодом IE_NUM ( 0356 = параметр вне диапазона ), если контроллер поддерживает блок 2, или с кодом IE_BLK ( 0354 = выход за пределы устройства ), если контроллер обслуживает только запросы к блоку 0.


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

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

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

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

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

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

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

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

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

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

    Запрос размера устройства должен возвращать: 1 - если поддерживается только блок 0; 2 - если поддерживаются блоки 0 и 1; 3 - если поддерживается блок 2.

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

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


    Если контроллер не использует високосную коррекцию секунд, а программа при изменении даты и времени её передаёт - контроллер уменьшает переданное значение E0 на величину LS, а E6 - на величину LS*1000000.
    Если контроллер использует високосную коррекцию секунд, а программа нет - контроллер увеличивает переданное программой значение E0 на правильную величину LS, а E6 - на величину LS*1000000.
    Если контроллер и программа используют коррекцию секунд, но одно из значений превышает другое - правильным принимается большее значение на текущую дату.
    Если программа задаёт новую коррекцию секунд для даты, превышающей дату и величину последней коррекции секунд, используемой контроллером - контроллер должен запомнить дату введения новой коррекции и её величину.
    Если программа передаёт блок с единственным активным полем LS - контроллер при отсутствии запомненной даты дополнительной коррекции - запоминает текущую дату и переданную коррекцию, а при наличии запомненной даты дополнительной коррекции - изменяет значение коррекции для этой даты на переданное. Если контроллер не поддерживает високосную коррекцию секунд - запись блока с единственным активным полем LS игнорируется.
    Последний раз редактировалось Patron; 12.11.2017 в 19:33.

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

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

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

Похожие темы

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

Ваши права

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