Помогите разобраться пож-та.
Вылазит ошибка при задержке события с использованием компонента "Задержка (Sleep)".
Если повторений не больше 3227, то ошибки нет.
Версия
HiAsm_4.04b185.20-01-11_AltBuild_v814.01
с обновлениями.
На более старых версиях Hiasm то же глюк на уже при меньших количествах повторов.
code_29442.txt
Этот топик читают: Гость
Ответов: 7
Рейтинг: 0
|
|||
карма: 0 |
| ||
файлы: 1 | code_29442.txt [2KB] [422] |
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
stack overflow означает, что стоит незавершающаяся рекурсия, те вызов самого себя количеством раз больше, чем этого позволяет стек, что приводит, естественно, к переполнению стека.
|
|||
карма: 22 |
|
Ответов: 7
Рейтинг: 0
|
|||
Можно ли используя компонент "Задержка (Sleep)" обойти переполнение стека. Или проще использовать другой компонент?
|
|||
карма: 0 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
sova2004 писал(а): Можно ли используя компонент "Задержка (Sleep)" обойти переполнение стекаНет, нельзя. Надо обязательно избавиться от длинной рекурсиию. А что конкретно надо получить, какое действие Можно ли описать вкратце суть задачи |
|||
карма: 22 |
|
Ответов: 7
Рейтинг: 0
|
|||
Имеется KernelChip KeUsb24A. С него управляю тремя шаговыми двигателями. Командой "Задержка (Sleep)" я задерживаю выполнение программы чтобы двигатель успел сместится на 1 шаг. То есть - один шаг = один цикл "Задержка (Sleep)" (как в приложенном файле). Если 1 миллиметр = 8 шагам двигателя то получаем ограничение в перемещении 3227/8 = 403.375 мм. В реале получается еще меньше. При закрытии программы стек не обнуляется либо обнуляется не корректно, так как при повторном открытии программы количество циклов в 3227 не соблюдается.
Сейчас пробую для этих целей "Независимый таймер (MMTimer)" так как из способов задержки событий, указанных выше, только этот компонент не дает сбоев при многократных повторениях. |
|||
карма: 0 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
sova2004 писал(а): только этот компонент не дает сбоев при многократных повторенияхИ в чем заключаются эти сбои Я так понял, что нужен цикл с регулируемой задержкой. А что, количество шагов временем подачи импульсов регулируются |
|||
карма: 22 |
|
Ответов: 7
Рейтинг: 0
|
|||
И в чем заключаются эти сбои Программа вылетает (закрывается без предупреждений), либо Runtime eror, либо stack overflow. А что, количество шагов временем подачи импульсов регулируются Задержкой я регулирую время подачи тока на обмотку. |
|||
карма: 0 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
sova2004 писал(а): Задержкой я регулирую время подачи тока на обмоткуТе за один импульс определенной длительности делается только один шаг, правильно Сколько этот импульс длится, и сколько количество шагов полного кольца Если импульс будет колебаться по времени в большую строну, сильно ли это повлияет на двигатель Дпя для нормальной работы ПО я бы рекомендовал поставить компилятор делфи, из-под FPC работать нормально такое ПО не буде, и полностью обновить среду и пакет из последней сборки |
|||
карма: 22 |
|
Ответов: 7
Рейтинг: 0
|
|||
Те за один импульс определенной длительности делается только один шаг, правильно да Сколько этот импульс длится, и сколько количество шагов полного кольца 4500 микросекунд, 12 шагов = 1 полный оборот двигателя Если импульс будет колебаться по времени в большую строну, сильно ли это повлияет на двигатель Падает скорость двигателя, увеличивается шум поставить компилятор делфи Что это даст? Где почитать про то как это сделать? полностью обновить среду обновлялся 3.11.2012 отсюда http://forum.d2h.ru/forum.html?q=3&t=58323 . Этого хватит? |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Переполнения стека в любом случае не должно быть . Только неправильно составленная схема. ИМХО.
|
|||
карма: 25 |
|
Ответов: 7
Рейтинг: 0
|
|||
Tad Программа работает при использовании компонента MMtimer. Если заменить компонент на Timer или Sleep или DeferredEvent программа не работает. В выложенном примере компонент Sleep вызывает переполнение стека. |
|||
карма: 0 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
А что мешает поставить обычный поток с задержкой в и дуть эти импульсы в порт, отсчитало сколько надо, остановило поток
Зачем тут все циклить-то И почему задержки стоят до счетчика, а не после, с чем это связано Да, кстати, я бы настоятельно не рекомендовал ставить разрешение всех таймеров в 0, это чревато полной загрузкой системы, возможно даже, с полной блокировкой интерфейса. И вообще, использовать режим RealTime с разрешением в 1 мкс, в системе Виндоус, без использования драйверов 0-го кольца, не получится никак -- минимальная задержка для системы около 15 мс (а реально вообще 64 мс), только в ненагруженном состоянии можно хоть как-то добиться разрешения чуть меньше 10 мс, о мксек вообще речи быть не может, система постоянно будет лезьт в ваш таймер и откладывать его события для выполнения своих задач. |
|||
карма: 22 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
sova2004, смотрел я схему. В корне нерабочая.
Вот посмотри за сколько миллисекунд компонент Math добавляет одну единичку. А все пропущенные за это время твои слипы складываются в стек. И какой стек это выдержит ? code_29449.txt |
|||
карма: 25 |
| ||
файлы: 1 | code_29449.txt [640B] [296] |
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
А нельзя ли повесить выдачу импульсов на KernelChip KeUsb24A, или он не позволяет этого делать Жаль, но у меня нет этого устройства.
------------ Дoбавленo в 02.34: Вот так работает на MMTimer-e, но только с мсек
Но ни в коем случае, никакие визуальные компоненты нельзя цеплять к выходу onTimer |
|||
карма: 22 |
|
Ответов: 8930
Рейтинг: 823
|
|||
nesco писал(а): повесить выдачу импульсов на KernelChip |
|||
карма: 19 |
|