|
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 67
|
|
Решил написать RTОS для МК в академических целях.08.09.2016, 00:03. Показов 27709. Ответов 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
Регистрация: 18.03.2010
Сообщений: 2,230
|
||||||
| 10.09.2016, 16:29 | ||||||
встраиваемая ос всего лишь упрощает написание некоторого вида программ, не более того. она и не должна быть универсальной или совместимой. вас же не смущает, что она не умеет загружать бинарники как задачи и запускать (как это делают взрослые ос)? так и удаление - не всегда оно обязательно, полюбому можно обойтись без него, чуть иначе построив программу. ну а если очень надо такие костыли - сделал небольшую обертку и хромай скока хошь.
на счет памяти, нужно понимать, что если речь идет о флеше, так он будет занят одинаковым кодом в любом из случаев. если об озу, так когда вы запускаете доп. задачу, она динамически на время работы выделяет себе память. то же может делать и подпрограмма, приблизительно в тех же кол-вах, а то и меньше. если параллельность не нужна (а по вашим словам это именно так), не нужны и отдельные задачи. если параллельность типа нужна, то где гарантия, что не запустятся все задачи одновременно? (а так им не хватит памяти) опять все ваши проблемы сводятся к дизайну структуры проекта.
0
|
||||||
|
0 / 0 / 0
Регистрация: 20.01.2011
Сообщений: 157
|
||||
| 10.09.2016, 16:46 | ||||
Навскидку xQueueSendToBack(), xQueueSendToBackFromISR() Делают одно и то же, но задача пользователя разруливать состояние. Раньше такого там было много, сейчас не скажу, может что то пофиксили. Это должно быть проблемой операционки. А тут так старательно разложены грабли. Так же как и завершение работы задачи по фигурной скобке.
Если вы с самого начала пишете legacy код, то вопросов нет. А совместимость нужна чтобы в дальнейшем использовать написанные программные модули без использования бубна. И при чем здесь юникс? Вы выросли как специалист или перешли на другой проект где по требования стоит например uOS. И все, ваши модули туда не подключишь так просто. Или проект free rtos забросили и встал вопрос миграции.
ОС должна решать задачи организации работы программных модулей и зависимость от нее должна быть минимальной.
0
|
||||
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
|
|||
| 10.09.2016, 17:58 | |||
Кстати, насчёт 15 задач для муз центра, исключительно физика: 0 общий менеджер ресурсов энергосбережения, он-же общий менеджер состояния нигнитолы. 1 драйвер физики экрана 2 экранный менеджер слоёв "видео", он-же общий рисовальщик интерфейса, отрисовка по поступающим командам от других тасков. 3 нечто типа прямого доступа к экранной области, полуаппаратное решение, аналог draw режима на современных видеокартах. 4 драйвер флеш носителей, разных чипов и размера. 5 физ драйвер радио, полуаппаратное решение. 6 физ драйвер чипа приёмника телевидения, сразу нескольких стандартов, а так-же аналоговых камер заднего вида. 7 физ драйвер проводного ентернета, для цифровых камер заднего вида и как вариант - регистратора. 8 физ драйвер блюпупа, полуаппаратное решение. 9 физ драйвер вайвая, полуаппаратное решение. 10 физ драйвер спутниковых чипов навигации, и всё что с ними связанно. 11 физ драйвер сотовой связи, и не спрашивайте зачем. 12 драйвер внешней периферии нигнитолы, а так-же менеджер сообщений от многочисленных датчиков, начиная от банального стопсигналла, заканчивая прямым подключением к бортовому компу. Ну там голосом человеческим сообщить через колонки - типа масла/бензина/омывайки мало, или явная неисправность не кодом ошибки - а человеческим голосом. 13 есно голосовой синтезатор, как вариант - плеер готовых сообщений. 14 полуаппаратный драйвер звука, с эквалайзером, эффектами, и плюшками. 15 полуаппаратный драйвер вывода цифрового звука на крутые внешние усилители, чтоб бумкало. Можно придумать ещё несколько отдельных задач под физику, но для средней нигнитолы - это уже перебор. Далее полностью программный уровень: 0 отдельный фоновый таск микшера звука. 1 отдельный таск декодеров разных форматов сжатия музыки и видео. 2 отдельный таск сжатия видео и звука. 3 отдельный "графический" визуальный таск менеджера музыкальных и видео файлов, с поддержкой создания, переименования, удаления, и группировкой в плейлисты. 4 таск для работы с навигацией - отображение, поиск маршрута, подсчёт экономии бензина и прочие плюшки. И так далее, ещё штук 20 задач - которых нет смысла запускать одновременно. Самое прикольное - это всё есть в стандартной двухдимовой китайской нигнитоле стоимостью в 15к, в которой в качестве центрального чипа стоит мк фирмы st. Это конечно отличается от стандартных примеров из интернета, где средний уровень заканчивается морганием светика.
0
|
|||
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
|
||
| 10.09.2016, 18:05 | ||
Если у вас будет отдельный проект собственной ос - будет интересно взглянуть на код.
0
|
||
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
|||||||
| 10.09.2016, 19:50 | |||||||
про завершение задачи по выходу из функции - соглашусь, странно, что этого нет. но это не должно быть большой проблемой. эта проблема указывает скорее всего на косяки в дизайне проекта.
если вы в курсе про HAL, откуда же у вас проблемы с миграцией на другую (но похожую!) ось? если эти ваши модули грамотно отделены друг от друга, от железа, от оси - они легко переделаются под другую платформу. это называется кроссплатформенность и она уж никаким боком не относится к оси. тот проект, который я в 2008м мутил на фриртос под арм, он у меня легко собирался под винду в мсвс, ибо там было куда проще отлаживать. там работали и lwip, и efsl, и еще несколько разных штук задач. просто потому, что код был написан так, что он легко переносился. в железе у меня была и работа с таймерами, с уарт, спи, кучи разного другого железа, но проблемы запустить это под виндой - не было (думаю, ясно, что аппаратная часть была полностью заэмулирована, но основной код задач был без изменений). если у вас проблемы с этим - не перекладывайте ответственность на ось, разберитесь, что именно вы делаете не так. а юникс здесь был при том, что вы либо сравниваете разного масштаба системы (все мы знаем что запускать 100500 ПРОЦЕССОВ и связывать их пайпами - нормальный такой юникс-вэй), либо... неправильно проектируете свой софт, раз проблема мигрировать.
OVY-srok писал(а):
0
|
|||||||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
|
|
| 10.09.2016, 20:05 | |
|
Наверное инициатор топика уже давно всё написал и толку в дискуссиях этих == 0.
0
|
|
|
0 / 0 / 0
Регистрация: 20.01.2011
Сообщений: 157
|
||||||
| 10.09.2016, 20:25 | ||||||
Кого волнует гемор кодера free rtos? А так сейчас гемор для кодера который пользуется ОС. Ну да, пришлось бы функции выяснять откуда она вызвана и применять правильный метод. Добавился бы платформозависимый кусочек.
про завершение задачи по выходу из функции - соглашусь, странно, что этого нет. но это не должно быть большой проблемой. эта проблема указывает скорее всего на косяки в дизайне проекта. Так откуда возмется такое количество оберток? Кроме того, единый вызов отвечает таки правилам хорошего кода и убирает кучу оберток со стороны программиста. И кучу граблей. Собственно это все косяки. Возможны сначала это все были костыли. Потом остались и выросли в грабли.
эти ваши модные словечки... за деревьями не видите леса;) Да ладно? А зачем я тогда так подробно объяснял раз вы не читаете? И что Вы называете модными словечками? Ymk"]если вы в курсе про HAL, откуда же у вас проблемы с миграцией на другую (но похожую!) ось? если эти ваши модули грамотно отделены друг от друга, от железа, от оси - они легко переделаются под другую платформу. это называется кроссплатформенность и она уж никаким боком не относится к оси.[/QUOTE] Ну тогда зачем вы их смешали? Я специально привел два интерфейса разделения - один от железа, другой от ОС. А проблемы с миграцией возникают как раз таки из-за непродуманности. Работало все в нормальной ОС. Мигрируем например на Frii RTOS. Цепляем код. Опа, проблемы. Трудноуловимые. Читаем мануал, оказывается теперь надо отловить вызовы функций ОС и заменить, потому что они зависят от ого откуда вызываются. Ладно, заменили. Проект не работает. Опа, и завершение по скобке нельзя. Таак, сколько там еще граблей... Это Вы называете легкой миграцией? Нормальная миграция - вызовы функций ОС осуществляются одинаково, в крайнем случае подмена дефайнами. Действия разрешенные спецификацией языка не должны приводить к проблемам. Как понятно из описания Frii Rtos, это все не про нее. Возможно кто то применяет для совсем простых задач ОСРВ, генерит код кодогенератором, ставит драйвера на светодиод. Но реально в большинстве задач эмбедда ОСРВ избыточна. Ymk"]если у вас проблемы с этим - не перекладывайте ответственность на ось, разберитесь, что именно вы делаете не так.[/QUOTE] У меня нет проблем. Но использовать сырую ОС с некультурно оформленным интерфейсом. Повышать уровень сцепления модулей с ОС. Это глупо. Ymk писал(а):
Ymk писал(а):
Читать не пробовали? Повторю - разные вызовы одних по сути действий в зависимости от контекста, действия нормальные для языка, запрещены в ОС. Ymk писал(а): работа с железом и обработчики прерываний - это абсолютно аппаратные вещи, всегда разные на разных платформах. апи у всех осей тоже разное (имена функций, параметры и все такое). вы заранее это знаете и иначе не будет. изолируйтесь от этого и проблем с миграцией не возникнет. а суть шедулеров и примитивов синхронизации - одна. Кэп?
0
|
||||||
|
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
|
||
| 10.09.2016, 20:53 | ||
ИМХО правильно, что функции разные для контекста тасков и прерываний, так как в любом случае нужно понимать в каком контексте ты находишься. Более того многие вызовы ОС нельзя вызывать из контекста прерывания, например delay. И обертка над прерыванием уже не поможет, и даже если функция сможет выяснять откуда она вызывается (а она это делает и контролирует ossirtом), это уже будет ошибка на уровне проектирования.
0
|
||
|
0 / 0 / 0
Регистрация: 20.01.2011
Сообщений: 157
|
||
| 10.09.2016, 21:16 | ||
Насчет понимания контекста - в большинстве случаев да, но как понимание скажется на том что один обработчик должен вызываться в разных условиях? Ах, ну да переключатели ставить. Другие ОС справляются.
0
|
||
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
|
||
| 10.09.2016, 21:24 | ||
Эти функции как вы говорите, имеют жёсткую привязку к времени исполнения. Почти все подобные задачи работают с относительно медленными интерфейсами. Задача подобных тасков - собрать информацию и передать по назначению дальше на обработку. Потому как собирать и обрабатывать по частям, каждый раз запуская достаточно жирный процесс - просто не выгодно. Что-то в системе выполняется мгновенно, а что-то медленно, но сам мк должен работать на максимальной скорости, а всё остальное время просто спать. У вас получается что весь девайс должен ждать ответа от одного мелкого контролёра физики, просто ждать и ничего не делать при этом. Как в винде95 при форматировании флопика :) . При таком подходе использовать ос не обязательно, достаточно шейкера задач на банальном switch.
0
|
||
|
0 / 0 / 0
Регистрация: 11.06.2010
Сообщений: 351
|
|||
| 10.09.2016, 21:50 | |||
Нет, я даже не заметил где оно там есть. Странные, какие-то необоснованно резкие у вас претензии к freertos.
0
|
|||
|
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
|
||||
| 10.09.2016, 23:05 | ||||
0
|
||||
|
0 / 0 / 0
Регистрация: 20.01.2011
Сообщений: 157
|
|||
| 10.09.2016, 23:31 | |||
Думаю мы говорим об одном и том же. Тем более что в free RTOS и так есть функции которые не должны вызываться в определенных условиях. Никто не мешает на этапе компиляции возвращать ошибку. Но компилятор сам не проверит корректность вызова ОС, тем более не может учесть некоторые важные ситуации. Да и ассертов на все не наставишь, хотя нужно охватить основные проблемы. Проверять корректность после вызова все равно надо. А если ОС вернула отказ по каким то другим причинам? В большинстве ОС такие ситуации есть, и они не ломаются, а просто не делают то что нельзя и возвращают ошибку. А может просто ситуация поменялась и ОС сама не готова.
Правильное решение - каждый делает то что должен по логике разделения обязанностей. ОС отрабатывает свои внутренние процессы не вываливая их на пользователя. Возвращает результат действия. Пользователь занят прикладной задачей. При адекватном интерфейсе все прозрачно и не надо гадать где там грабли заботливо разложены, может и что опасней забыто. В пример приведу код FatFS от Элм Чана. Описан интерфейс, который нужно обеспечить. Там всего то запись, чтение, получение необходимой информации. Очень корректно разделены интерфейсы. Я понимаю что все правила хорошего кода чисто рекомендательные. Но многие из них вполне обоснованны.
0
|
|||
|
0 / 0 / 0
Регистрация: 18.09.2014
Сообщений: 67
|
|
| 11.09.2016, 16:38 | |
|
А вот расскажите мне за разрешение/запрет прерываний, они же критические секции. Часто вижу, что при запрете прерываний (входе в критическую секцию) сохраняется текущее состояние запрета, а соответственно при разрешении прерываний (выходе из критической секции) данное состояние восстанавливается. Это вместо того, что бы просто запретить/разрешить. У меня возникло два объяснения данному поведению.
Первое. Это нужно для того, чтобы можно было делать вложенные запреты/разрешения прерываний. По мне, использовать вложенные запреты - весьма сомнительное решение. Критические секции должны быть максимально короткими и строго ограниченными, а не размазываться по всему коду. Существует ли какая-нибудь ситуация, при которой без вложенных критических секций не обойтись? Второе. Это нужно потому, что некоторые процессоры не имеют глобального флага запрета прерываний. Возможно, пользователь до этого запретил какие-нибудь отдельные прерывания. Если мы будем не глядя сбрасывать все флаги а потом их все устанавливать, то можем нечаянно разрешить лишние прерывания, которые пользователь ранее запретил. Не знаю есть ли такие процессоры, очень сомневаюсь что есть. Я это все к чему? Реализовывать поддержку вложенных критических секций несколько сложнее, работают они чуть медленнее, использовать их не так удобно (нужно каждый раз объявлять переменную, в которой будет храниться текущее состояние). Стоят ли они того? Я считаю, что нет, но что вы думаете?
0
|
|
|
0 / 0 / 0
Регистрация: 11.06.2010
Сообщений: 351
|
|
| 11.09.2016, 17:29 | |
|
Мне нравится идея отказа от явного запрета прерываний. Вместо этого, отправляем в некую очередь сообщение и вызываем прерывание. А в прерывании уже делается вся обработка. И вот так все вызовы к ОС. Очередь должна быть способна корректно принимать сообщения отправленные асинхронно из разных задач и прерываний, не блокируя их выполнение. Реализация такой очереди не слишком проста. Еще возможно, контекст переключать не очень удобно, находясь уже в прерывании. Но думаю решение есть.
Если назначаем приоритет прерывания-обработчика выше остальных прерываний, то эквивалент критическим секциям. Запросы обрабатываются немедленно и все ждут. Если наоборот, остальные прерывания выше, то не имеем задержки т.к. никогда не запрещаем их. Но при вызове ОС из таких прерываний, запрос выполняется позже. То есть, можно делать вызовы ОС из прерывания выше приоритетом, чем ОС. Оба случая обрабатываются одним механизмом, разница лишь в назначении приоритетов.
0
|
|
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
||||||||
| 11.09.2016, 20:03 | ||||||||
OVY-srok писал(а):
Mikomk писал(а):
0
|
||||||||
|
0 / 0 / 0
Регистрация: 20.01.2011
Сообщений: 157
|
||
| 11.09.2016, 20:41 | ||
На остальное смысла отвечать не вижу, там сплошные наезды.
0
|
||
|
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
|
|||
| 11.09.2016, 21:38 | |||
У меня получилось немного проще. В случае когда одно прерывание может быть полезным, либо необходимым для разных тасков, есно в разное время. Когда прерывание применяется только для одного таска - такие танцы с бубном избыточны. Но например для дма просто нет альтернативы. Две структуры: первая набор функций, вторая - набор управляющего кода для отдельных прерываний. В случае когда ресурс периферии свободен, таск его захватывает, после сам размещает набор управляющего кода во вторую структуру, что-то там запускает и уходит в ожидание пинка от прерывания. Там может быть один сегмент, а может и целая цепочка действий. Важно что в случае цепочки - перезапуск аппаратной периферии происходит практически мгновенно с точки зрения ос. А возврат управления таску - не заметно для остальных тасков, в смысле без запретов прерываний и ожиданий очередей в сотни мс. Словом - в момент самого прерывания, фактически мгновенно. Есно если текущему таску данная периферия дальше не нужна - то её нужно освободить. Исполнение критических секций, типа когда самому важному коду не хватает времени на исполнение - просто добавь ему процентов времени, а после исполнения - забери. Так легко и просто повышается приоритет в ос типа сеггер, без насилования всего и вся. Mikomk - Я сначала тоже боялся свою ос выставить на общее обозрение, по тем-же причинам - не доделана, куча ошибок, страшный код, а вдруг украдут... и так далее. Но выяснилось что не только мой код, но и код почти всех начинающих писателей собственных ос - никому нафиг не нужен. Война идёт за то что можно получить деньги, честным или чаще всего обманным путём. И кстати как выяснилось - у некоторых ещё страшнее ошибки, подобным которых мне удалось избежать исключительно чужим опытом.
А у вас?
0
|
|||
|
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
|
|
| 11.09.2016, 23:26 | |
|
Однажды одна компания забахала урезанную, но зато сертифицированную freertos в rom, в смысле не просто в бинарник, а намертво в мк, cortex-m3 кстати.
Ни компании, ни мк уже нет, я думал, что и мануал затерялся, но оказалось не затерялся - http://www.ti.com/lit/ug/spmu040a/spmu040a.pdf Как вам такая идея - "rtos" в отдельном готовом к употреблению бинарнике?
0
|
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
|
|
| 12.09.2016, 00:17 | |
|
Не плохое описание.
В принципе если freertos запихать в system flash - ничего плохого не будет. Не хочешь - не пользуйся. Но если использовать - часть флэша освободится. Процесоор точно известен - так с настройками проблем нет.
0
|
|
| 12.09.2016, 00:17 | |
|
Вот решил написать Мышь беспроводная Logitech для пк, в рабочих целях Решил написать сапера - неясности Расчет академических часов Инструменты для анализа кода в целях поиска узких мест Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный домашний кинотеатр
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.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|