Forth
http://www.fforum.winglion.ru/

вариант реализации watchdog механизма
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2681
Страница 2 из 2

Автор:  mOleg [ Вс ноя 14, 2010 19:50 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

Хищник писал(а):
Я не вижу существенных причин, по которым ожидание готовности должно занимать строго определенное время в абсолютных единицах.

Ну, тут просто, тактовая разной может быть, а мне надо с внешними событиями работать (именно по ним таймаут важен), которые не привязаны к тактам процессора. Зато временные параметры вполне определены.

Хищник писал(а):
Если уж так надо, по тому же интерфейсу, что и датчик, можно подключить часы реального времени.

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

Хищник писал(а):
Если есть жесткое требование по таймауту, и при этом штатные средства PC не способны обеспечить его измерение...

способны, код рабочий приведен. Он только одноразовый, т.е. его можно использовать только в одном месте (не может быть вложений, хотя последовательные отслеживания возможны).

dynamic-wind писал(а):
Ну как это во всём мире делают? Обработчик сигнала (SIGALRM) от системного таймера выставляет флажок в структуре программного таймера. Если есть еще программные таймеры, обработчик сигнала переустанавливает системный таймер (setitimer) для следующего срабатывания. А в цикле стоит просто проверка, взведен ли флажок в данном программном таймере.

да, логично, однако в таком случае флажек должен располагаться в пользовательской памяти, т.е. быть USER переменной, а я не представляю, как определить этот адрес из callback штатными средствами, иначе получается та же проблема: код не универсален, применение ограничено. Ладно, что нибудь придумаю (тут важно отложить проблему на время, чтобы потом посмотреть на нее свежим взглядом. То, что есть пока устраивает.)

Автор:  Гость [ Вс ноя 14, 2010 23:30 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

Цитата:
dynamic-wind писал(а):
А в цикле стоит просто проверка, взведен ли флажок в данном программном таймере.
да, логично, однако в таком случае флажек должен располагаться в пользовательской памяти, т.е. быть USER переменной
почему он должен быть юсер-переменной?

Автор:  _Harry [ Вс ноя 14, 2010 23:31 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

mOleg писал(а):
да, логично, однако в таком случае флажек должен располагаться в пользовательской памяти, т.е. быть USER

От строго наоборот флаг должен быть видим глобально.
Вообще то это все очень просто делается. Непонятки возникают из за того, что то что ты описываешь это в общем то не wathdog.

Автор:  mOleg [ Вт мар 01, 2011 20:26 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

вобщем, вот последний вариант обсуждаемого
source file: watchdog.fts
\ 15.02.2011 ~mOleg
\ Copyright [C] 2010 mOleg mOlegg@ya.ru
\ определение и обработка превышений заданных интервалов времени

vocs/ dllvoc.fts

\ определить адрес пользовательской переменной
\ используя адрес, где хранися смещение к ней
\ : UADR ( addr --> uaddr ) @ TlsIndex@ + ;
: UADR ( addr --> uaddr ) ?COMP 0x8B B, 0x10 B, 0x8D B, 0x04 B, 0x17 B, ; IMMEDIATE

ALSO HIDDEN DEFINITIONS
ALSO IMPORT KERNEL32.DLL

\ ------------------------------------------------------------------------------
\ от следующих 4-х определений зависит, каким образом будет определяться
\ выход за пределы отведенного интервала времени

CELL CONSTANT /timeout

\ определить, превышен ли заданный интервал времени
: ?timeout ( uaddr --> flag ) @ GetTickCount U< IF TRUE ;THEN FALSE ;

\ установить интервал времени
: !timeout ( to uaddr --> ) >L GetTickCount + L> ! ;

\ изменить интервал времени ( может совпадать с !timeout)
\ : +timeout ( t+ uaddr --> ) >L GetTickCount + L> ! ;
ALIAS !timeout +timeout

\ ------------------------------------------------------------------------------

\ инициализация "сторожа":
\ i - интервал, который нельзя превышать,
\ xt - адрес обработчика превышения интервала
: (?interval) ( i xt --> )
AR> [ 2 TOKEN * LIT, ] + UADR \ --> to xt ua
TUCK /timeout + A! \ -->
!timeout ;

\ изменение интервала "сторожа"
: (!interval) ( i --> ) AR> TOKEN + UADR +timeout ;

\ проверка срабатывания "сторожа"
: (@handler) ( --> )
AR> UADR DUP ?timeout
IF /timeout + PERFORM ;THEN
DROP ;

PREVIOUS RECENT ALSO HIDDEN

\ создать "сторожа"
: DOG: ( / Name --> )
HEADER
COMPILE (?interval) \ --> flag
COMPILE (!interval) \ --> смена интервала
COMPILE (@handler) \ --> адрес обработчика
[ ADDR /timeout + LIT, ] \ таймаут + обработчик
USER-PLACE , \ ссылка на начало
;CREATE ;

\ проверка превышения таймаута
ALIAS FROM WATCH ( / dog --> ) IMMEDIATE

PREVIOUS

?ABSENT test{ \EOF -- тестовая секция ------------------------------------------
test{
DOG: test

:> обработчик ( --> ) 1111111 THROW ;

: ?tmo ( --> x ) <: WATCH test ;> CATCH ;

1 обработчик test

?tmo 0 <> THROW \ сразу не должен срабатывать
1000 PAUSE
?tmo 1111111 <> THROW \ а теперь должен сработать
}test

\EOF
синтаксис:

DOG: ИмяСторожа \ создание "сторожа"
...
интервал ['] обработчик ИмяСторожа \ инициализация "сторожа"
...
интервал TO ИмяСторожа \ изменение интервала таймаута
...
WATCH ИмяСторожа \ проверка срабатывания "сторожа"

в обработчике может находиться кака THROW, передающее управление за
пределы рабочего цикла, либо действие по изменению таймаута

Автор:  dynamic-wind [ Ср мар 02, 2011 10:35 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

А я что-то не понимаю, DOG: создает структуру из 4-х слов в хипе, причем последнее слово ссылается на 2 слова в какой-то "юзерской области"?
Если таймер нужен локально (временно) внутри рекурсивно вызываемого слова, как такое сделать?

Автор:  mOleg [ Ср мар 02, 2011 17:24 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

dynamic-wind писал(а):
DOG: создает структуру из 4-х слов в хипе, причем последнее слово ссылается на 2 слова в какой-то "юзерской области"?

в хипе ничего не создается. Создается определение с тремя полями кода, по устройству похожее на USER-VALUE переменную). Слово DOG: создает имя, которое при прямом вызове запоминает необходимое значение интервала и адрес обработчика этого самого превышения; при использовании совместно с TO позволяет изменить интервал (ну например в начале цикла чего-нибудь, за чем надо следить можно устанавливать интервал превышения), а совместно со словом WATCH проверяет нужно ли вызвать обработчик (ранее заданный).
Вобщем примерно так:
DOG: опоздание

: реакция ERROR" заданный интервал превышен" ;

: цикл
100 ['] реакция опоздание
BEGIN тут что-то делаем,
если не успеваем, то пишем:
100 TO опоздание \ тут таймаут "отодвинут"
тут еще что-то делаем
WATCH опоздание \ тут проверка выхода за временной лимит
AGAIN ;


dynamic-wind писал(а):
причем последнее слово ссылается на 2 слова в какой-то "юзерской области"?

пользовательская область - это личная память данных потока. В среде виндовс многозадачность форта в чем-то похожа на времена ДОСа, когда есть общее хранилище кода и данных, доступное из всех потоков, соответственно в нем все переменные глобальны, и изменение одной из них отразится на других потоках. Кроме того у каждого потока есть интимная, так сказать, область памяти, где любые изменения видны только одному конкретному потоку.
Так вот, один и тот же таймер может иметь собственные настройки в каждом потоке, а два слова (точнее две ячейки памяти) - это адрес обработчика и временной лимит.

dynamic-wind писал(а):
Если таймер нужен локально (временно) внутри рекурсивно вызываемого слова, как такое сделать?

можно и такое сделать, собственно так были сделан предыдущий вариант

Автор:  dynamic-wind [ Ср мар 02, 2011 18:06 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

mOleg писал(а):
dynamic-wind писал(а):
DOG: создает структуру из 4-х слов в хипе, причем последнее слово ссылается на 2 слова в какой-то "юзерской области"?

в хипе ничего не создается. Создается определение с тремя полями кода, по устройству похожее на USER-VALUE переменную).

Да, я так и понял. По привычке называю словарную область хипом.

mOleg писал(а):
dynamic-wind писал(а):
Если таймер нужен локально (временно) внутри рекурсивно вызываемого слова, как такое сделать?

можно и такое сделать, собственно так были сделан предыдущий вариант

Но там всё равно таймер выделялся внутри словаря, статически. Даже когда он не используется, он занимает место. Мелочь, а неприятно. :?
Я избалован SML/NJ с его быстрым динамическим аллокатором.

Автор:  mOleg [ Ср мар 02, 2011 18:32 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

dynamic-wind писал(а):
Но там всё равно таймер выделялся внутри словаря, статически. Даже когда он не используется, он занимает место. Мелочь, а неприятно.

дык, можно и не выделять-то. Просто сложнее будет место для таймера найти, точнее, можно, к примеру, значение таймаута и обработчик выкинуть на стек возвратов, но тогда придется пользоваться таким механизмом более осторожно, только в рамках одного определения, что не проблема вобщем-то, но все же не всегда хорошо.

Страница 2 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/