Вверх ↑
Этот топик читают: Гость
Ответов: 7
Рейтинг: 0
#1: 2012-11-04 16:57:22 ЛС | профиль | цитата
Помогите разобраться пож-та.
Вылазит ошибка при задержке события с использованием компонента "Задержка (Sleep)".
Если повторений не больше 3227, то ошибки нет.
Версия
HiAsm_4.04b185.20-01-11_AltBuild_v814.01
с обновлениями.
На более старых версиях Hiasm то же глюк на уже при меньших количествах повторов.
code_29442.txt
карма: 0

0
файлы: 1code_29442.txt [2KB] [380]
vip
#1.1контекстная реклама от партнеров
Разработчик
Ответов: 26068
Рейтинг: 2121
#2: 2012-11-04 17:10:48 ЛС | профиль | цитата
stack overflow означает, что стоит незавершающаяся рекурсия, те вызов самого себя количеством раз больше, чем этого позволяет стек, что приводит, естественно, к переполнению стека.
карма: 22

0
Ответов: 7
Рейтинг: 0
#3: 2012-11-04 17:59:43 ЛС | профиль | цитата
Можно ли используя компонент "Задержка (Sleep)" обойти переполнение стека. Или проще использовать другой компонент?
карма: 0

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#4: 2012-11-04 18:16:52 ЛС | профиль | цитата
sova2004 писал(а):
Можно ли используя компонент "Задержка (Sleep)" обойти переполнение стека

Нет, нельзя. Надо обязательно избавиться от длинной рекурсиию. А что конкретно надо получить, какое действие
Можно ли описать вкратце суть задачи
карма: 22

0
Ответов: 7
Рейтинг: 0
#5: 2012-11-04 23:38:16 ЛС | профиль | цитата
Имеется KernelChip KeUsb24A. С него управляю тремя шаговыми двигателями. Командой "Задержка (Sleep)" я задерживаю выполнение программы чтобы двигатель успел сместится на 1 шаг. То есть - один шаг = один цикл "Задержка (Sleep)" (как в приложенном файле). Если 1 миллиметр = 8 шагам двигателя то получаем ограничение в перемещении 3227/8 = 403.375 мм. В реале получается еще меньше. При закрытии программы стек не обнуляется либо обнуляется не корректно, так как при повторном открытии программы количество циклов в 3227 не соблюдается.
Сейчас пробую для этих целей "Независимый таймер (MMTimer)" так как из способов задержки событий, указанных выше, только этот компонент не дает сбоев при многократных повторениях.
карма: 0

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#6: 2012-11-04 23:43:52 ЛС | профиль | цитата
sova2004 писал(а):
только этот компонент не дает сбоев при многократных повторениях

И в чем заключаются эти сбои
Я так понял, что нужен цикл с регулируемой задержкой.
А что, количество шагов временем подачи импульсов регулируются
карма: 22

0
Ответов: 7
Рейтинг: 0
#7: 2012-11-05 00:01:12 ЛС | профиль | цитата
И в чем заключаются эти сбои

Программа вылетает (закрывается без предупреждений), либо Runtime eror, либо stack overflow.
А что, количество шагов временем подачи импульсов регулируются

Задержкой я регулирую время подачи тока на обмотку.
карма: 0

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#8: 2012-11-05 00:06:24 ЛС | профиль | цитата
sova2004 писал(а):
Задержкой я регулирую время подачи тока на обмотку

Те за один импульс определенной длительности делается только один шаг, правильно
Сколько этот импульс длится, и сколько количество шагов полного кольца
Если импульс будет колебаться по времени в большую строну, сильно ли это повлияет на двигатель

Дпя для нормальной работы ПО я бы рекомендовал поставить компилятор делфи, из-под FPC работать нормально такое ПО не буде, и полностью обновить среду и пакет из последней сборки
карма: 22

0
Ответов: 7
Рейтинг: 0
#9: 2012-11-05 00:26:53 ЛС | профиль | цитата
Те за один импульс определенной длительности делается только один шаг, правильно

да
Сколько этот импульс длится, и сколько количество шагов полного кольца

4500 микросекунд, 12 шагов = 1 полный оборот двигателя
Если импульс будет колебаться по времени в большую строну, сильно ли это повлияет на двигатель

Падает скорость двигателя, увеличивается шум
поставить компилятор делфи

Что это даст? Где почитать про то как это сделать?
полностью обновить среду

обновлялся 3.11.2012 отсюда http://forum.d2h.ru/forum.html?q=3&t=58323 . Этого хватит?
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#10: 2012-11-05 00:29:52 ЛС | профиль | цитата
Переполнения стека в любом случае не должно быть . Только неправильно составленная схема. ИМХО.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 7
Рейтинг: 0
#11: 2012-11-05 00:41:28 ЛС | профиль | цитата
Tad

Программа работает при использовании компонента MMtimer. Если заменить компонент на Timer или Sleep или DeferredEvent программа не работает. В выложенном примере компонент Sleep вызывает переполнение стека.
карма: 0

0
Разработчик
Ответов: 26068
Рейтинг: 2121
#12: 2012-11-05 01:10:21 ЛС | профиль | цитата
А что мешает поставить обычный поток с задержкой в и дуть эти импульсы в порт, отсчитало сколько надо, остановило поток
Зачем тут все циклить-то
И почему задержки стоят до счетчика, а не после, с чем это связано

Да, кстати, я бы настоятельно не рекомендовал ставить разрешение всех таймеров в 0, это чревато полной загрузкой системы, возможно даже, с полной блокировкой интерфейса. И вообще, использовать режим RealTime с разрешением в 1 мкс, в системе Виндоус, без использования драйверов 0-го кольца, не получится никак -- минимальная задержка для системы около 15 мс (а реально вообще 64 мс), только в ненагруженном состоянии можно хоть как-то добиться разрешения чуть меньше 10 мс, о мксек вообще речи быть не может, система постоянно будет лезьт в ваш таймер и откладывать его события для выполнения своих задач.
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#13: 2012-11-05 01:48:01 ЛС | профиль | цитата
sova2004, смотрел я схему. В корне нерабочая.
Вот посмотри за сколько миллисекунд компонент Math добавляет одну единичку. А все пропущенные за это время твои слипы складываются в стек. И какой стек это выдержит ?
code_29449.txt
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1code_29449.txt [640B] [255]
Разработчик
Ответов: 26068
Рейтинг: 2121
#14: 2012-11-05 02:34:10 ЛС | профиль | цитата
А нельзя ли повесить выдачу импульсов на KernelChip KeUsb24A, или он не позволяет этого делать Жаль, но у меня нет этого устройства.
------------ Дoбавленo в 02.34:
Вот так работает на MMTimer-e, но только с мсек



Add(MainForm,2953706,462,217)
{
}
Add(MMTimer,4119969,273,105)
{
Resolution=0
Interval=5
Enable=1
Point(doAutoStop)
Point(onStop)
link(onTimer,11442839:doOperation,[])
link(onStop,8362870:doEvent1,[(317,118)(317,167)])
}
Add(Edit,6806358,217,56)
{
Left=25
Top=5
Width=130
Cursor=1
Text="1000"
}
Add(Math,11442839,399,105)
{
Op2=1
ResultType=0
Point(doClear)
link(Op1,1076077:Var3,[(405,93)(440,93)(440,145)])
}
Add(Button,3654948,105,91)
{
Left=75
Top=35
TabOrder=-1
Caption="Sart"
link(onClick,15544446:doEvent1,[])
}
Add(Hub,15544446,168,91)
{
OutCount=4
link(onEvent1,11442839:doClear,[(330,97)(330,118)])
link(onEvent2,15260899:doData,[(200,104)(200,125)])
link(onEvent3,4119969:doTimer,[])
link(onEvent4,4631823:doStart,[(196,118)(196,216)])
}
Add(DoData,15260899,217,119)
{
link(onEventData,4119969:doAutoStop,[])
link(Data,6806358:Text,[])
}
Add(TimeCounter,4631823,399,210)
{
link(onStop,2953706:doCaption,[])
}
Add(Edit,14665970,399,168)
{
Left=180
Top=5
Width=130
Cursor=1
Text=""
link(Str,1076077:Var2,[])
}
Add(Hub,8362870,329,161)
{
link(onEvent1,4631823:doStop,[(360,167)(360,223)])
link(onEvent2,14665970:doText,[])
}
Add(GetDataEx,1076077,399,140)
{
link(Data,11442839:Result,[])
}


Но ни в коем случае, никакие визуальные компоненты нельзя цеплять к выходу onTimer
карма: 22

0
Ответов: 8888
Рейтинг: 823
#15: 2012-11-05 10:57:35 ЛС | профиль | цитата
nesco писал(а):
повесить выдачу импульсов на KernelChip
Это устройство само очень медленное, прохождение команды и ответ на неё занимают не менее 1 миллисекунды, да плюс 5 миллисекунд на отработку двигателя -- вполне реализуемое время в Thread, ставить Sleep никакого смысла нет (его вообще из палитры убрать надо, только процессор грузит на 100%, я к примеру, ни разочка не применял)
карма: 19

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)