Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт мар 19, 2024 15:48

...
Google Search
Forth-FAQ Spy Grafic

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




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

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

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

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

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

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

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

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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: вариант реализации watchdog механизма
СообщениеДобавлено: Вс ноя 14, 2010 23:30 
Цитата:
dynamic-wind писал(а):
А в цикле стоит просто проверка, взведен ли флажок в данном программном таймере.
да, логично, однако в таком случае флажек должен располагаться в пользовательской памяти, т.е. быть USER переменной
почему он должен быть юсер-переменной?


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

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

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вобщем, вот последний вариант обсуждаемого
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, передающее управление за
пределы рабочего цикла, либо действие по изменению таймаута

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


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

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
А я что-то не понимаю, DOG: создает структуру из 4-х слов в хипе, причем последнее слово ссылается на 2 слова в какой-то "юзерской области"?
Если таймер нужен локально (временно) внутри рекурсивно вызываемого слова, как такое сделать?


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
dynamic-wind писал(а):
DOG: создает структуру из 4-х слов в хипе, причем последнее слово ссылается на 2 слова в какой-то "юзерской области"?

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
dynamic-wind писал(а):
Но там всё равно таймер выделялся внутри словаря, статически. Даже когда он не используется, он занимает место. Мелочь, а неприятно.

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

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


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

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


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

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


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

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