|
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 67
|
|
Решил написать RTОS для МК в академических целях.08.09.2016, 00:03. Показов 27748. Ответов 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
|
|
| 08.09.2016, 00:03 | |
|
Ответы с готовыми решениями:
80
Решил написать программу для множества мальденброта, написал полностью программую Решил написать анонимайзер Решил написать программку |
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
|
|
| 08.09.2016, 23:40 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
|
|||
| 09.09.2016, 00:09 | |||
Всё верно, но сама суть операции упущена. Задача при проверке своего флага будет работать отпущенное ей время, равное 1мс. Перевод задачи в режим сна может произойти исключительно через диспетчер, который будет запущен либо сразу после этой задачи, либо в самом конце общей цепочки активных задач. А все активные задачи кушают ровно 1мс, и всё это множится на их количество. Добавлю что все прерывания в обёртках, смысл их срабатывания появляется после обработки диспетчером задач. Что есно не добавляет быстродействия. Вытеснение может произойти после запуска диспетчера задач, который есть суть отдельной задачи с временем работы в 1мс. Моментальное и безусловное переключение контекста выполняется тупым переключателем, который просто сохраняет стек активной загружает стек следующей задачи. Тупой переключатель работает совместно с функцией задержки, которой собственно и нужны те самые интервалы в 1мс. И кстати - там реально накапливается ошибка. То-есть, если не обращать внимание на скорость реакции - вытесняющая ос вполне быстрая, но назвать её осью реального времени уже нельзя.
Если тестируется только одна ось - то в целом сравнивать быстродействие нечем, полученный результат является единственным и окончательным.
0
|
|||
|
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 67
|
||
| 09.09.2016, 00:51 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
|
| 09.09.2016, 03:31 | |
|
OVY-srok, вот я читаю и чет не понимаю. программирование под ос - это немного не так, как без ос. там не должны опрашиваться флаги в цикле, задача не должна запускаться, если ей нечего делать. для этого придуманы всякие там семафоры и прочее. все эти циклы с делеями - жрут ресурсы за зря и "делают ос не реального времени". просто не надо говнокодить и не будет проблем.
в той же фриртос, емнип (а я ее последний раз активно юзал аж 8 лет назад), не было проблем с реакцией на события и числодроблением. скажем есть прерывание по внешнему событию, отдельному таймеру или хз чему, оно работает как обычное прерывание мк, никак не связанное с ос. и если нужно по нему очень срочно запустить какую-то задачу - просто прям из программы прерывания отпускается семафор. всё. при выходе из прерывания произойдет передиспетчеризация и запустится тот "срочный" поток, который висел ждал семафора (при условии более высокого приоритета, конечно). все это за известное время, никак не привязанное к 1мс.
0
|
|
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 09.09.2016, 06:59 | ||
Так что вы там говорили насчет кругозора?
0
|
||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 09.09.2016, 07:03 | ||
0
|
||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
|||
| 09.09.2016, 07:06 | |||
0
|
|||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 09.09.2016, 07:18 | ||
0
|
||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 09.09.2016, 07:23 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
|
|||
| 09.09.2016, 09:52 | |||
0
|
|||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 09.09.2016, 12:46 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
|
|||
| 09.09.2016, 22:47 | |||
Насчёт правильного программирования - да без проблем. Например разовая передача данных по физике: Запускается задача, ей в параметрах передаётся адрес буфера, задача опрашивает занятость периферии, если не свободно - впадает в ожидание, либо сразу настраивает периферию (когда в первый раз). Потом резервирует канал дма и настраивает под конкретную передачу, пинает его, и уходит в ожидание пинка от дма. По окончанию рапортует в структуру связи, и если там не установлен флаг конвейера - то освобождает канал дма и полностью самоубивается из системы. Подобная связь по физике не требуется каждую секунду. Возможно что за всё время от включения мк до выключения - такая задача не потребуется вовсе. Сложно? Однако в FriiRTOS и ChibiOS будет затык уже на стадии резервации канала дма, там подобной функции просто нет. Держать подобную задачу в неактивном запущенном состоянии - просто не выгодно, так-же как и выделять под эту задачу память стека и данных. И главное, подобных задач может быть сотни, не все работают с физикой, не всем требуется дма - но каждая так или иначе имеет зависимости от основного алгоритма. Это означает что выкинуть их нельзя - потеряется функционал девайса. Задачи которые должны что-то успеть посчитать к определённому моменту времени. Можно конечно всё свалить в один громадный конвейер, но это уже получится собственная ос внутри оси. Можно сделать попытку поднять приоритет в FriiRTOS и ChibiOS, но тогда основной алгоритм вообще никогда не будет запущен. Можно сделать всё в прерывании, и потерять математику. Вариантов очень много, самый щадящий - использование разного рабочего времени цикла активности задачи. Повторюсь, когда задач две-три - FriiRTOS и ChibiOS более чем подходит. Но когда количество задач переваливает за сотню - ос уровня segger единственный вариант. Сотня разных задач легко набирается в проекте музыкального центра. Просто потому что алгоритмы там разные, и все хотят памяти, и одновременно не могут быть запущены.
У меня это на асме в открытом виде. В segger в закрытом виде в готовом бинарнике - который необходимо подключать к своему проекту. В ChibiOS это в открытом виде, но найти у вас не получится, даже в режиме отладки этот код на дифлайнах на отображается в отладчике. Так-что если не знать где копать - можно и не найти. В FriiRTOS тоже вроде как открыто, и даже можно конкретно указать на нужные файлы. Но вот какой из кусков кода под дебрями дифлайнов будет исполняться, а какой будет пропущен - узнать можно только под отладкой. Ну и в качестве учебника по созданию собственной ос на асме - http://badymbid.ru/assembler-p... konteksta/ Ос на чистом С, учебный вариант http://chipenable.ru/index.php/programm ... schik.html Ещё немного по ос, общего плана http://www.pvsm.ru/c-3/52568
0
|
|||
|
0 / 0 / 0
Регистрация: 14.07.2011
Сообщений: 96
|
||
| 09.09.2016, 23:27 | ||
Вот, нашел с трудом (за минуту) https://github.com/scmrtos/scmrtos/btob ... _asm.s#L79
0
|
||
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
|
||
| 09.09.2016, 23:59 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
|||
| 10.09.2016, 03:54 | |||
и если они не могут быть запущены одновременно - почему всё это отдельные задачи?
0
|
|||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 10.09.2016, 08:51 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 20.01.2011
Сообщений: 157
|
||
| 10.09.2016, 09:47 | ||
Там и кроме костылей проблем куча. Например FriiRtos. Не знаю как сейчас, но раньше были разные вызовы для, по сути, одного и того же. противотанковая мина для проекта. Почему программист должен заниматся разруливанием состояния ОС? Что, нельзя сделать это внутри? Ах да, тогда надо больше платформозависимого кода. Задача не может сама завершится. Все, с этого момента мы уже несовместимы с многими ОС. Значит код уникальный, либо костыли. И еще много таких требований. Которые делают невозможной миграцию на эту ось и с нее. В идеале задачи вообще не должны зависеть от оси, только вызовы которые либо стандартны либо легко переопределяются. Ах да, инкапсуляция и слабое сцепление, нет не слышали. И да, они таки додумались до сопрограмм. Правда в их реализации это копрограммы.
0
|
||
|
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 924
|
||
| 10.09.2016, 14:06 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 20.01.2011
Сообщений: 157
|
||
| 10.09.2016, 15:42 | ||
Если их так реализовали, то это чья проблема?
0
|
||
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
|
|||
| 10.09.2016, 16:11 | |||
Для маленьких ос те-же проблемы, нехватка памяти и эксклюзивная реконфигурация имеющийся памяти под текущую задачу.
Запуск одноразовой задачи, которая должна выполниться параллельно текущему процессу, и уничтожится после - это не тоже самое что вызов подпрограммы. Написание и использование собственного менеджера дма под ос типа FriiRTOS и ChibiOS - невозможно по простой причине, сами ос юзают дма своими встроенными драйверами периферии, бесконтрольно.
0
|
|||
| 10.09.2016, 16:11 | |
|
Вот решил написать Мышь беспроводная Logitech для пк, в рабочих целях Решил написать сапера - неясности Расчет академических часов Инструменты для анализа кода в целях поиска узких мест Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|