Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: вариант реализации watchdog механизма |
|
|
dynamic-wind писал(а): Но там всё равно таймер выделялся внутри словаря, статически. Даже когда он не используется, он занимает место. Мелочь, а неприятно. дык, можно и не выделять-то. Просто сложнее будет место для таймера найти, точнее, можно, к примеру, значение таймаута и обработчик выкинуть на стек возвратов, но тогда придется пользоваться таким механизмом более осторожно, только в рамках одного определения, что не проблема вобщем-то, но все же не всегда хорошо.
[quote="dynamic-wind"]Но там всё равно таймер выделялся внутри словаря, статически. Даже когда он не используется, он занимает место. Мелочь, а неприятно. [/quote] дык, можно и не выделять-то. Просто сложнее будет место для таймера найти, точнее, можно, к примеру, значение таймаута и обработчик выкинуть на стек возвратов, но тогда придется пользоваться таким механизмом более осторожно, только в рамках одного определения, что не проблема вобщем-то, но все же не всегда хорошо.
|
|
|
|
Добавлено: Ср мар 02, 2011 18:32 |
|
|
|
|
|
Заголовок сообщения: |
Re: вариант реализации watchdog механизма |
|
|
mOleg писал(а): dynamic-wind писал(а): DOG: создает структуру из 4-х слов в хипе, причем последнее слово ссылается на 2 слова в какой-то "юзерской области"? в хипе ничего не создается. Создается определение с тремя полями кода, по устройству похожее на USER-VALUE переменную). Да, я так и понял. По привычке называю словарную область хипом. mOleg писал(а): dynamic-wind писал(а): Если таймер нужен локально (временно) внутри рекурсивно вызываемого слова, как такое сделать? можно и такое сделать, собственно так были сделан предыдущий вариантНо там всё равно таймер выделялся внутри словаря, статически. Даже когда он не используется, он занимает место. Мелочь, а неприятно. Я избалован SML/NJ с его быстрым динамическим аллокатором.
[quote="mOleg"][quote="dynamic-wind"]DOG: создает структуру из 4-х слов в хипе, причем последнее слово ссылается на 2 слова в какой-то "юзерской области"?[/quote] в хипе ничего не создается. Создается определение с тремя полями кода, по устройству похожее на USER-VALUE переменную).[/quote] Да, я так и понял. По привычке называю словарную область хипом.
[quote="mOleg"][quote="dynamic-wind"]Если таймер нужен локально (временно) внутри рекурсивно вызываемого слова, как такое сделать?[/quote] можно и такое сделать, собственно так были сделан [url=http://www.fforum.winglion.ru/viewtopic.php?p=29152#p29152]предыдущий вариант[/url][/quote] Но там всё равно таймер выделялся внутри словаря, статически. Даже когда он не используется, он занимает место. Мелочь, а неприятно. :? Я избалован 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 писал(а): Если таймер нужен локально (временно) внутри рекурсивно вызываемого слова, как такое сделать? можно и такое сделать, собственно так были сделан предыдущий вариант
[quote="dynamic-wind"]DOG: создает структуру из 4-х слов в хипе, причем последнее слово ссылается на 2 слова в какой-то "юзерской области"?[/quote] в хипе ничего не создается. Создается определение с тремя полями кода, по устройству похожее на USER-VALUE переменную). Слово DOG: создает имя, которое при прямом вызове запоминает необходимое значение интервала и адрес обработчика этого самого превышения; при использовании совместно с TO позволяет изменить интервал (ну например в начале цикла чего-нибудь, за чем надо следить можно устанавливать интервал превышения), а совместно со словом WATCH проверяет нужно ли вызвать обработчик (ранее заданный). Вобщем примерно так: [pre]DOG: опоздание
: реакция ERROR" заданный интервал превышен" ;
: цикл 100 ['] реакция опоздание BEGIN тут что-то делаем, если не успеваем, то пишем: 100 TO опоздание \ тут таймаут "отодвинут" тут еще что-то делаем WATCH опоздание \ тут проверка выхода за временной лимит AGAIN ;[/pre]
[quote="dynamic-wind"]причем последнее слово ссылается на 2 слова в какой-то "юзерской области"?[/quote] пользовательская область - это личная память данных потока. В среде виндовс многозадачность форта в чем-то похожа на времена ДОСа, когда есть общее хранилище кода и данных, доступное из всех потоков, соответственно в нем все переменные глобальны, и изменение одной из них отразится на других потоках. Кроме того у каждого потока есть интимная, так сказать, область памяти, где любые изменения видны только одному конкретному потоку. Так вот, один и тот же таймер может иметь собственные настройки в каждом потоке, а два слова (точнее две ячейки памяти) - это адрес обработчика и временной лимит.
[quote="dynamic-wind"]Если таймер нужен локально (временно) внутри рекурсивно вызываемого слова, как такое сделать?[/quote] можно и такое сделать, собственно так были сделан [url=http://www.fforum.winglion.ru/viewtopic.php?p=29152#p29152]предыдущий вариант[/url]
|
|
|
|
Добавлено: Ср мар 02, 2011 17:24 |
|
|
|
|
|
Заголовок сообщения: |
Re: вариант реализации watchdog механизма |
|
|
А я что-то не понимаю, DOG: создает структуру из 4-х слов в хипе, причем последнее слово ссылается на 2 слова в какой-то "юзерской области"? Если таймер нужен локально (временно) внутри рекурсивно вызываемого слова, как такое сделать?
А я что-то не понимаю, 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, передающее управление за пределы рабочего цикла, либо действие по изменению таймаута
вобщем, вот последний вариант обсуждаемого [pre]source file: watchdog.fts [b][color=#C0C0C0]\ 15.02.2011 ~mOleg[/color] [color=#C0C0C0]\ Copyright [C] 2010 mOleg mOlegg@ya.ru[/color] [color=#C0C0C0]\ определение и обработка превышений заданных интервалов времени[/color]
[color=#00F000]vocs/ dllvoc.fts[/color]
[color=#C0C0C0]\ определить адрес пользовательской переменной[/color] [color=#C0C0C0]\ используя адрес, где хранися смещение к ней[/color] [color=#C0C0C0]\ : UADR ( addr --> uaddr ) @ TlsIndex@ + ;[/color] [color=#FF8000]: UADR[/color] [color=#0080C0]( addr --> uaddr )[/color] ?COMP [color=#00F000]0x8B[/color] B, [color=#00F000]0x10[/color] B, [color=#00F000]0x8D[/color] B, [color=#00F000]0x04[/color] B, [color=#00F000]0x17[/color] B, [color=#FF8000];[/color] [color=#C00000]IMMEDIATE[/color]
[color=#FF00FF]ALSO[/color] [color=#FF00FF]HIDDEN[/color] [color=#FF00FF]DEFINITIONS[/color] [color=#FF00FF]ALSO[/color] IMPORT KERNEL32.DLL
[color=#C0C0C0]\ ------------------------------------------------------------------------------[/color] [color=#C0C0C0]\ от следующих 4-х определений зависит, каким образом будет определяться[/color] [color=#C0C0C0]\ выход за пределы отведенного интервала времени[/color]
CELL [color=#FF8000]CONSTANT /timeout[/color]
[color=#C0C0C0]\ определить, превышен ли заданный интервал времени[/color] [color=#FF8000]: ?timeout[/color] [color=#0080C0]( uaddr --> flag )[/color] @ GetTickCount U< [color=#00A0A0]IF[/color] TRUE [color=#FF8000];THEN[/color] FALSE [color=#FF8000];[/color]
[color=#C0C0C0]\ установить интервал времени[/color] [color=#FF8000]: !timeout[/color] [color=#0080C0]( to uaddr --> )[/color] >L GetTickCount + L> ! [color=#FF8000];[/color]
[color=#C0C0C0]\ изменить интервал времени ( может совпадать с !timeout)[/color] [color=#C0C0C0]\ : +timeout ( t+ uaddr --> ) >L GetTickCount + L> ! ;[/color] [color=#FF8000]ALIAS !timeout +timeout[/color]
[color=#C0C0C0]\ ------------------------------------------------------------------------------[/color]
[color=#C0C0C0]\ инициализация "сторожа":[/color] [color=#C0C0C0]\ i - интервал, который нельзя превышать,[/color] [color=#C0C0C0]\ xt - адрес обработчика превышения интервала[/color] [color=#FF8000]: (?interval)[/color] [color=#0080C0]( i xt --> )[/color] AR> [color=#C00000][[/color] [color=#00F000]2[/color] TOKEN * LIT, [color=#C00000]][/color] + UADR [color=#C0C0C0]\ --> to xt ua[/color] TUCK /timeout + A! [color=#C0C0C0]\ -->[/color] !timeout [color=#FF8000];[/color]
[color=#C0C0C0]\ изменение интервала "сторожа"[/color] [color=#FF8000]: (!interval)[/color] [color=#0080C0]( i --> )[/color] AR> TOKEN + UADR +timeout [color=#FF8000];[/color]
[color=#C0C0C0]\ проверка срабатывания "сторожа"[/color] [color=#FF8000]: (@handler)[/color] [color=#0080C0]( --> )[/color] AR> UADR DUP ?timeout [color=#00A0A0]IF[/color] /timeout + PERFORM [color=#FF8000];THEN[/color] DROP [color=#FF8000];[/color]
[color=#FF00FF]PREVIOUS[/color] [color=#FF00FF]RECENT[/color] [color=#FF00FF]ALSO[/color] [color=#FF00FF]HIDDEN[/color]
[color=#C0C0C0]\ создать "сторожа"[/color] [color=#FF8000]: DOG:[/color] [color=#0080C0]( / Name --> )[/color] HEADER [color=#00F000]COMPILE (?interval)[/color] [color=#C0C0C0]\ --> flag[/color] [color=#00F000]COMPILE (!interval)[/color] [color=#C0C0C0]\ --> смена интервала[/color] [color=#00F000]COMPILE (@handler)[/color] [color=#C0C0C0]\ --> адрес обработчика[/color] [color=#C00000][[/color] ADDR /timeout + LIT, [color=#C00000]][/color] [color=#C0C0C0]\ таймаут + обработчик[/color] USER-PLACE , [color=#C0C0C0]\ ссылка на начало[/color] [color=#FF8000];CREATE[/color] [color=#FF8000];[/color]
[color=#C0C0C0]\ проверка превышения таймаута[/color] [color=#FF8000]ALIAS FROM WATCH[/color] [color=#0080C0]( / dog --> )[/color] [color=#C00000]IMMEDIATE[/color]
[color=#FF00FF]PREVIOUS[/color]
[color=#C00000]?ABSENT test{ \EOF -- тестовая секция ------------------------------------------[/color] test{ [color=#FF8000]DOG: test[/color]
:> обработчик [color=#0080C0]( --> )[/color] [color=#00F000]1111111[/color] [color=#C00000]THROW[/color] [color=#FF8000];[/color]
[color=#FF8000]: ?tmo[/color] [color=#0080C0]( --> x )[/color] [color=#FF8000]<: WATCH[/color] test [color=#FF8000];>[/color] CATCH [color=#FF8000];[/color]
[color=#00F000]1[/color] обработчик test
?tmo [color=#00F000]0[/color] <> [color=#C00000]THROW[/color] [color=#C0C0C0]\ сразу не должен срабатывать[/color] [color=#00F000]1000[/color] PAUSE ?tmo [color=#00F000]1111111[/color] <> [color=#C00000]THROW[/color] [color=#C0C0C0]\ а теперь должен сработать[/color] }test
[color=#C0C0C0]\EOF синтаксис:
DOG: ИмяСторожа \ создание "сторожа" ... интервал ['] обработчик ИмяСторожа \ инициализация "сторожа" ... интервал TO ИмяСторожа \ изменение интервала таймаута ... WATCH ИмяСторожа \ проверка срабатывания "сторожа"
в обработчике может находиться кака THROW, передающее управление за пределы рабочего цикла, либо действие по изменению таймаута [/color][/b][/pre]
|
|
|
|
Добавлено: Вт мар 01, 2011 20:26 |
|
|
|
|
|
Заголовок сообщения: |
Re: вариант реализации watchdog механизма |
|
|
mOleg писал(а): да, логично, однако в таком случае флажек должен располагаться в пользовательской памяти, т.е. быть USER От строго наоборот флаг должен быть видим глобально. Вообще то это все очень просто делается. Непонятки возникают из за того, что то что ты описываешь это в общем то не wathdog.
[quote="mOleg"]да, логично, однако в таком случае флажек должен располагаться в пользовательской памяти, т.е. быть USER[/quote] От строго наоборот флаг должен быть видим глобально. Вообще то это все очень просто делается. Непонятки возникают из за того, что то что ты описываешь это в общем то не wathdog.
|
|
|
|
Добавлено: Вс ноя 14, 2010 23:31 |
|
|
|
|
|
Заголовок сообщения: |
Re: вариант реализации watchdog механизма |
|
|
Цитата: dynamic-wind писал(а): А в цикле стоит просто проверка, взведен ли флажок в данном программном таймере. да, логично, однако в таком случае флажек должен располагаться в пользовательской памяти, т.е. быть USER переменной почему он должен быть юсер-переменной?
[quote][quote="dynamic-wind"]А в цикле стоит просто проверка, взведен ли флажок в данном программном таймере.[/quote] да, логично, однако в таком случае флажек должен располагаться в пользовательской памяти, т.е. быть USER переменной[/quote] почему он должен быть юсер-переменной?
|
|
|
|
Добавлено: Вс ноя 14, 2010 23:30 |
|
|
|
|
|
Заголовок сообщения: |
Re: вариант реализации watchdog механизма |
|
|
Хищник писал(а): Я не вижу существенных причин, по которым ожидание готовности должно занимать строго определенное время в абсолютных единицах. Ну, тут просто, тактовая разной может быть, а мне надо с внешними событиями работать (именно по ним таймаут важен), которые не привязаны к тактам процессора. Зато временные параметры вполне определены. Хищник писал(а): Если уж так надо, по тому же интерфейсу, что и датчик, можно подключить часы реального времени. Да, можно, а еще можно суперкомпьютер рядом пристроить или атомный стандарт. Просто приведенное решение в моем конкретном случае меня устраивает, вот обобщить бы его и для других случев (которые в моей практике встречались) - это то, чего хочется (потому что подобные задачки будут возникать и в дальнейшем). Хищник писал(а): Если есть жесткое требование по таймауту, и при этом штатные средства PC не способны обеспечить его измерение... способны, код рабочий приведен. Он только одноразовый, т.е. его можно использовать только в одном месте (не может быть вложений, хотя последовательные отслеживания возможны). dynamic-wind писал(а): Ну как это во всём мире делают? Обработчик сигнала (SIGALRM) от системного таймера выставляет флажок в структуре программного таймера. Если есть еще программные таймеры, обработчик сигнала переустанавливает системный таймер (setitimer) для следующего срабатывания. А в цикле стоит просто проверка, взведен ли флажок в данном программном таймере. да, логично, однако в таком случае флажек должен располагаться в пользовательской памяти, т.е. быть USER переменной, а я не представляю, как определить этот адрес из callback штатными средствами, иначе получается та же проблема: код не универсален, применение ограничено. Ладно, что нибудь придумаю (тут важно отложить проблему на время, чтобы потом посмотреть на нее свежим взглядом. То, что есть пока устраивает.)
[quote="Хищник"]Я не вижу существенных причин, по которым ожидание готовности должно занимать строго определенное время в абсолютных единицах.[/quote] Ну, тут просто, тактовая разной может быть, а мне надо с внешними событиями работать (именно по ним таймаут важен), которые не привязаны к тактам процессора. Зато временные параметры вполне определены.
[quote="Хищник"]Если уж так надо, по тому же интерфейсу, что и датчик, можно подключить часы реального времени. [/quote] Да, можно, а еще можно суперкомпьютер рядом пристроить 8) или атомный стандарт. Просто приведенное решение в моем конкретном случае меня устраивает, вот обобщить бы его и для других случев (которые в моей практике встречались) - это то, чего хочется (потому что подобные задачки будут возникать и в дальнейшем).
[quote="Хищник"]Если есть жесткое требование по таймауту, и при этом штатные средства PC не способны обеспечить его измерение... [/quote] способны, код рабочий приведен. Он только одноразовый, т.е. его можно использовать только в одном месте (не может быть вложений, хотя последовательные отслеживания возможны).
[quote="dynamic-wind"]Ну как это во всём мире делают? Обработчик сигнала (SIGALRM) от системного таймера выставляет флажок в структуре программного таймера. Если есть еще программные таймеры, обработчик сигнала переустанавливает системный таймер (setitimer) для следующего срабатывания. А в цикле стоит просто проверка, взведен ли флажок в данном программном таймере.[/quote] да, логично, однако в таком случае флажек должен располагаться в пользовательской памяти, т.е. быть USER переменной, а я не представляю, как определить этот адрес из callback штатными средствами, иначе получается та же проблема: код не универсален, применение ограничено. Ладно, что нибудь придумаю (тут важно отложить проблему на время, чтобы потом посмотреть на нее свежим взглядом. То, что есть пока устраивает.)
|
|
|
|
Добавлено: Вс ноя 14, 2010 19:50 |
|
|
|
|
|
Заголовок сообщения: |
Re: вариант реализации watchdog механизма |
|
|
mOleg писал(а): Пока что сделано так, что можно выйти из определенного цикла в случае превышения времени ожидания, и продолжить выполнение кода (это важный момент, т.к. я не представляю как можно реализовать этот механизм в случае с callback-ом). Ну как это во всём мире делают? Обработчик сигнала (SIGALRM) от системного таймера выставляет флажок в структуре программного таймера. Если есть еще программные таймеры, обработчик сигнала переустанавливает системный таймер (setitimer) для следующего срабатывания. А в цикле стоит просто проверка, взведен ли флажок в данном программном таймере. Не знаю, чем виндовый callback отличается...
[quote="mOleg"]Пока что сделано так, что можно выйти из определенного цикла в случае превышения времени ожидания, и продолжить выполнение кода (это важный момент, т.к. я не представляю как можно реализовать этот механизм в случае с callback-ом).[/quote] Ну как это во всём мире делают? Обработчик сигнала (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 не способны обеспечить его измерение... то даже Форт не поможет сделать все только программно
[quote="mOleg"]мне не нужно прерывать процесс! мне нужен выход из цикла, который задумался дольше, чем нужно, либо возможность продолжить выполнение цикла после корректировки данных. При этом сама проверка на таймаут не должна отнимать много времени![/quote]
[code]10000 CONSTANT TIMEOUT 0 CYCLES ! BEGIN 1 CYCLES +! ?READY CYCLES @ TIMEOUT = OR UNTIL[/code]
Я не вижу существенных причин, по которым ожидание готовности должно занимать строго определенное время в абсолютных единицах. При том, что все прочие характеристики производительности на PC не регламентированы. Если уж так надо, по тому же интерфейсу, что и датчик, можно подключить часы реального времени. Если есть жесткое требование по таймауту, и при этом штатные средства PC не способны обеспечить его измерение... то даже Форт не поможет сделать все [b]только [/b]программно :)
|
|
|
|
Добавлено: Вс ноя 14, 2010 12:52 |
|
|
|
|
|
Заголовок сообщения: |
Re: вариант реализации watchdog механизма |
|
|
_Harry писал(а): И самое главное Windows не RTOS Так что часто лучше попытаться обеспечить синхронизацию внешнего устройства от компьютера именно поэтому мне и оказалась нужна эта вещь, т.к. система может в ненужный момент вемени отдать процессорное время другому потоку.
[quote="_Harry"]И самое главное Windows не RTOS Так что часто лучше попытаться обеспечить синхронизацию внешнего устройства от компьютера[/quote] именно поэтому мне и оказалась нужна эта вещь, т.к. система может в ненужный момент вемени отдать процессорное время другому потоку.
|
|
|
|
Добавлено: Вс ноя 14, 2010 09:50 |
|
|
|
|
|
Заголовок сообщения: |
Re: вариант реализации watchdog механизма |
|
|
_Harry писал(а): Ну я сравнивал с обычным таймером, а не со счетчиком RDTS. собственно, я ведь не знаю пока как лучше сделать. Пока что сделано так, что можно выйти из определенного цикла в случае превышения времени ожидания, и продолжить выполнение кода (это важный момент, т.к. я не представляю как можно реализовать этот механизм в случае с callback-ом). мне не нужно прерывать процесс! мне нужен выход из цикла, который задумался дольше, чем нужно, либо возможность продолжить выполнение цикла после корректировки данных. При этом сама проверка на таймаут не должна отнимать много времени!
[quote="_Harry"]Ну я сравнивал с обычным таймером, а не со счетчиком RDTS.[/quote] собственно, я ведь не знаю пока как лучше сделать. Пока что сделано так, что можно выйти из определенного цикла в случае превышения времени ожидания, и продолжить выполнение кода (это важный момент, т.к. я не представляю как можно реализовать этот механизм в случае с callback-ом). мне не нужно прерывать процесс! мне нужен выход из цикла, который задумался дольше, чем нужно, либо возможность продолжить выполнение цикла после корректировки данных. При этом сама проверка на таймаут не должна отнимать много времени!
|
|
|
|
Добавлено: Вс ноя 14, 2010 09:30 |
|
|
|
|
|
Заголовок сообщения: |
Re: вариант реализации watchdog механизма |
|
|
mOleg писал(а): пошустрей точно не будет! Ну я сравнивал с обычным таймером, а не со счетчиком RDTS. Очевидно что твой вариант самый скоростной. Только мне непонятно зачем это WatchDog-у видимо ты навесил на него какие то дополнительные функции? И еще что будет если процесс зависнет. Кто считать и проверять будет? Колбэк тут как то получше смотрится. И самое главное Windows не RTOS Так что часто лучше попытаться обеспечить синхронизацию внешнего устройства от компьютера.
[quote="mOleg"]пошустрей точно не будет![/quote]Ну я сравнивал с обычным таймером, а не со счетчиком RDTS. Очевидно что твой вариант самый скоростной. Только мне непонятно зачем это WatchDog-у видимо ты навесил на него какие то дополнительные функции? И еще что будет если процесс зависнет. Кто считать и проверять будет? Колбэк тут как то получше смотрится. И самое главное Windows не RTOS Так что часто лучше попытаться обеспечить синхронизацию внешнего устройства от компьютера.
|
|
|
|
Добавлено: Сб ноя 13, 2010 23:34 |
|
|
|
|
|
Заголовок сообщения: |
Re: вариант реализации watchdog механизма |
|
|
_Harry писал(а): Для ЧасовойСобаки не нужна ни скорость ни точность. особенная точность не нужна, а вот время "обдумывания" мне достаточно критично. То есть, мне важно, чтобы цикл, в котором используется watchdog работал быстро (поэтому и не хочу возни с АПИ, а с колбэками уж и подавно!). Поэтому RDTC и подходит лучше всего, он очень быстро получается, дает премлемое разрешение по времени, и достаточно прост. _Harry писал(а): мультимедийный таймер может запускать свой колбэк, это пошустрей будет напомнить, сколько всего делается при воходе в колбэк? пошустрей точно не будет!
[quote="_Harry"]Для ЧасовойСобаки не нужна ни скорость ни точность.[/quote] особенная точность не нужна, а вот время "обдумывания" мне достаточно критично. То есть, мне важно, чтобы цикл, в котором используется watchdog работал быстро (поэтому и не хочу возни с АПИ, а с колбэками уж и подавно!). Поэтому RDTC и подходит лучше всего, он очень быстро получается, дает премлемое разрешение по времени, и достаточно прост.
[quote="_Harry"]мультимедийный таймер может запускать свой колбэк, это пошустрей будет[/quote] напомнить, сколько всего делается при воходе в колбэк? ;) пошустрей точно не будет!
|
|
|
|
Добавлено: Сб ноя 13, 2010 19:43 |
|
|
|
|
|
Заголовок сообщения: |
Re: вариант реализации watchdog механизма |
|
|
mOleg писал(а): SetTimer явно не катит, т.к. сообщения о таймаутах передаются через очередь сообщений в messageloop. Да еще мультимедийный таймер может запускать свой колбэк, это пошустрей будет и не будет зависеть от зависания процесса.
[quote="mOleg"]SetTimer явно не катит, т.к. сообщения о таймаутах передаются через очередь сообщений в messageloop.[/quote] Да еще мультимедийный таймер может запускать свой колбэк, это пошустрей будет и не будет зависеть от зависания процесса.
|
|
|
|
Добавлено: Сб ноя 13, 2010 16:15 |
|
|
|
|