С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
А вот у меня получалось.
Правда, эта ситуация выскакивала крайне редко.
Гораздо легче получить неразблокировку регистра текущего значения при его чтении.
---------- Post added at 16:27 ---------- Previous post was at 16:19 ----------
На счет регистра текущего значение есть такое предположение:
В режиме останова, он все равно блокируется в цикле по каждому фронту предделителя. И если счиать его в тот момент, когда пришел новый фронт, то он разблокируется, и заблокируется заново.
Да, в режиме останова.
---------- Post added at 16:41 ---------- Previous post was at 16:36 ----------
Последовательность такая:
1) 4 -> регистр состояния (останов, цикл 8мкс)
2) 4095 -> буферный регистр (0xFFF в шестнацатиричном)
(очень редко запись может не пройти, и в регистре останется старое значение)
3) читаем регистр текущего значения
4) читаем много раз регистр состояния
(в регистре состояния в одном и 10 случаев, а то и чаще, так и остается значение 132 (0x84 в шестнацатиричном), что говорит о заблокированном регистре текущего значения. В большинсве же случаев читается 0x04)
---------- Post added at 16:45 ---------- Previous post was at 16:41 ----------
Кстати, о том, что запись в регистры может не пройти, говорит и кусок кода из драйвера дисковода, где:
Loop:
0 -> регистр состояния
число -> буферный регистр
читаем регистр текущего значения, и если <> числу, то цикл на Loop
Что говорит нам о том, что:
1) запись нуля в регистр состояния может не пройти?
2) запись в буферный регистр может не пройти
После останова таймера надо обязательно прочесть регистр текущего значения (177714), т.к. если в регистре состояния (177710) стоит бит готовности, то естественно после записи в буфер (177712) новое значение и не перепишется в регистр текущего значения (177714), если стоит бит готовности, несмотря на то, что таймер в режиме СТОП. А вот после установки режима СТОП и чтения регистра текущего значения (177714) должны сбросится биты готовности, переполнения, фиксации внешнего события и буфер (177712) должен переписаться в регистр текущего значения (177714) (через счетчик естественно).
Если выразится точнее, то в режиме СТОП и установленном бите готовности буфер (177712) переписывается в счетчик, а вот счетчик перепишется в регистр текущего значения (177714) только после сброса бита готовности.
Это есть только в двух местах. В том же драйвере дисковода буфер (177712) грузится новым значением прям посреди процесса без всякой проверки. А вот в драйвере магнитофона когда в режиме СТОП заносится новое значение, то проверяется только регистр текущего значения (177714) и заново новое значение в буфер (177712) не заносится.
Вот набросок теста, который выявляет некоторые особенности.
На скринах три варианты работы:
Скрытый текст
Нормальный:
С несбросившимся регистром текущего значения:
С непрописавшимся буферным регистром:
Хотя, встречалась и такая ситуация:
[свернуть]
Интерес представляют только две нижние строчки дампа, а так же два числа итогового значения таймера, считанные друг за другом.
Изначально, таймер останавливается, в него загружается число 0xFFF, и идет обратный отсчет с приходом сетевого прерывания. Во время следующего прерывания от сетевого таймера, значение регистра текущего значения считывается два раза подряд.
Две строчки дампа представляют из себя фрагмет последовательного чтения регистра состояния в разные моменты времени. Первые 4 числа это чтение до чтения регистра текущего значения, остальные числа - после.
Как видно из второго примера, после чтения регистра текущего значения так и остался установлен бит 7, т.к. во всей строке чисел прописано 132. Так же по итоговым значениям таймера видно, что идет 0 (занчит регистр действительно был заблокирован), а потом уже 1493, что означает, что таймер все же работал правильно.
В третьем примере самый редкий случай. Хотя регистр текущего значения и разблокировался, но в итоге все равно получилось 0, 1523, что означает, что счет начался не с числа 0xFFF, а с числа на 20 больше, которое было до этого в таймере, и осталось, возможно, после работы драйвера дисковода. Так же видно, что при переходе через 0, регистр текущего значения заблокировался.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)