- Есть ли "нормальный mutex" в IAR ARM ?2020-06-09
-
- А что толку? Я там вижу дикие циклы по всем задачам с проверкой условий -- с чем боролись, на то и напоролись. Просто вывернули big loop наизнанку. Нужен планировщик с O(1) сложностью алгоритма. Чтоб если у тебя 100500 задач, то нужная выбиралась fk0(84 знак., 17.11.2015 12:10)
- Реальных эмбеддерских задач под реальной RTOS до 7 - стандартные пакеты FS, GUI, какой-нить tcpip, и последняя - биглуп для своих извращений. Нефиг фигню фигачить задачами. - VL(18.11.2015 04:13, )
- Уж "7 реальных задач" тоже можно вывернуть до событийно-управляемых автоматов. GUI всю жизнь был событийно-ориентированным и однопоточным, запросто встраивается в существующий цикл обработки событий. TCP тоже автомат (он даже в RFC нарисован!). FS fk0(82 знак., 18.11.2015 10:43)
- Будь все так просто, не было бы RTOS никогда - VL(19.11.2015 00:07, )
- Уж "7 реальных задач" тоже можно вывернуть до событийно-управляемых автоматов. GUI всю жизнь был событийно-ориентированным и однопоточным, запросто встраивается в существующий цикл обработки событий. TCP тоже автомат (он даже в RFC нарисован!). FS fk0(82 знак., 18.11.2015 10:43)
- Есть одна проблема - непонятно как запрещать прерывания на Це. Чтобы не разрушить списки. Потому пока так. Как посетит ценная мысль - переделаю. - LightElf(17.11.2015 15:32)
- В моём понимании, отличие setjmp/longjmp от protothreads только в том, что можно передавать управление из любой глубины вложенности. Недостаток - необходимость выделять отдельные стеки. - SciFi(17.11.2015 12:23)
- в PT тоже можно PT_YIELD из любой вложенности, только нужные переменные сделать статическими - zeleny(18.11.2015 14:58)
- Нет, нельзя. - LightElf(18.11.2015 15:46)
- пруф можно? давно использую, работает при любой вложенности циклов и if-ов - zeleny(18.11.2015 16:32)
- Под вложенностью имею в виду вложенность функций. Вложенность циклов и условий (и свичей :) - это само собой. - LightElf(18.11.2015 17:01)
- Имел в виду вложенные функции. У protothreads для этого есть костыль - PT_SPAWN(). - SciFi(18.11.2015 16:35)
- пруф можно? давно использую, работает при любой вложенности циклов и if-ов - zeleny(18.11.2015 16:32)
- Нет, нельзя. - LightElf(18.11.2015 15:46)
- Именно так. Есть существенный момент - чужие готовые библиотеки могут использовать локальные переменные. Заворачивание их мехом наружу может быть весьма утомительным. - LightElf(17.11.2015 15:35)
- Ну всё-таки локальные переменные на всех уровнях у него сохраняются, в отличии от. Наговнокодить сложнее и программировать проще. И можно, потенциально, сделать полноценный планировщик (в котором сложность алгоритма не пропорциональна числу задач fk0(135 знак., 17.11.2015 12:39)
- только какая цена этого сохранения/восстановления - в циклах и памяти ? - zeleny(18.11.2015 15:00)
- Как и в любой другой многозадачке. И даже меньше, хотя и не намного. - LightElf(18.11.2015 15:47)
- только какая цена этого сохранения/восстановления - в циклах и памяти ? - zeleny(18.11.2015 15:00)
- в PT тоже можно PT_YIELD из любой вложенности, только нужные переменные сделать статическими - zeleny(18.11.2015 14:58)
- Реальных эмбеддерских задач под реальной RTOS до 7 - стандартные пакеты FS, GUI, какой-нить tcpip, и последняя - биглуп для своих извращений. Нефиг фигню фигачить задачами. - VL(18.11.2015 04:13, )
- Спасибо, положу в загашник :-) Хотя для такой вещи функционал ИМХО избыточен. Достаточно ct_block со значением = 0, чтобы организовать "карусельку" (Если я все правильно понял). - il-2(16.11.2015 12:53)
- Не совсем понял. Блокироваться можно по времени, а можно ожидать события. Событие может сигнализироваться из обработчика прерывания. В обновленной test_ct используется отдельный виндовый поток для эмуляции прерываний. Т.е. CThreads крутятся в LightElf(137 знак., 16.11.2015 13:04 - 13:12)
- Не нужно тянуть семафоры, мьютексы и т.п. из полноценной многозадачной ОС. Тебе нужен ровно один примитив -- "событие". Которое или произошло, или нет (бит). По нему и будить (у тебя ж собственно и сделана побудка по указателю на void*) Событие fk0(803 знак., 17.11.2015 12:15)
- Дык, блин. Как сделать критическую секцию на Це? Куча свистоплясок именно потому, что нельзя на Це запретить прерывания, нет такой функции. - LightElf(17.11.2015 15:40)
- Ввести понятие "порт". Как у всех и делается. Если для портирования нужна только функция запрещения прерывания, то и говорить не о чём. - =AlexD=(17.11.2015 15:55)
- Это не спортивно. Будет просто еще один, тысяча первый шедулер, ничем не лучше остальной тысячи. Фишка именно в почти абсолютной портабельности (кроме разве что 8051). Если ничего не случится, в выходные проведу мегатестирование на разных процах. - LightElf(17.11.2015 16:06)
- Ввести понятие "порт". Как у всех и делается. Если для портирования нужна только функция запрещения прерывания, то и говорить не о чём. - =AlexD=(17.11.2015 15:55)
- Самое главное. Для построения чего-то наподобии libevent нужен какой-то аналог select или WaitForMultipleEvents: т.е. механизм ожидания множества событий. Иначе вся твоя супер-ос разваливается на несколько десятков биглупов, и каждый в своём fk0(471 знак., 17.11.2015 12:22)
- conditional variable позволяют создать любой другой объект синхронизации - =AlexD=(17.11.2015 13:00)
- Дык, блин. Как сделать критическую секцию на Це? Куча свистоплясок именно потому, что нельзя на Це запретить прерывания, нет такой функции. - LightElf(17.11.2015 15:40)
- система приоритетов тоже может понадобиться - RED_DRAGON(17.11.2015 11:51)
- Не нужно тянуть семафоры, мьютексы и т.п. из полноценной многозадачной ОС. Тебе нужен ровно один примитив -- "событие". Которое или произошло, или нет (бит). По нему и будить (у тебя ж собственно и сделана побудка по указателю на void*) Событие fk0(803 знак., 17.11.2015 12:15)
- Не совсем понял. Блокироваться можно по времени, а можно ожидать события. Событие может сигнализироваться из обработчика прерывания. В обновленной test_ct используется отдельный виндовый поток для эмуляции прерываний. Т.е. CThreads крутятся в LightElf(137 знак., 16.11.2015 13:04 - 13:12)
- нечто похожее писал. но с динамическим списком "задач". - RED_DRAGON(13.11.2015 17:39)
- В смысле? Можно на ходу добавлять задачи? А стек как им резервируется? - LightElf(13.11.2015 17:47)
- не точно выразился. грубо говоря крутится "менеджер задач", который формирует список того что может выполняться сейчас из предопределенных вариантов. - RED_DRAGON(17.11.2015 11:46)
- Я понял, что ничего не понял :) - LightElf(17.11.2015 15:56)
- -> - Make_Pic(18.11.2015 09:37, ссылка)
- Спасибо, почитал. Ну это же совсем другое. Логика работы другая, устройство другое. У меня ж классическая многопоточка (ну почти), изрядно похожая на NicheTask (но без ассемблера). - LightElf(18.11.2015 11:32)
- -> - Make_Pic(18.11.2015 09:37, ссылка)
- Я понял, что ничего не понял :) - LightElf(17.11.2015 15:56)
- не точно выразился. грубо говоря крутится "менеджер задач", который формирует список того что может выполняться сейчас из предопределенных вариантов. - RED_DRAGON(17.11.2015 11:46)
- В смысле? Можно на ходу добавлять задачи? А стек как им резервируется? - LightElf(13.11.2015 17:47)
- readme-шку бы ещё какую не плохо бы. Что, куда, зачем. С наскоку непонятно. А то, что рантайм память под задачи резервирует - хорошо. Dingo(166 знак., 13.11.2015 17:32 - 17:36)
- Ашипку вернул почему-то :) Просто бинарник запускал или перекомпилировал? - LightElf(13.11.2015 17:44 - 17:46)
- Запускал. Win7 x86, ватчкома нет. - Dingo(13.11.2015 17:48)
- Перезалил, теперь вроде работает (WinXP x86). - LightElf(13.11.2015 18:05 - 18:22)
- Запускал. Win7 x86, ватчкома нет. - Dingo(13.11.2015 17:48)
- Ашипку вернул почему-то :) Просто бинарник запускал или перекомпилировал? - LightElf(13.11.2015 17:44 - 17:46)
- Конечно интересно - Олдфаг(13.11.2015 16:34, )
- под что? на каком си? - RED_DRAGON(13.11.2015 16:13)
- Да наверно подо все, чистый C89. Никаких регистров, асмов, интринсиков. Стеки задач отжираются от основного стека. - LightElf(13.11.2015 16:24 - 16:36, ссылка)
- А что толку? Я там вижу дикие циклы по всем задачам с проверкой условий -- с чем боролись, на то и напоролись. Просто вывернули big loop наизнанку. Нужен планировщик с O(1) сложностью алгоритма. Чтоб если у тебя 100500 задач, то нужная выбиралась fk0(84 знак., 17.11.2015 12:10)