Тёмный

Операционная система FreeRTOS. Самый полный курс на русском языке. Часть 5. Управление памятью. 

Vladimir Medintsev
Подписаться 37 тыс.
Просмотров 10 тыс.
50% 1

Полный курс по операционной системе FreeRTOS. Часть 5.
Тема: Управление памятью. Схемы работы с памятью.
По вопросам сотрудничества - vmedintsev@yandex.ru
Канал в телеграмм - t.me/vladimir_...
Канал на RU-vid - / vladimirmedintsev
------------------------------------------
Если вы хотите поддержать автора канала номер карты Сбер:
2202-2023-2480-4008
------------------------------------------

Опубликовано:

 

7 окт 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 70   
@anatoliyxxanatoliyxx1467
@anatoliyxxanatoliyxx1467 Год назад
От всей души спасибо Вам за уроки . Очень много зависит от учителя который может понятно донести информацию ученикам. С уважением благодарствую !11
@АндрейСафонников
Очень познавательное видео, закрывающее кучу вопросов по распределению памяти!
@offset_frequency
@offset_frequency Год назад
Будьте здоровы!!! Отличное видео, всё на свои места расставляет
@VladimirMedintsev
@VladimirMedintsev Год назад
Спасибо.
@BigXil
@BigXil Год назад
Очень круто что я нашел этот курс) Параллельно смотрю лекции по теории операционных систем, получается отличное сочетание теории и наглядной практики.
@dmitriimalakhov2995
@dmitriimalakhov2995 Год назад
Здравствуйте! Что за лекции, если не секрет?
@ЛюбомирБезган
@ЛюбомирБезган Год назад
Будьте здоровы! Спасибо за видео!
@sergatmel8242
@sergatmel8242 Год назад
Спасибо !
@dmitriicharuiskii
@dmitriicharuiskii 4 месяца назад
Спасибо за видео!!!!
@Ololoshize
@Ololoshize Год назад
Ещё не смотрел, но лайк и комментарий в поддержку написал.
@serggorod1423
@serggorod1423 Год назад
Жду подробного разбора HEAP_5... Да да... Именно картирования сегментация....и работа Кеша загадочно !
@johnkoffee
@johnkoffee Год назад
Будьте здоровы!))
@VladimirMedintsev
@VladimirMedintsev Год назад
Спасибо.
@jonnikfogotcheck9363
@jonnikfogotcheck9363 Год назад
Спасибо
@VasyaPupkinus
@VasyaPupkinus Год назад
Хороший урок. До него я думал - Статическое или Динамическое выделение памяти. А теперь я думаю - Статическое или Динамическое выделение памяти + посмотрел видос
@StahLHerZRocK
@StahLHerZRocK Год назад
Динамическое выделение требуется, если у вас не хватает памяти, если дефицита нет - то и в динамике смысла нет. Это объективно. Тем более если вы не сами пишете аллокаторы(или хотя бы не имеете исходников) - то это в принципе не безопасно. Достаточно вспомнить гнушый аллокатор используемый той же atmel studio.
@PavelOmelchenko
@PavelOmelchenko Год назад
Отличный курс, отличный лектор!
@prizrakkommunizma8750
@prizrakkommunizma8750 Год назад
Отличный курс! Прошу, продолжайте! Только на мой взгляд до сих пор не затронутым остался алгоритм решения необходимости ОСРВ в каждом проекте. Где эта граница, после которой нужно переходить от BareMetal к ОСРВ?
@VladimirMedintsev
@VladimirMedintsev Год назад
Это граница находится в голове каждого из нас. Как профессионалы мы должны знать и владеть технологиями. А какую технологию применить в каждом конкретном проекте должны решать вы. Вы как разработчик как автор, как инженер.
@markusdrive_com
@markusdrive_com Год назад
Требуем продолжения "банкета"!
@StahLHerZRocK
@StahLHerZRocK Год назад
По поводу 5 модели. Да и внутри МК часто память разделена на области, правда зачастую объединять их для одной цели сомнительно) та же CCM память у cortex
@serggorod1423
@serggorod1423 Год назад
Урааа
@fliblomlaslojor
@fliblomlaslojor Год назад
уииии время бы найти. чет я подзавис времени на все нихватает
@SevenNightdreemVeryPavlovny
Спасибо за подробный рассказ, кто помнит у кого при heap_4 и вызове sprintf(float) hard_fault ?
@VladimirMedintsev
@VladimirMedintsev Год назад
Все помнят стека задаче не хватало
@prizrakkommunizma8750
@prizrakkommunizma8750 Год назад
1. Владимир говорит что 3я схема плоха ибо отключает планировщик на время аллокации и деаллокации. 2. Открывает код 4й схемы и там вначале точно так же суспендятся все задачи на время аллокации)) 3. ???
@johnkoffee
@johnkoffee Год назад
Пересмотрел. Да, действительно, ка минимум 4я схема тоже приостанавливает переключение задач для безопасности. Но, думаю, Владимиру не нравится что мы встаем в зависимость от "каких-то там" библиотек и компиляторов. Типа, ждать Фриэртэосовский малок - это хорошо, а ждать непонятночей (и при этом у всех разный) малок - это плохо.
@prizrakkommunizma8750
@prizrakkommunizma8750 Год назад
@@johnkoffee не уверен что в принципе есть возможность сделать потокобезопасный маллок, не объявился маллок критической секцией кода.
@StahLHerZRocK
@StahLHerZRocK Год назад
да, этот момент очень странный. Но вообще 3ий вариант плох как минимум тем, что не всегда есть исходники аллокаторов конкретной используемой реализации стандартной библиотеки, а некоторые и в принципе опасно использовать
@izada666
@izada666 Год назад
Как понимаю в основном лучше использовать хип1 и статически всё создавать, так как очень редко нужно создавать и удалять задачи. А буфера в осном создаются сразу при компиляции, не могу припомнить когда буфер нужно удалить, а не просто его обнулить и использовать занова.
@StahLHerZRocK
@StahLHerZRocK Год назад
@@dmitryveselov5546 Да, очевидно именно дефицит памяти и есть причина динамического ее использования.
@ОлегАсмолов-й5н
Добрый день! Возникла проблема при передаче из прерывания от CAN в очередь с помощью функции xQueueReceiveFromISR (), все виснет. Методом исключения выяснилось что если убрать в mein HALl_Delay (), которая вызывалась до MX_FREERTOS_Init (), то все работает. Почему так ?
@Хмельницкийрыноконлайн
Здравствуйте, хочу написать десертацию на тему RTOS в особенности FreeRTOS, есть ли облсати, где есть проблемы? Архитектура, планирование, привязка блокчейна или взаимодействие с киберфизическими системами?
@VladimirMedintsev
@VladimirMedintsev 3 месяца назад
Нет проблем нету.
@stm32Lab
@stm32Lab Год назад
Задам глупый вопрос, т.к. до конца не понял по memory map: "обычные" стек и куча, которые задаются в startup, и FreeRTOS'овские стек с кучей - они разные? И их размеры разные? Они создаются в разных областях ОЗУ?
@VladimirMedintsev
@VladimirMedintsev Год назад
Разные. Только это не глупый вопрос
@stm32Lab
@stm32Lab Год назад
@@VladimirMedintsev спасибо
@StahLHerZRocK
@StahLHerZRocK Год назад
я надеюсь автор просто решил упростить объяснение начиная с 11:40. Но тогда нужно было пояснять что это все верно если вы используете реализацию стандартой библиотеки и ее инициализатор в каком-то тулчейне. (Чего нельзя делать в серьезных проектах)
@ДмитрийБуньков-щ8ш
К сожалению не услышал, как freertos обеспечивает целостное выделение и освобождение памяти в случае heap_4. Слышал ещё мнение, что freertos для целостного выполнения определенных действий может также временно закрывать прерывания. Если такое имеет место, то в каких случаях?
@VladimirMedintsev
@VladimirMedintsev Год назад
На это есть отдельное видео.
@BodinAndrey
@BodinAndrey Год назад
@VladimirMedintsev, огромное Вам спасибо, за то, что вы делаете. Подскажите, пожалуйста, когда мы, используем heap_mem_4, мы выделяем массив в статической памяти нашего МК, под реализацию динамической памяти ОС. В эту память ОС сохраняет стек задачи, и свою структуру данных о задачи. Собственно вопрос, если мы внутри задачи объявляем временные переменные, они выделяются из кучи ОС или МК?
@VladimirMedintsev
@VladimirMedintsev Год назад
МК
@U_video
@U_video Год назад
Они размещаются на стэке для этой задачи.
@d2mitryev
@d2mitryev Год назад
Вот тут непонятка. когда компилятор видит вызов любой функции он генерирует создание стекового фрейма для этой функции в котором есть память под все локальные переменные. Если утверждается что локальные переменные функций лежат в стеке фриртос то возникает вопрос - откуда компилятор в момент сборки бинаря знает где стек этой конкретной задачи freeRtos? компилятор понятия не имеет ни о том что какаято фриртос существует, ни темболее о том сколько у нас задач и темболее что у этих задач есть какойто фриРтосовый стек! Нестыковочка, что локальные переменные в стеке задач. Если я выделю всю ram контроллера под кучу фриРтос и фриРтос напилит там стеки под свои задачи (а напилит он их там уже в рантайме) то никак не получается компилятору об этом знать на момент компиляции! Тут идея в другом: есть системный стек контроллера (где будут лок переменные функций) и его параметры заданы в конфиге файл *xx.s и стек микроконтроллера движется от макс адресов вниз. А стеки задач фриртос, tcb, и то что выделяется malloc-ами растет снизу вверх (от меньших адресов). поэтому они встретятся только тогда когда память исчерпается. Утверждение что стек микроконтроллера используется только для прерываний - не верно. Для функций (всех) тоже используется он же. В стеках задач фриртос сохр регистры контроллера когда задачу вытесняют и восстанавливают их оттуда (регистры) когда задача получает процессорное время.
@Ololoshize
@Ololoshize Год назад
Временные переменные это локальные или динамические?
@d2mitryev
@d2mitryev Год назад
@@Ololoshize это когда ты пишешь функцию и внутри определил переменную int i=0; например. она живет пока выполняется тело функции, а адрес ее в системном (НЕ фриртосовом) стеке микроконтроллера.
@ArtemKAD1
@ArtemKAD1 Год назад
Странное заявление в начале. Обычный самостоятельно писанный планировщик не использует свой стек для каждой задачи. Есть только массив TCB-блоков и некоторое число статических переменных которые создаются каждой задачей при необходимости. По сути там используется в некотором смысле первая схема управления памятью, только без использования кучи.
@justdoh
@justdoh Год назад
Рассказано понятно, но кажется, что про статичное размещение кучи ядра ОСРВ ucHeap на этапе компиляции стоило рассказать раньше, где-то на 13:03, где говорите про константу, определяющую её размер. Жаль, что не рассказано, что в пустой куче ucHeap автоматически создаётся первый элемент связанного списка, а при размещении объекта аллокатор выполняет ещё и выравнивание по размеру машинного слова, эти моменты могут помочь при определении корректного значения configTOTAL_HEAP_SIZE. И не совсем согласен с тезисом на 26:53, mtCOVERAGE_TEST_MARKER не для внесения изменений в поведение аллокатора, а для тестов.
@serggorod1423
@serggorod1423 Год назад
11:22 Определение Стека и кучи.
@vladimirkomarov6250
@vladimirkomarov6250 Год назад
А можно ссылку на видео где мало ОЗУ ? Пытался запустить OS на MSP430 c 4 Kb (из их примера) так там требуется хипсайз минимум 3Kb.
@VladimirMedintsev
@VladimirMedintsev Год назад
ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-fX1TTGHeVCg.html Вот видео в котором я говорю об этом проекте без рассказа о программной части. Разбора кода этого проекта в открытом доступе нету.
@Ololoshize
@Ololoshize Год назад
Не совсем понял, почему третья модель так плоха. Просто из идеологических соображений? Мне кажется, время, которое МК потратит на выделение/удаление памяти ничтожно, чтобы заморачиваться о "реальном времени" выполнения. Впрочем, я не могу представить, чтобы мне требовалось делать задачи, очень критичные к переключениям контекста.
@CrazyPit
@CrazyPit Год назад
например какой нибудь времязавсимый протокол приема передачи данных
@StahLHerZRocK
@StahLHerZRocK Год назад
@@CrazyPit его делать нужно не задачей в РТОС а модулем связанным с аппаратурой, очевидно напрашивается таймер. вы ж не будете тот же 1wire делать в задаче РТОС :)
@sergbo3114
@sergbo3114 9 дней назад
По поводу HEAP_3 думаю вы сильно преувеличиваете ее вредность. То что планировщик останавливается ничего сильно страшного нет. Хоть это и является операционной системой реального времени, но все же точные отсчеты с помощью задач делать не получится. Конечно, все зависит от того на сколько будет задержано переключение следующей задачи, но сомневаюсь что слишком на долго. Думаю 100-150 микросекунд погоды не сделают. А если делают, то значит нужно возлагать это на периферийное оборудование. Ну и за частотой вызова этих функций нужно следить, хотя это касается любой схемы кроме первой. Ну и в конце концов есть прерывания, которые должны делать неотложные задачи.
@VladimirMedintsev
@VladimirMedintsev 9 дней назад
Дело не в отсчетах времени. Операционная система реального времени предполагает жесткие рамки времени отклика на внешнее событие.
@sergbo3114
@sergbo3114 9 дней назад
@@VladimirMedintsev Так я ж об этом. В принципе не сложно протестировать скорость работы, хотя бы среднюю. И я что-то сомневаюсь что там будет значение много превышающее время выполнение самого шедулера. Т.е. шедулер вас не смущает, а выделение памяти очень. К тому же подумайте еще вот о чем, не обязательно это вызывает задержку переключения задачи. Задержка будет только в том случае если будет более высокоприоритетная задача. Если выделение памяти будет в высокоприоритетной задаче, то отключение шедулера вообще никак не скажется так как все-равно переключение не произошло бы. Если же выделение памяти будет в низкоприоритетной задаче, то возможно выделение памяти закончится быстрее чем придет следующий SysTick. К тому же равномерного выполнения задач не стоит ожитать еще по причине наличия прерываний. Вот сейчас возьму и замеряю время работы этих функций.
@sergbo3114
@sergbo3114 9 дней назад
@@VladimirMedintsev Вот осликом померял, 2кб выделяется за 2.124 микросекунды. Освобождение 250 наносек. Соответственно, можно говорить о том что включение heap_3 может добавить в отличии от heap_4 задержку выполнения высокоприоритетного задания на 2 микросекунды. Как по мне это не большая плата за потокобезопастность. Но тут уж по ситуации.
@DART2WADER
@DART2WADER Год назад
А где new и delete или operator new и opertaor delete?)))
@anatoliygavrilov958
@anatoliygavrilov958 Год назад
В параллельной реальности под названием С++ =)
@U_video
@U_video Год назад
Выходит, что всё равно какой heap, если используется только статическое объявление объектов ОС?
@VladimirMedintsev
@VladimirMedintsev Год назад
Да. Все-равно. Но для большинства это секрет.
@VasyaPupkinus
@VasyaPupkinus Год назад
@@VladimirMedintsev Если генерировать код через КубМикс и поставить там статик , то файл хип вообще не генерится. А если сгенерировали сначала с динамическим выделением памяти а потом перегенерировали на статическое, то компилятор требует удалить файл heap
@VladimirMedintsev
@VladimirMedintsev Год назад
@@VasyaPupkinus И? Разве это не логично???
@VasyaPupkinus
@VasyaPupkinus Год назад
@@VladimirMedintsev Всё логично ) Ждём продолжения. Кстати, не подскажите что будет в следующей серии )
@VladimirMedintsev
@VladimirMedintsev Год назад
@@VasyaPupkinus В следующем видео будет управление очередями и оно гигантское по времени.
Далее
Как Linux рисует окна?
48:46
Просмотров 1,7 тыс.
Поднимаем I2C  - Уроки FPGA /#12
16:26
Просмотров 5 тыс.