-
- Немного информации - по ссылкам. zeleny(1887 знак., 27.12.2011 10:36, ссылка, ссылка)
- Честно скажу, ничего не понял. Особенно сбили с толку какие-то обертки. Чего-то не хватает, чтобы понять. - mazur(27.12.2011 06:35)
- Ясно чего не хватает. Надо для начала получить опыт программирования на Си. Иначе эти protothreads нафиг не нужны. - SciFi(27.12.2011 10:01)
- Когда-то я делал устройства на транзисторах, аналоговых микросхемах. Параллельно читал литературу по логике. Позже стал делать на логике. После прочтения статьи, как сделать частотомер, и еще несколько устройств в одном флаконе на микроконтроллере mazur(897 знак., 27.12.2011 10:44)
- Дело в том, что прототреды - всего лишь "синтаксический сахар" для Си, способ упорядочивания исходников, для АСМа оно бессмысленно. На низком уровне это всего-навсего передача в функцию числа, которое определяет, какую ветку кода нужно =AlexD=(200 знак., 27.12.2011 11:12 - 11:32)
- Уже написали, наверное. Protothreads - это способ на языке Си скрыть конечные автоматы под видом как бы линейного кода. Улучшается читаемость кода. Чтобы за деревьями лес был виден. Остальное - детали. SciFi(162 знак., 27.12.2011 11:11 - 11:15)
- +1 - Vit(27.12.2011 10:26)
- Когда-то я делал устройства на транзисторах, аналоговых микросхемах. Параллельно читал литературу по логике. Позже стал делать на логике. После прочтения статьи, как сделать частотомер, и еще несколько устройств в одном флаконе на микроконтроллере mazur(897 знак., 27.12.2011 10:44)
- Ясно чего не хватает. Надо для начала получить опыт программирования на Си. Иначе эти protothreads нафиг не нужны. - SciFi(27.12.2011 10:01)
- Лучше было бы по-английски. Там очень просто. С помощью маленького хака (оператора switch языка Си) можно выйти из функции с запоминанием "места выхода", а при следующем вызове почти сразу попасть на следующий оператор после "места выхода". Vit(491 знак., 26.12.2011 23:44, ссылка)
- Только похожа на ОС, а внутри каждая задача представляет собой конечный автомат на конструкции switch-case языка С, а вызываются задачи каруселькой. Простенько, но со вкусом. Можно удобно раскладывать автоматные задачи. - Хитрый Китаец(26.12.2011 22:21)
- Право не знаю какой здесь вкус, но пролог и эпилог у этой мегафункции может по времени в десятки раз превосходить полезный код для многих шагов автоматной задачи. - IdleMode(26.12.2011 23:24, )
- Поскольку в 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)
- Право не знаю какой здесь вкус, но пролог и эпилог у этой мегафункции может по времени в десятки раз превосходить полезный код для многих шагов автоматной задачи. - IdleMode(26.12.2011 23:24, )