-
- Поскольку в PT в качестве аргумента case идут номера строк, при компиляции на архитектурах M16,MSP,PIC,AVR,51 это выливается в последовательность сравнение+переход. Это плата за возможность писать линейный код. Для маленьких автоматов удобно, не Хитрый Китаец(31 знак., 26.12.2011 23:54)
- приличным компиляторам можно объяснить, что нужно генерировать таблицу переходов - Vit(27.12.2011 00:28)
- При длинной функции слишком разряженная таблица может получиться, компромисс как всегда. - Хитрый Китаец(27.12.2011 00:59)
- а Вы попробуйте:) - Vit(27.12.2011 01:04)
- Постоянно - Хитрый Китаец(27.12.2011 01:11)
- а Вы попробуйте:) - Vit(27.12.2011 01:04)
- При длинной функции слишком разряженная таблица может получиться, компромисс как всегда. - Хитрый Китаец(27.12.2011 00:59)
- Я про пролог-эпилог мегафункции, сохраняющие и восстанавливающие контекст. Они заточены под самый кодозатратный проход, поэтому длинные. И этот скорбный путь сохранения-восстановления, грубо говоря назвать его push-pop, проходят все даже самые IdleMode(158 знак., 27.12.2011 00:25, )
- Если Вы пользуетесь IAR'ом там есть полезное слово __task, а в остальном - ну да, сохраняются регистры, так пользуйтесь теми камнями где их мало, например M16 :) - Хитрый Китаец(27.12.2011 00:55)
- Нагнуть компилятор можно, но, попробуйте не сохранять регистровый пул когда крутятся две разные задачи :) - IdleMode(27.12.2011 01:00, )
- Вложенные, тогда да, несомненно. - Хитрый Китаец(27.12.2011 01:10)
- Нагнуть компилятор можно, но, попробуйте не сохранять регистровый пул когда крутятся две разные задачи :) - IdleMode(27.12.2011 01:00, )
- не читал но осуждаю(С):) - Vit(27.12.2011 00:32)
- Не понимаю но интересно :) - IdleMode(27.12.2011 00:33, )
- Должно быть интересно сохранять и восстанавливать статический контекст - Vit(27.12.2011 00:41)
- Особенно когда для 9/10 case надо пяток инструкций и достаточно одного регистра, а в остальных 1/10 case идут вызовы внешних функций и компилятор должен сохранять 12 регистров. А вход в мегафункцию один и для маленьких и для больших case. Как вы IdleMode(78 знак., 27.12.2011 00:56, )
- смешались в кучу кони, люди... - Vit(27.12.2011 01:01)
- Что ж непонятно? Проект пара разнородных задач, запускаемых карусельным способом. Каждая задача выполняется в своей длиннющей функции, построенной на switch. Каруселька постоянно входит в задачу-функцию с разными номерами case. Вход в такую IdleMode(167 знак., 27.12.2011 01:13, )
- Вы жонглируете словами "задача", "контекст", "функция", "пролог" и "эпилог". и всё не в тему. - Vit(27.12.2011 01:21)
- Да бросьте, неужели? Проект это проект :) В проекте 2 разнородных задачи. Непонятно? Клавиатура и светодиод. Задачи запускаются карусельным способом while(true){task1(); task2(2);}Каждая Таска - это длиннющая функция, построенная на switch и при IdleMode(203 знак., 27.12.2011 01:34, )
- Статический контекст вызываемой функции не требует восстановления. При вызове функции нужно сохранить контекст(который регистровый пул и нестатические переменные) вызывающей функции. Дальше Вы Немцов - Vit(27.12.2011 01:38 - 01:41)
- Вы просто Вольфыч :) Про статический контекст в двухзадачном проекте сами придумали? - IdleMode(27.12.2011 01:51, )
- В прототридах контекст задачи хранится в статических переменных. Вы же о чём-то своём вещаете. - Vit(27.12.2011 01:55)
- Вы никак не можете понять что ли, что для длинной функции портится куча РОН? При чем тут статические или глобальные переменные? Да пусть они лежат родимые, не трогаем мы их. Регистров-то, регистров куча сохраняется. И указатели локального стека IdleMode(59 знак., 27.12.2011 02:13, )
- Да плевать, какой длины вызываемая функция - её регистровый пул при выходе из неё не сохраняется и потому его ненужно (не требуется, нет его) восстанавливать. Регистры же вызывающей функции и сохраняются, и восстанавливаются. - Vit(27.12.2011 02:20)
- Вы понимаете что такое пролог и эпилог функции? Там сохраняются ресурсы(конечно той функции, из которой мы пришли, как вы могли подумать что надо сохранять еще какие-то - не знаю) и восстанавливаются ресурсы (сохраненные, как вы могли подумать про IdleMode(36 знак., 27.12.2011 02:30, )
- Длина вызываемой функции не важна. Вы же упорно пытаетесь доказать обратное. Достаточное количество сохраняемого не более контекста вызывающей функции. - Vit(27.12.2011 02:39 - 02:44)
- Да боже ж мой-то, куда ж вас опять понесло-то... Сейчас для нас "большая" функция или мегафункция switch-задачи, как я ее тут назвал - это та, которая при выполнении требует кучу ресурсов, вызывает кучу внешних функций и т.п. Конечно, IdleMode(403 знак., 27.12.2011 07:44, )
- Клиника. В сад. - Vit(27.12.2011 09:57)
- Да боже ж мой-то, куда ж вас опять понесло-то... Сейчас для нас "большая" функция или мегафункция switch-задачи, как я ее тут назвал - это та, которая при выполнении требует кучу ресурсов, вызывает кучу внешних функций и т.п. Конечно, IdleMode(403 знак., 27.12.2011 07:44, )
- Длина вызываемой функции не важна. Вы же упорно пытаетесь доказать обратное. Достаточное количество сохраняемого не более контекста вызывающей функции. - Vit(27.12.2011 02:39 - 02:44)
- Вы понимаете что такое пролог и эпилог функции? Там сохраняются ресурсы(конечно той функции, из которой мы пришли, как вы могли подумать что надо сохранять еще какие-то - не знаю) и восстанавливаются ресурсы (сохраненные, как вы могли подумать про IdleMode(36 знак., 27.12.2011 02:30, )
- Да плевать, какой длины вызываемая функция - её регистровый пул при выходе из неё не сохраняется и потому его ненужно (не требуется, нет его) восстанавливать. Регистры же вызывающей функции и сохраняются, и восстанавливаются. - Vit(27.12.2011 02:20)
- Вы никак не можете понять что ли, что для длинной функции портится куча РОН? При чем тут статические или глобальные переменные? Да пусть они лежат родимые, не трогаем мы их. Регистров-то, регистров куча сохраняется. И указатели локального стека IdleMode(59 знак., 27.12.2011 02:13, )
- Напоминаю что в контекст входит часть пула РОН. - IdleMode(27.12.2011 01:54, )
- Вызываемой функции? - Vit(27.12.2011 01:56)
- У функции нет РОН. У вызываемой функции есть требуемые для ее работы ресурсы, в которые входит РОН и участки к примеру локального стека. Если угодно назовите это ее локальным контекстом. При входе в функцию пролог сохраняет ресурсы, портящиеся при IdleMode(48 знак., 27.12.2011 02:08, )
- У вызываемой функции при вызове нет контекста - он создается на время выполнения функции. Сохраняется относящееся к вызывающей функции, но умный компилятор действительно может пожать объём сохраняемого, потому как он "знает, кто у нас начальник Vit(10 знак., 27.12.2011 02:29)
- Как? Как, дорогой, ваш умный компилятор сожмет пролог и эпилог switch-функции реализации протопотоков, когда он не знает, какой case из 100 у него имеющегося (98 "легких" и 2 "тяжелых", портящих много РОН) в какой момент IdleMode(91 знак., 27.12.2011 07:52, )
- Компилятор умеет считать. - Vit(27.12.2011 10:00)
- Как? Как, дорогой, ваш умный компилятор сожмет пролог и эпилог switch-функции реализации протопотоков, когда он не знает, какой case из 100 у него имеющегося (98 "легких" и 2 "тяжелых", портящих много РОН) в какой момент IdleMode(91 знак., 27.12.2011 07:52, )
- У вызываемой функции при вызове нет контекста - он создается на время выполнения функции. Сохраняется относящееся к вызывающей функции, но умный компилятор действительно может пожать объём сохраняемого, потому как он "знает, кто у нас начальник Vit(10 знак., 27.12.2011 02:29)
- У функции нет РОН. У вызываемой функции есть требуемые для ее работы ресурсы, в которые входит РОН и участки к примеру локального стека. Если угодно назовите это ее локальным контекстом. При входе в функцию пролог сохраняет ресурсы, портящиеся при IdleMode(48 знак., 27.12.2011 02:08, )
- Вызываемой функции? - Vit(27.12.2011 01:56)
- В прототридах контекст задачи хранится в статических переменных. Вы же о чём-то своём вещаете. - Vit(27.12.2011 01:55)
- Вы просто Вольфыч :) Про статический контекст в двухзадачном проекте сами придумали? - IdleMode(27.12.2011 01:51, )
- Статический контекст вызываемой функции не требует восстановления. При вызове функции нужно сохранить контекст(который регистровый пул и нестатические переменные) вызывающей функции. Дальше Вы Немцов - Vit(27.12.2011 01:38 - 01:41)
- Да бросьте, неужели? Проект это проект :) В проекте 2 разнородных задачи. Непонятно? Клавиатура и светодиод. Задачи запускаются карусельным способом while(true){task1(); task2(2);}Каждая Таска - это длиннющая функция, построенная на switch и при IdleMode(203 знак., 27.12.2011 01:34, )
- Вы жонглируете словами "задача", "контекст", "функция", "пролог" и "эпилог". и всё не в тему. - Vit(27.12.2011 01:21)
- Что ж непонятно? Проект пара разнородных задач, запускаемых карусельным способом. Каждая задача выполняется в своей длиннющей функции, построенной на switch. Каруселька постоянно входит в задачу-функцию с разными номерами case. Вход в такую IdleMode(167 знак., 27.12.2011 01:13, )
- смешались в кучу кони, люди... - Vit(27.12.2011 01:01)
- Особенно когда для 9/10 case надо пяток инструкций и достаточно одного регистра, а в остальных 1/10 case идут вызовы внешних функций и компилятор должен сохранять 12 регистров. А вход в мегафункцию один и для маленьких и для больших case. Как вы IdleMode(78 знак., 27.12.2011 00:56, )
- Должно быть интересно сохранять и восстанавливать статический контекст - Vit(27.12.2011 00:41)
- Не понимаю но интересно :) - IdleMode(27.12.2011 00:33, )
- Если Вы пользуетесь IAR'ом там есть полезное слово __task, а в остальном - ну да, сохраняются регистры, так пользуйтесь теми камнями где их мало, например M16 :) - Хитрый Китаец(27.12.2011 00:55)
- приличным компиляторам можно объяснить, что нужно генерировать таблицу переходов - Vit(27.12.2011 00:28)
- Поскольку в PT в качестве аргумента case идут номера строк, при компиляции на архитектурах M16,MSP,PIC,AVR,51 это выливается в последовательность сравнение+переход. Это плата за возможность писать линейный код. Для маленьких автоматов удобно, не Хитрый Китаец(31 знак., 26.12.2011 23:54)