Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Ср окт 23, 2019 08:39

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: вариант реализации watchdog механизма
СообщениеДобавлено: Ср ноя 10, 2010 17:52 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
размышления на тему: "что же делать, если процесс завис" привели к реализации следующего варианта "стерегущего пса"

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. Не могу сказать, что идея очень удачна, возможно лучше создать специальный набор циклов, в которых будет предусмотрен выход по таймауту, а так же автоматическое удаление счетчика, либо использование только уникального таймера. Так же, пока, не совсем ясно, как лучше реализовать обработчик, срабатывающий в случае таймаута.
Ну и позаботиться о сбросе времени и возможности работы множества "смотрящих собак", а так же возможной их вложенности.
Может у кого есть на примете идеи удачнее?

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Ср ноя 10, 2010 18:02 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6808
Благодарил (а): 16 раз.
Поблагодарили: 110 раз.
mOleg писал(а):
Может у кого есть на примете идеи удачнее?

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Чт ноя 11, 2010 01:57 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
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;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Чт ноя 11, 2010 17:15 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
dynamic-wind писал(а):
Начнем с принципа: выход из процедуры по таймауту должен быть корректным, с уборкой всего мусора на стеке. Отсюда--таймер должен бросать исключение.

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

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

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Чт ноя 11, 2010 21:51 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
mOleg писал(а):
dynamic-wind писал(а):
Каждый вызов with-timeout- удаляет только свой таймер, причем как при нормальном, так и при аварийном выходе.

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Чт ноя 11, 2010 23:11 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
Помоему лучше запросить у Windows
мультимедийный или обычный таймер( для Wathcdog-а и его достаточно будет)
и в его колбэке проверять чего там с процессом происходит, а то как бы Watchdog вместе с процессом не завис :roll: .


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Сб ноя 13, 2010 06:56 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
_Harry писал(а):
Помоему лучше запросить у Windows мультимедийный или обычный таймер

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

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

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Сб ноя 13, 2010 14:02 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
mOleg писал(а):
С вызовом АПИ не хочется связываться по причине медлительности процесса,

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Сб ноя 13, 2010 16:15 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 412
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 4 раз.
mOleg писал(а):
SetTimer явно не катит, т.к. сообщения о таймаутах передаются через очередь сообщений в messageloop.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Сб ноя 13, 2010 19:43 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
_Harry писал(а):
Для ЧасовойСобаки не нужна ни скорость ни точность.

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

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

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Сб ноя 13, 2010 23:34 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Вс ноя 14, 2010 09:30 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
_Harry писал(а):
Ну я сравнивал с обычным таймером, а не со счетчиком RDTS.

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Вс ноя 14, 2010 09:50 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
_Harry писал(а):
И самое главное Windows не RTOS
Так что часто лучше попытаться обеспечить синхронизацию внешнего устройства от компьютера

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Вс ноя 14, 2010 12:52 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6808
Благодарил (а): 16 раз.
Поблагодарили: 110 раз.
mOleg писал(а):
мне не нужно прерывать процесс! мне нужен выход из цикла, который задумался дольше, чем нужно, либо возможность продолжить выполнение цикла после корректировки данных. При этом сама проверка на таймаут не должна отнимать много времени!


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


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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Вс ноя 14, 2010 15:57 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
mOleg писал(а):
Пока что сделано так, что можно выйти из определенного цикла в случае превышения времени ожидания, и продолжить выполнение кода (это важный момент, т.к. я не представляю как можно реализовать этот механизм в случае с callback-ом).

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB