Добрый вечер! Есть один блок ПР110 и никак немогу создать программу к нему. На 114 программа работает нормально, а вот в 110 говорит что Уровень стека программы превышен! Значение глубины стека = 15! Как снизить уровень стека?
Вид для печати
Добрый вечер! Есть один блок ПР110 и никак немогу создать программу к нему. На 114 программа работает нормально, а вот в 110 говорит что Уровень стека программы превышен! Значение глубины стека = 15! Как снизить уровень стека?
Программу копировал с ПР114 и есть много сетевых переменных, они тоже влияют на стек? А как поменять входа ФБ?
Что гадать ,схему в цех ...тогда помогут ,а так трата времени .
Привожу наглядный пример. Вложение 23937 и Вложение 23938 Схема функционально одна и та же, связи проложены по другому и уже стек занимают разный.
Так лучше линии в 110?
Q1-является определяющим в переполнении стека .
И как вывод на ПР110 такие неочень то сложные задачи невозможно выполнить! Для этих целей ПР114, на котором моя программа работает! Всем спасибо!
Это обусловлено последовательным процессом обработки схемы в ОЛ от выхода ко входу и сверху в низ ,да еще наличием обратных связей,а так же ограничением процессора .Об этом уже много писалось ...
Не доработка была ,когда глубина стека была 6 ,а теперь он динамический .И ограничения наступают больше по физическим возможностям данной модели ПР.
^^^ это из серии "не читал, но осуждаю".
На картинки посмотрите: там 2 практически одинаковые программы, а использование стека почти в 8 раз различается.
Обратных связей нет, о каких ограничениях процессора речь -- тоже непонятно.
А почему именно сверху вниз, а не тем способом, который экономит ресурсы?
что за способ, если не трудно, то вкратце расскажите
ЗЫ а может Вы и есть wal79, только уже не работающий в компании, но знающий "секреты" :)
Это вы не читали про стек для ПР110 ,а ту да же ....Лично я его первым сломал ,к слову .Идет последовательная обработка связей в ОЛ и промежуточные значения сохраняются в стеке .и как не крути с последовательностью (с низу в вверх ,сверху в низ) ,в реальной схеме может не хватить глубины стека ,если есть аппаратные ограничения .Потому и придумали разработчики более совершенный алгоритм -динамический стек и повысили его глубину до 15 ,при тех же ресурсах .
Простая замена неявных связей явными позволит снизить уровень стека в 4 раза во первом варианте .
Обработка элемента в ОЛ идет от выхода ко входу ,поэтому это всегда обратная связь ,учите мат часть.
нЕ поленитесь и сравните на каких МК сделан ПР110 и Пр114 (200) для общего развития .
Компиляция схемы в машинный код может выглядеть так:
В результате требуется стек глубины 5Код:push I1
push I2
push I3
push I4
push I5
add
add
add
add
А может так:
Результат тот же, но глубина требуемого стека -- 2.Код:push I1
push I2
add
push I3
add
push I4
add
push I5
add
При компиляции, ОЛ может рассмотреть несколько вариантов, и выбрать оптимальный по результирующей глубине стека, используемым регистрам и т.п.
Тут вы ошибаетесь.
Компилятор вполне может поменять связи местами, особенно, если это не влияет на результат.
Правило a+(b+c)=(a+b)+c в школе проходят. Для целых чисел оно соблюдается.
Поэтому ОЛ запросто могло бы преобразовать a+(b+(c+(d))) к виду ((a+b)+c)+d.
Посмотрите же на картинки хоть раз.
Там все связи явные. То, что замена схемы на такую же сокращает размер стека говорит лишь о том, что в этой области ОЛ недоработано.
Это вы учите мат часть. Не надо называть обратной связью то, что ей не является
Сигналы в железе распространяются от входов к выходам параллельно ,а в программной реализации -последовательно от выхода ко входу ,почувствуйте разницу .И здесь не строчный язык ,а графический ,который имеет свою специфику.
Явными связями называют те ,в которых явно задана последовательность выполнения ,если не задан порядок выполнения ,то это не явная связь в ОЛ.
Возможно неумение программировать сказывается, но постарайтесь хотя бы не делать громких выводов о программировании. Программная реализация может быть самой разной, лишь бы ответ получался правильный.
От перемены мест слагаемых ответ не меняется-значит компилятор может использовать это свойство как ему удобно.
Учите матчасть. Процессор пр про графические языки ничего не знает. Использовать слова графический-строчный в данном контексте глупо.
Вы всё-таки определитесь что такое _обратная_ связь.
Все уже давно определились и используют ,кроме вас .
И говорим мы не о ПР ,а о ОЛ .
От перемены мест слагаемых ответ не меняется-значит компилятор может использовать это свойство как ему удобно.
Компилятор работает не как ему удобно ,а по алгоритму заложенному разрабом .Я чувствую вы уже кодесис переписали ,теперь за ОЛ взялись .
И компилятор графического языка работает несколько иначе строчного ,где сам писатель определяет последовательность выполнения алгоритма...
Ну, да. Готов поспорить на 10'000 р, что компилятор ОЛ -> ПР самописный. По крайней мере, та его часть, которая вычисляет % занятости стека.
Т.е. ОЛ вполне в состоянии попробовать разные варианты скармливания и выбрать лучший.
Эта оптимизация в теории компиляторов давным-давно известна.
Именно! Я именно по этому и сказал, что в этой части наблюдается "недоработка в ОЛ".
Обычно, в компиляторы закладывают оптимизирующий модуль. Тут либо не делали, либо он хромает.
Не знаете как работают компиляторы (и зачем они нужны) -- нечего другим указывать.
Компилятор и нужен именно для того, чтобы последовательность выполнения алгоритма выбирал не автор программы, а компилятор.
Языки типа CFC/SFC/ST/LD/IL последовательность выполнения в железе не задают.
vladimirisitnikov задают на некотором этапе. У меня распространенная ошибка это забываю в CDS указать - расположить согласно потоку данных. И такая чехарда начинается, пока не вспомнишь, что забыл.
Слово не очень удачное. Задают, конечно, но не препятствуют автоматическому переписыванию в эквивалентный код. А ещё точнее не устаналивают однозначного соответствия исходного текста или «графики» машинному коду. Таким свойством только самые низкоуровневые ассемблеры обладают, пожалуй.Цитата:
задают на некотором этапе