Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/144: Рейтинг темы: голосов - 144, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 67

Решил написать RTОS для МК в академических целях.

08.09.2016, 00:03. Показов 27111. Ответов 80
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Думаю тут многие это делали, для разминки мозгов вещь вполне подходящая. Разработку решил вести поэтапно - от самой простейшей кооперативной (простая замена super loop), до более-менее вменяемой. Тему создал чтобы поспрашивать о тех или иных архитектурных решениях. Основная проблема заключается в том, что мне в голову лезет куча идей как реализовать тот или иной функционал. А так как это все затеяно ради научного интереса, то определенных целей у меня нет, и становиться очень сложно выбрать между той или иной реализацией. Вот тут то и нужен коллективный разум. Может вы подскажите какую-нибудь идею, которая не пришла мне в голову, или скажите, что-де вот эта идея самая лучшая а остальные полная ерунда.

Начать я хочу с вопроса управления памятью. Для задач, семафоров и всякой другой ерунды нужны управляющие структуры и их нужно где-то и как-то создавать. После отметания явно бредовых идей, у меня остались следующие варианты:

<ol style="list-style-type: decimal"><li>Самый тупой способ - сделать все управляющие структуры публичными и дать пользователю возможность создавать их статически. Не нравится, потому что грубо нарушает инкапсуляцию. Как то это нехорошо.</li><li>Чуть получше - заставить пользователя реализовать специальную функцию, которую ОС будет вызывать, когда ей нужна память, эдакий mallocHook(). Откуда будет браться память - это уж проблемы пользователя. Решение мне в принципе нравится, довольно гибкое, но для простейшей ОС сложноватое. Неохота заставлять пользователя реализовывать свой менеджер памяти, каким бы он простым ни был. Вроде FriiRTOS поддерживает этот способ.</li><li>Классический вариант - ОС сама статически выделяет пул объектов, количество которых задается дефайном. Решение простое, инкапсуляция соблюдается, лишних телодвижений не требует, но какое-то топорное. Не нравятся мне эти дефайны и не нравится заранее загадывать сколько и чего мне нужно. Знаю, что uC/OS II так работала.</li><li>Последнее решение - похоже на первое, но оно не так явно нарушает инкапсуляцию. Суть в том, что для каждой управляющей структуры, пользователю предоставляется её близнец-пустышка с размером и выравниванием соответствующим оригиналу. То есть пользователь создает пустышку не зная о её устройстве, а внутри ОС она уже приводится к реальному типу. Мне нравится это решение, не идеальное но вполне простое и надежное. Так же имеется во FriiRTOS</li></ol>
Что бы вы, как пользователи, выбрали? Может есть другие варианты?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.09.2016, 00:03
Ответы с готовыми решениями:

Решил написать программу для множества мальденброта, написал полностью программую
При компиляции пишутся такие ошибки: D:\project\mandelbrot\main.cpp|8|error: expected initializer before '*' token ...

Решил написать анонимайзер
привет. решил написать анонимайзер, но пока не знаю с чего начать. знаю что через курл или соксы, но конкретно как хз. прошу натолкните на...

Решил написать программку
Писал программу по угадыванию чисел,нашёл задание. Писал,писал и запоролся немного (т.к начинающий).Количество попыток угадывания,...

80
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
08.09.2016, 01:55
IMHO, пользователи бы выбрали не С++.
Меня уже колбасит от необходимости содержать и адаптировать софт только из-за одной rtos. Разрабы считают, что им удобнее было пару инструкций написать на С++, а проблемы пользователя - это не их проблема.
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
08.09.2016, 02:12
Сейчас ось пишут все кому не лень, даже у меня есть. http://forum.ixbt.com/topys.cgi?id=48:11735
На плюсах тоже есть готовая ось, ничего изобретать не требуется.
Посмотри как сделана https://www.segger.com , если-б код был полностью открытым - то эта ось могла-б стать стандартом в стане мк. Потому как имеет максимальное быстродействие на большом количестве одновременно активных!!! задач. Всякие FriiRTOS и чибиось - теряют в производительности после добавления второй активной задачи - ровно половину мощи мк, а если задач 100 - то система превращается в черепаху.

Кстати, на своей оси запускал 300 копий червяка, в результате частота кадров упала с 60 до 30, ну это так, к слову.
0
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 67
08.09.2016, 12:57
Цитата Сообщение от u37
IMHO, пользователи бы выбрали не С++.
Меня уже колбасит от необходимости содержать и адаптировать софт только из-за одной rtos. Разрабы считают, что им удобнее было пару инструкций написать на С++, а проблемы пользователя - это не их проблема.
А где я писал про С++? :}
0
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 67
08.09.2016, 13:11
Цитата Сообщение от OVY-srok
Всякие FriiRTOS и чибиось - теряют в производительности после добавления второй активной задачи - ровно половину мощи мк, а если задач 100 - то система превращается в черепаху.
Интересно почему? По идее не должна так сильно страдать производительность. Честно говоря мне не верится, что есть волшебная пилюля, которую использовали в этой embOS и она стала сто задач крутить без накладных расходов. Такого не бывает, значит у нее есть какие-то ограничения в чем-то другом. Контекст переключать надо? Надо. Чем больше задач тем больше переключений контекста и соответственно накладных расходов. Можно придумать какой-нибудь алгоритм планировщика, чтобы он пореже переключал задачи, но вот сразу и возникают ограничения. Он будет или очень долго работать, или будет не сразу переключаться. Бесплатно ничего не дается. Кому-то это может быть критично, кому-то нет.

Посмотри как сделана https://www.segger.com
Попытался скачать, но чтобы это сделать надо 9 кругов ада пройти, так что бросил это дело.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
08.09.2016, 14:20
Mimzodo, "Что бы вы, как пользователи, выбрали?"
0
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 67
08.09.2016, 14:40
Так я же сразу написал, что я не пользователь. Мне сейчас не нужна RTOS, соответственно каких-то требований я к ней предъявлять не могу. Мне хочется над этим поработать из чистого интереса, чтобы новый опыт получить, не более. Но вообще мне нравится последний вариант, потому что он относительно простой и надежный. Где действительно нужно постоянное создание/удаление задач я представить себе не могу, поэтому вариант с динамическим выделением памяти мне не очень по душе. Но это только мне, с моей :) "чисто академической" точки зрения так кажется. Возможно, если бы мне это понадобилось для каких-то реальных задач, я бы выбрал что-то другое.

Это знаете, как академические языки программирования, Haskell например. Он весь такой красивый, идеальный, основан на чистых математических принципах, но в реальной жизни используется какой-нибудь C++ где сплошные хаки и костыль на костыле. Я вот не хочу совсем уж отрываться от реальности и делать нечто абстрактное. Поэтому спрашиваю тут что да как, с какими трудностями сталкивались, что бы хотели, что не хотели. Так сказать использую чужой опыт и учусь на чужих ошибках. Если учиться на своих, то это понадобиться на всех возможных реальных задачах перебрать все возможные варианты реализаций, на что и жизни не хватит.

P.S. Так как вероятность сваливания данной темы в пространные разглагольствования в духе "зачем это тебе надо", "все и так уже есть", "а что бы ты сам выбрал" очень велика, то предлагаю все же не отклоняться от начальной цели. Я задал вполне конкретный технический вопрос, привел разные варианты решения, и хотел бы услышать в ответ конкретное мнение.
0
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
08.09.2016, 15:20
Цитата Сообщение от Mimzodo
Я задал вполне конкретный технический вопрос, привел разные варианты решения, и хотел бы услышать в ответ конкретное мнение.
Кроме перечисленных, есть еще один вариант: менеджить память "динамически" (чуть ниже я напишу, что имею в виду), но сделать один-единственный дефайн, который задает общий размер пула памяти. Для вычисления размера пула тоже можно предоставить макрос, в котором задавать сколько нужно задач, семафоров и так далее. Инкапсуляция при этом достаточно хороша, поскольку потроха вообще пользователю не видны, при этом остается возможность статически задать объем используемой памяти.
По поводу "динамического" распределения памяти: резервируется статический массив байт и делается указатель на начало. "Выделение" просто возвращает текущее значение указателя, а сам указатель инкрементируется на величину выделяемого блока. Поскольку освобождения при этом не предусматривается (да оно и не нужно, вобщем), то накладных расходов никаких, а скорость максимальна. При этом нет кучи макросов по всему коду и писать можно под достаточно комфортный режим как если бы динамическое выделение было на самом деле доступно.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
08.09.2016, 15:23
Прочитал "пожелания" и подумалось - может взять что-то готовое и творчески переработать? Скажем, несть неплохая (IMHO НЕ_плохая!) простенькая RTOS, которую удобно применять в обыденных задачах. Я говорю о scmRTOS. Вот если бы ее портировать на нормальный С, то это было бы не только "поучительно", но еще и полезно практически.
В любой программе есть мультитаскинг, вот только его реализуют на костылях. Небольшая простенькая RTOS на 2-3 потока без какого-либо "динамического выделения" - это то самое, что нужно. Да и ... самый юзабельный камень (IMHO) - STM32F030F4, ресурсов у него не так, чтоб мало (это на avr), но и не черезчур.
Короче говоря, мне было бы интересно что-то простое, без изысков, как scmRTOS, но и без всяких Cpp.
Для "больших" камней (F4 и выше) нужны другие RTOS и ... они уже есть. Проверенные и отлаженные. Оно уже мало кому надо. А вот "мелкое и пушистое" без большой ресурсоемкости, будет очень к месту.
Поэтому и предлагаю рассмотреть порт scmRTOS на человеческий язык.
0
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
08.09.2016, 16:57
Цитата Сообщение от u37
Короче говоря, мне было бы интересно что-то простое, без изысков, как scmRTOS, но и без всяких Cpp.
Что за ненависть к плюсам?
0
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
08.09.2016, 17:25
Цитата Сообщение от u37
Поэтому и предлагаю рассмотреть порт scmRTOS на человеческий язык.
Форт (Forth)? :)
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
08.09.2016, 17:33
Цитата Сообщение от KPK
Форт (Forth)? :)
Форт++...
0
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
08.09.2016, 17:46
Цитата Сообщение от KPK
Цитата Сообщение от u37
Поэтому и предлагаю рассмотреть порт scmRTOS на человеческий язык.
Форт (Forth)? :)

"язык порт рассмотреть"? в восторге мастер Йода будет :)
0
0 / 0 / 0
Регистрация: 07.04.2013
Сообщений: 461
08.09.2016, 18:37
Цитата Сообщение от ivsy
Цитата Сообщение от KPK
Цитата Сообщение от u37
Поэтому и предлагаю рассмотреть порт scmRTOS на человеческий язык.
Форт (Forth)? :)
"язык порт рассмотреть"? в восторге мастер Йода будет :)
Это лишь мыслительные придирки :)

P.S. To Dosikus_2: Forth++ ecть в в виде разных ООП расширений! (к сведению) :)
Навскидку:
Real Time Forth by Tim Hendttoss
pdf файл тоже есть. (наши учителя)
P.P.S. Evsi, не уподобляйтесь Dosikus_2, расширяйте кругозор.
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
08.09.2016, 19:45
Цитата Сообщение от Mimzodo
Цитата Сообщение от OVY-srok
Всякие FriiRTOS и чибиось - теряют в производительности после добавления второй активной задачи - ровно половину мощи мк, а если задач 100 - то система превращается в черепаху.
Интересно почему? По идее не должна так сильно страдать производительность. Честно говоря мне не верится, что есть волшебная пилюля, которую использовали в этой embOS и она стала сто задач крутить без накладных расходов. Такого не бывает, значит у нее есть какие-то ограничения в чем-то другом.

Ну для начала нужно всё-таки понять - как разные ос переключают контекст.
Всякие FriiRTOS и чибиось отдают задаче стандартное время 1мс. Есно самому переключателю глубоко пофиг на то что происходит в задаче всё это время. Там вполне может работать циклический опрос бита готовности какой-либо периферии, или нечто подобное - простое и тупое. Все задачи в таких ос являются бесконечными циклами - большими или маленькими. Если большой цикл может не успеть выполнить свой полностью за 1мс - то ничего страшного, потом успеет. А вот с малыми циклами - проблема. Получается тупой нагрев кристалла бесполезным числодроблением.

https://www.segger.com - даёт каждой задаче разное время - аналог приоритета. Время может быть от 1мкс до 1мс, когда время выйдет -задача переключится автоматически. Если в самой задаче стоит команда "шев, усё готово" - то ос сама переключает контекст, и не через диспетчер задач - а моментально.
Можно писать тупой опрос периферии, и в случае промаха - отдавать процессорное время. Получается гораздо быстрее чем через диспетчер задач, очередь сообщений, прерывания и так далее..., от слова - мгновенно.
Есно самая жирная задача, которая действительно выполняет полезную работу - будет иметь полное время 1мс (равное 100%), но вот 99 других не столь сложных и не столь актуальных на данный момент - будут работать суммарно 1-10мкс. Время на переключение никуда не денется, но сами потери не столь высоки.

Есно всё это касается активных задач. Но саму задачу можно отправить спать, поставить на ожидание флага, или даже убить - чтобы потом запустить заново.
Ещё один бонус - задача не обязательно должна содержать бесконечный цикл. :) Если сама задача медленная и одноразовая - то без цикла она будет выполняться до последней строчки, а после убьёться об стену, и хвосты за собой почистит. Одноразовая задача может запустить множество задач, подготовить для них общие буферы и структуры связи, передать адреса и явки в запущенные задачи, и есно самоубиться об стену - очень удобно.

Насчёт явного впечатывания задач в систему. При сомнительной экономии в 1к кода - получаем огромную головную боль. Головняк заключается в том что стеки задач, адреса переменных, адреса самих задач, а так-же их нативность - всё это придётся считать вручную. Писать тонны дифлайнов - которые будут ссылаться на другие дифлайны. И как результат - через месяц проект выглядит как послание инопланетян. Всё это реализовано в FriiRTOS и чибиось в полном объеме. Отчего запуск двух тасков - уже событие мирового масштаба.

Наличие в ос железного уровня поддержки периферии чипа - не обязательно, и даже вредно. Сама ось должна быть устроенна так -чтобы можно было запустить абсолютно любой корректный код для данного чипа. Что в FriiRTOS просто невозможно. Вот нет там поддержки нужной тебе фигулины - война. У вас не получится вставить свой драйвер в эту ось, чисто физически. В качестве внешней промочки в виде отдельной задачи - да.

Почти все ключевые задумки segger - реализованы в моей ос http://forum.ixbt.com/topys.cgi?id=48:11735 . Там есть пробелы, но мне уже лень.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
08.09.2016, 19:52
Цитата Сообщение от KPK
P.S. To Dosikus_2: Forth++ ecть в в виде разных ООП расширений! (к сведению) :)
Навскидку:
Real Time Forth by Tim Hendttoss
pdf файл тоже есть. (наши учителя)
P.P.S. Evsi, не уподобляйтесь Dosikus_2, расширяйте кругозор.
Ох довели фортиста, везде ему под***ки видятся. :)))))))
Ну тогда форт--...
А по теме и С с крестами и форты в эмбедде путь в никуда...
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
08.09.2016, 21:03
Цитата Сообщение от OVY-srok
А вот с малыми циклами - проблема. Получается тупой нагрев кристалла бесполезным числодроблением.
не нагрев тупой, а использование оси тупое. когда юзаешь ос - не должно быть таких "тупых нагревов присталла".
0
0 / 0 / 0
Регистрация: 11.06.2010
Сообщений: 351
08.09.2016, 21:14
Цитата Сообщение от OVY-srok
Ну для начала нужно всё-таки понять - как разные ос переключают контекст.
Всякие FriiRTOS и чибиось ...
Недавно начал использовать FriiRTOS, ничего из сказанного вами там не обнаружил.
0
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 67
08.09.2016, 21:59
Цитата Сообщение от OVY-srok
А вот с малыми циклами - проблема. Получается тупой нагрев кристалла бесполезным числодроблением.
Такого быть не должно. Задача должна проверить свой флаг (или что она там проверяет), и если ей нечего делать - вызвать delay() или yield(), чтобы отдать время другим. А если не отдаст, значит её насильно вытеснят, но только более приоритетные задачи. Вот более низкоприоритетные она действительно заставит голодать. Если не будет вызывать yield().

Цитата Сообщение от OVY-srok
даёт каждой задаче разное время - аналог приоритета
Да, всякие есть варианты планирования задач. Такого можно напридумывать! Но я бы не сказал, что один способ лучше другого, для каждой ситуации свой подходит.

Цитата Сообщение от u37
Небольшая простенькая RTOS на 2-3 потока без какого-либо "динамического выделения" - это то самое, что нужно.
Кстати uC/OS II именно такая.

Цитата Сообщение от u37
без какого-либо "динамического выделения" - это то самое, что нужно... Короче говоря, мне было бы интересно что-то простое, без изысков, как scmRTOS, но и без всяких Cpp.
Вот тут я поддерживаю. Все эти FriiRTOS довольно пухлые, и дальше будут только пухлеть.

Цитата Сообщение от ivsy
По поводу "динамического" распределения памяти: резервируется статический массив байт и делается указатель на начало. "Выделение" просто возвращает текущее значение указателя, а сам указатель инкрементируется на величину выделяемого блока. Поскольку освобождения при этом не предусматривается (да оно и не нужно, вобщем), то накладных расходов никаких, а скорость максимальна. При этом нет кучи макросов по всему коду и писать можно под достаточно комфортный режим как если бы динамическое выделение было на самом деле доступно.
Да, был такой вариант, но я его отмел в пользу варианта номер 2, где я дергаю пользовательскую функцию, а он уж там может сам реализовать такой буфер и выдавать мне из него память сколько я запрошу. Мне кажется это не намного сложнее будет, но значительно гибче, потому что дает пользователю выбор, как именно реализовать выделение памяти.
0
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
08.09.2016, 23:12
Цитата Сообщение от Mimzodo
Да, был такой вариант, но я его отмел в пользу варианта номер 2, где я дергаю пользовательскую функцию, а он уж там может сам реализовать такой буфер и выдавать мне из него память сколько я запрошу. Мне кажется это не намного сложнее будет, но значительно гибче, потому что дает пользователю выбор, как именно реализовать выделение памяти.
Во FriiRTOS примерно так и сделано: метод выделение памяти отдан на выбор пользователя. А пользователь уже сам может выбрать один из нескольких вариантов, предложенных ОС, либо написать свой. Там и статичный массив, из которого только выделяется память, там и самодельные менеджеры памяти, и библиотечный malloc, и что-то еще.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.09.2016, 23:12
Помогаю со студенческими работами здесь

Вот решил написать
Долгое время читал этот форму тихо и молча. Набирался опыта, смотрел как старышие спорят. Вот решил написать. А написать решил потому...

Мышь беспроводная Logitech для пк, в рабочих целях
В обще нацелен был на Logitech Marathon Mouse M705 Black USB,но всётаки продукту лет 8 если не больше,хоть его и можно на рынке найти и...

Решил написать сапера - неясности
Только недавно начал изучать C# и захотелось мне написать игру сапер. Решил сначала написать консольную версию, в которой просто цифрами...

Расчет академических часов
Доброго времени суток, знатоки. Будьте добры, подсобите, как сделать что бы эксель воспринимал итоговое значение не как 0:45 , а как 1:00?

Инструменты для анализа кода в целях поиска узких мест
Есть ли подобные инструменты? Что бы можно было написать код, потом скормить его определенной программе и что бы эта программа давала...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru