Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 20:45

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - вариант реализации watchdog механизма
Автор Сообщение
  Заголовок сообщения:  Re: вариант реализации watchdog механизма  Ответить с цитатой
dynamic-wind писал(а):
Но там всё равно таймер выделялся внутри словаря, статически. Даже когда он не используется, он занимает место. Мелочь, а неприятно.

дык, можно и не выделять-то. Просто сложнее будет место для таймера найти, точнее, можно, к примеру, значение таймаута и обработчик выкинуть на стек возвратов, но тогда придется пользоваться таким механизмом более осторожно, только в рамках одного определения, что не проблема вобщем-то, но все же не всегда хорошо.
Сообщение Добавлено: Ср мар 02, 2011 18:32
  Заголовок сообщения:  Re: вариант реализации watchdog механизма  Ответить с цитатой
mOleg писал(а):
dynamic-wind писал(а):
DOG: создает структуру из 4-х слов в хипе, причем последнее слово ссылается на 2 слова в какой-то "юзерской области"?

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

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

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

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

Но там всё равно таймер выделялся внутри словаря, статически. Даже когда он не используется, он занимает место. Мелочь, а неприятно. :?
Я избалован SML/NJ с его быстрым динамическим аллокатором.
Сообщение Добавлено: Ср мар 02, 2011 18:06
  Заголовок сообщения:  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 писал(а):
Если таймер нужен локально (временно) внутри рекурсивно вызываемого слова, как такое сделать?

можно и такое сделать, собственно так были сделан предыдущий вариант
Сообщение Добавлено: Ср мар 02, 2011 17:24
  Заголовок сообщения:  Re: вариант реализации watchdog механизма  Ответить с цитатой
А я что-то не понимаю, DOG: создает структуру из 4-х слов в хипе, причем последнее слово ссылается на 2 слова в какой-то "юзерской области"?
Если таймер нужен локально (временно) внутри рекурсивно вызываемого слова, как такое сделать?
Сообщение Добавлено: Ср мар 02, 2011 10:35
  Заголовок сообщения:  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, передающее управление за
пределы рабочего цикла, либо действие по изменению таймаута
Сообщение Добавлено: Вт мар 01, 2011 20:26
  Заголовок сообщения:  Re: вариант реализации watchdog механизма  Ответить с цитатой
mOleg писал(а):
да, логично, однако в таком случае флажек должен располагаться в пользовательской памяти, т.е. быть USER

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

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

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

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

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

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

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

да, логично, однако в таком случае флажек должен располагаться в пользовательской памяти, т.е. быть USER переменной, а я не представляю, как определить этот адрес из callback штатными средствами, иначе получается та же проблема: код не универсален, применение ограничено. Ладно, что нибудь придумаю (тут важно отложить проблему на время, чтобы потом посмотреть на нее свежим взглядом. То, что есть пока устраивает.)
Сообщение Добавлено: Вс ноя 14, 2010 19:50
  Заголовок сообщения:  Re: вариант реализации watchdog механизма  Ответить с цитатой
mOleg писал(а):
Пока что сделано так, что можно выйти из определенного цикла в случае превышения времени ожидания, и продолжить выполнение кода (это важный момент, т.к. я не представляю как можно реализовать этот механизм в случае с callback-ом).

Ну как это во всём мире делают? Обработчик сигнала (SIGALRM) от системного таймера выставляет флажок в структуре программного таймера. Если есть еще программные таймеры, обработчик сигнала переустанавливает системный таймер (setitimer) для следующего срабатывания. А в цикле стоит просто проверка, взведен ли флажок в данном программном таймере.
Не знаю, чем виндовый callback отличается...
Сообщение Добавлено: Вс ноя 14, 2010 15:57
  Заголовок сообщения:  Re: вариант реализации watchdog механизма  Ответить с цитатой
mOleg писал(а):
мне не нужно прерывать процесс! мне нужен выход из цикла, который задумался дольше, чем нужно, либо возможность продолжить выполнение цикла после корректировки данных. При этом сама проверка на таймаут не должна отнимать много времени!


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


Я не вижу существенных причин, по которым ожидание готовности должно занимать строго определенное время в абсолютных единицах. При том, что все прочие характеристики производительности на PC не регламентированы. Если уж так надо, по тому же интерфейсу, что и датчик, можно подключить часы реального времени. Если есть жесткое требование по таймауту, и при этом штатные средства PC не способны обеспечить его измерение... то даже Форт не поможет сделать все только программно :)
Сообщение Добавлено: Вс ноя 14, 2010 12:52
  Заголовок сообщения:  Re: вариант реализации watchdog механизма  Ответить с цитатой
_Harry писал(а):
И самое главное Windows не RTOS
Так что часто лучше попытаться обеспечить синхронизацию внешнего устройства от компьютера

именно поэтому мне и оказалась нужна эта вещь, т.к. система может в ненужный момент вемени отдать процессорное время другому потоку.
Сообщение Добавлено: Вс ноя 14, 2010 09:50
  Заголовок сообщения:  Re: вариант реализации watchdog механизма  Ответить с цитатой
_Harry писал(а):
Ну я сравнивал с обычным таймером, а не со счетчиком RDTS.

собственно, я ведь не знаю пока как лучше сделать. Пока что сделано так, что можно выйти из определенного цикла в случае превышения времени ожидания, и продолжить выполнение кода (это важный момент, т.к. я не представляю как можно реализовать этот механизм в случае с callback-ом).
мне не нужно прерывать процесс! мне нужен выход из цикла, который задумался дольше, чем нужно, либо возможность продолжить выполнение цикла после корректировки данных. При этом сама проверка на таймаут не должна отнимать много времени!
Сообщение Добавлено: Вс ноя 14, 2010 09:30
  Заголовок сообщения:  Re: вариант реализации watchdog механизма  Ответить с цитатой
mOleg писал(а):
пошустрей точно не будет!
Ну я сравнивал с обычным таймером, а не со счетчиком RDTS. Очевидно что твой вариант самый скоростной.
Только мне непонятно зачем это WatchDog-у видимо ты навесил на него какие то дополнительные функции?
И еще что будет если процесс зависнет. Кто считать и проверять будет?
Колбэк тут как то получше смотрится. И самое главное Windows не RTOS
Так что часто лучше попытаться обеспечить синхронизацию внешнего устройства от компьютера.
Сообщение Добавлено: Сб ноя 13, 2010 23:34
  Заголовок сообщения:  Re: вариант реализации watchdog механизма  Ответить с цитатой
_Harry писал(а):
Для ЧасовойСобаки не нужна ни скорость ни точность.

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

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

напомнить, сколько всего делается при воходе в колбэк? ;)
пошустрей точно не будет!
Сообщение Добавлено: Сб ноя 13, 2010 19:43
  Заголовок сообщения:  Re: вариант реализации watchdog механизма  Ответить с цитатой
mOleg писал(а):
SetTimer явно не катит, т.к. сообщения о таймаутах передаются через очередь сообщений в messageloop.

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

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


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