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

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

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

размышления на тему: "что же делать, если процесс завис" привели к реализации следующего варианта "стерегущего пса"

source file: wdog.fts
\ 10.11.2010 ~mOleg
\ Copyright [C] 2009 mOleg mOlegg@ya.ru
\ вариант реализации watchdog механизма

memory/ box.fts
hard/ timer.fts

\ инициализация обработчика watchdog механизма
: (wd_init) ( n addr --> )
TIMER 1ms_time OR IFNOT calibrate THEN
DUP >L ! TIMER initial ;

\ задать обработчик
: DOG ( / name --> ) BOX{ CELL ALLOT ' COMPILE, }BOX COMPILE (wd_init) ; IMMEDIATE

\ проверить, превышен ли временной предел, если превышен, вызвать обработчик
: WATCH ( --> ) L@ @ TIMER interval < IF RDROP L> CELL + >R THEN ;

\ завершить секцию
: ;WATCH ( --> ) LDROP ;


\ пробуем, что получилось

: handler RDROP ." xxxxxxxxxxx"
;

: t1 10000 DOG handler
BEGIN L@ @ . Cr_ EMIT WATCH AGAIN ;

: t2 t1 ." zzzzzzzz" ;


в либе используется timer.fts. Не могу сказать, что идея очень удачна, возможно лучше создать специальный набор циклов, в которых будет предусмотрен выход по таймауту, а так же автоматическое удаление счетчика, либо использование только уникального таймера. Так же, пока, не совсем ясно, как лучше реализовать обработчик, срабатывающий в случае таймаута.
Ну и позаботиться о сбросе времени и возможности работы множества "смотрящих собак", а так же возможной их вложенности.
Может у кого есть на примете идеи удачнее?

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

mOleg писал(а):
Может у кого есть на примете идеи удачнее?

Ctrl-Alt-Del -> диспетчер задач -> завершить процесс

Автор:  dynamic-wind [ Чт ноя 11, 2010 01:57 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

mOleg писал(а):
Может у кого есть на примете идеи удачнее?

Начнем с принципа: выход из процедуры по таймауту должен быть корректным, с уборкой всего мусора на стеке. Отсюда--таймер должен бросать исключение.
Интерфейс "по науке" примерно такой:
Код:
: with-timeout-hdl ( HDL TIMER CODE -- )
\ выполняет CODE, предварительно зарегистрировав TIMER.
\ если TIMER обнулился во время выполнения CODE,
\ размотать стек и выполнить HDL
.....
: with-timeout-exn ( EXN TIMER CODE -- )
\ выполняет CODE, предварительно зарегистрировав TIMER.
\ если TIMER обнулился во время выполнения CODE,
\ бросить исключение EXN

TIMER--это некий чёрный ящик (время срабатывания + поле для связывания в список).
Каждый вызов with-timeout- удаляет только свой таймер, причем как при нормальном, так и при аварийном выходе.
Как сигнал от железного таймера обрабатывать, как проверять программные таймеры на списке, как бросать исключения и как ловить--это Вам решать, я SPF не знаю :shuffle;

Автор:  mOleg [ Чт ноя 11, 2010 17:15 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

dynamic-wind писал(а):
Начнем с принципа: выход из процедуры по таймауту должен быть корректным, с уборкой всего мусора на стеке. Отсюда--таймер должен бросать исключение.

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

dynamic-wind писал(а):
Каждый вызов with-timeout- удаляет только свой таймер, причем как при нормальном, так и при аварийном выходе.

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

Автор:  dynamic-wind [ Чт ноя 11, 2010 21:51 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

mOleg писал(а):
dynamic-wind писал(а):
Каждый вызов with-timeout- удаляет только свой таймер, причем как при нормальном, так и при аварийном выходе.

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

Зря, Олег, в форке всё должно быть красиво :)
Почему бы не использовать динамическую память и не организовать LIFO список таймеров?

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

Помоему лучше запросить у Windows
мультимедийный или обычный таймер( для Wathcdog-а и его достаточно будет)
и в его колбэке проверять чего там с процессом происходит, а то как бы Watchdog вместе с процессом не завис :roll: .

Автор:  mOleg [ Сб ноя 13, 2010 06:56 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

_Harry писал(а):
Помоему лучше запросить у Windows мультимедийный или обычный таймер

я думаю, стоит и такой механизм сделать, собственно сейчас вопросы больше не по тому, к чему привязываться, а к тому, как реализовать механизм просто + удобно + надежно + быстро. С вызовом АПИ не хочется связываться по причине медлительности процесса, то есть хочется иметь возможность ловить короткие таймауты.
виндошный SetTimer явно не катит, т.к. сообщения о таймаутах передаются через очередь сообщений в messageloop. Других вариантов я с наскоку не нашел - было нужно "прямо сейчас", RDTC оказался вполне подходящим решением.

dynamic-wind писал(а):
Зря, Олег, в форке всё должно быть красиво

а я и стараюсь делать красиво 8) Но еще и просто и удобно по возможности.

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

mOleg писал(а):
С вызовом АПИ не хочется связываться по причине медлительности процесса,

Не мухи отдельно котлеты отдельно. Для ЧасовойСобаки не нужна ни скорость ни точность.
Там и SetTimer потянет.
Для многих случаев пойдет мультимедийный таймер СreateWaitableTimer (вроде так вызывается). Он дает лучше точность
порядка милисекунды. Но так как видовс все же не реалтайм думаю ни на что особо надеятся нельзя.

Автор:  _Harry [ Сб ноя 13, 2010 16:15 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

mOleg писал(а):
SetTimer явно не катит, т.к. сообщения о таймаутах передаются через очередь сообщений в messageloop.

Да еще мультимедийный таймер может запускать свой колбэк, это пошустрей будет и не будет зависеть от зависания процесса.

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

_Harry писал(а):
Для ЧасовойСобаки не нужна ни скорость ни точность.

особенная точность не нужна, а вот время "обдумывания" мне достаточно критично. То есть, мне важно, чтобы цикл, в котором используется watchdog работал быстро (поэтому и не хочу возни с АПИ, а с колбэками уж и подавно!).
Поэтому RDTC и подходит лучше всего, он очень быстро получается, дает премлемое разрешение по времени, и достаточно прост.

_Harry писал(а):
мультимедийный таймер может запускать свой колбэк, это пошустрей будет

напомнить, сколько всего делается при воходе в колбэк? ;)
пошустрей точно не будет!

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

mOleg писал(а):
пошустрей точно не будет!
Ну я сравнивал с обычным таймером, а не со счетчиком RDTS. Очевидно что твой вариант самый скоростной.
Только мне непонятно зачем это WatchDog-у видимо ты навесил на него какие то дополнительные функции?
И еще что будет если процесс зависнет. Кто считать и проверять будет?
Колбэк тут как то получше смотрится. И самое главное Windows не RTOS
Так что часто лучше попытаться обеспечить синхронизацию внешнего устройства от компьютера.

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

_Harry писал(а):
Ну я сравнивал с обычным таймером, а не со счетчиком RDTS.

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

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

_Harry писал(а):
И самое главное Windows не RTOS
Так что часто лучше попытаться обеспечить синхронизацию внешнего устройства от компьютера

именно поэтому мне и оказалась нужна эта вещь, т.к. система может в ненужный момент вемени отдать процессорное время другому потоку.

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

mOleg писал(а):
мне не нужно прерывать процесс! мне нужен выход из цикла, который задумался дольше, чем нужно, либо возможность продолжить выполнение цикла после корректировки данных. При этом сама проверка на таймаут не должна отнимать много времени!


Код:
10000 CONSTANT TIMEOUT
0 CYCLES !
BEGIN
  1 CYCLES +!
  ?READY CYCLES @ TIMEOUT = OR
UNTIL


Я не вижу существенных причин, по которым ожидание готовности должно занимать строго определенное время в абсолютных единицах. При том, что все прочие характеристики производительности на PC не регламентированы. Если уж так надо, по тому же интерфейсу, что и датчик, можно подключить часы реального времени. Если есть жесткое требование по таймауту, и при этом штатные средства PC не способны обеспечить его измерение... то даже Форт не поможет сделать все только программно :)

Автор:  dynamic-wind [ Вс ноя 14, 2010 15:57 ]
Заголовок сообщения:  Re: вариант реализации watchdog механизма

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

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

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