Операционная система FreeRTOS. Самый полный курс на русском языке. Часть 3. Управление задачами.
Вставка
- Опубліковано 6 вер 2024
- Полный курс по операционной системе FreeRTOS. Часть 3.
Тема: Управление задачами.
По вопросам сотрудничества - vmedintsev@yandex.ru
Канал в телеграмм - t.me/vladimir_...
Канал на UA-cam - / vladimirmedintsev
------------------------------------------
Если вы хотите поддержать автора канала номер карты Сбер:
2202-2023-2480-4008
------------------------------------------
Хорошая подача. Большой труд. Полезно и интересно. Спасибо !
Владимир, большое Вам спасибо за курс, подача материала просто идеальна, даже не замечаешь как время проходит, и полностью погружаешься в преподаваемый материал! Вы реально делаете неоценимый вклад в развитие Российских разработчиков, кто в теме, те поймут меня... По стечению обстоятельств сейчас и сам разбираюсь с различными ОС для МК и одноплатников, а на ГБ еще не дошли до FreeRTOS, и мне Ваш курс сейчас очень помогает разобраться и подготовиться на будущее. Большое Вам человеческое спасибо за Ваш труд!
Очень рад. Благодарю за добрые слова. Буду очень рад, если нашим замечательным студентам это пригодится. Этот курс намного лучше того, что есть в распоряжении GB. Я буду рад, если вы поделитесь ссылками с одногруппниками.
So cool!
Не знаю даже что комментировать, каждый момент круче предыдущего!
Сейчас новый проект по работе, решил использовать rtos, спасибо вам за уроки 👍
Очень рад.
НИЗКИЙ ПОКЛОН ВАМ ЗА ТАКУЮ РАБОТУ!!!!!!! Дай Бог вам здорвья!
Владимир, очень круто. Вы педагог по призванию и блогер от бога
Спасибо за позитивные отзывы. Благодарю.
Спасибо за данный курс! Смотрю 3-ю часть - супер!
Владимир, здравствуйте. На 32:21 как переменная xLastWakeTime будет обновляться, если вызов функции xTaskGetTickCount() находится в области кода, который выполняется только при первом запуске? Разве не должна она находиться в бесконечном цикле?
Тут нет ошибки.
vTaskDelayUntil обновит значение xLastWakeTime.
Мы не просто так передаем переменную xLastWakeTime именно по ссылке в vTaskDelayUntil : управление в задачу возвращается где-то внутри vTaskDelayUntil , и vTaskDelayUntil, сразу после возврата ей управления, самостоятельно обновит xLastWakeTime перед возвращением из функции.
Благодарю за ваши труды🙏 комментарий для продвижение🦾 лайк от души👍
Владимир, еще раз хочется выразить Вам огромную благодарность! За Ваши труды, за знания - которые Вы несете в массы! Благодаря таким людям как Вы и например Narod Stream держится Мир! От всей души благодарен! И передаю Вам так же благодарности от нашей команды программистов из Нижнего. И спасибо за поддержку с дисплейчиками,надеюсь что скоро будем думать о серии..
Спасибо вам огромное за позитивные отзывы.
Огромное спасибо! С таким потоком информации - праздники удались!
Огромное спасибо! Курс - праздник!
Про delayUntil рассказано неочевидно в сравнении с простым delay. Нужно упомянуть, что функция vPrint..., как пример, может иметь определённое "большое" время выполнения и при сложении с простым delay уже не обеспечивает нужную выдержку по времени.
Спасибо!
Спасибо вам.
Здравствуйте, Владимир! Отличный материал, уже отучился на ГБ, ещё на ваших занятиях! Очень здорово, что вы продолжаете нести светлое в умы)
Спасибо огромное. Очень рад.
шикарный материал, на случай "важных переговоров" скачаю на компуктер, оглассите пожалуйста альтернативные площадки, где можно еще будет посмотреть эти видео.
Спасибо за прекрасный курс! Небольшая ремарка: usStackHighWaterMark - возвращает минимальное зарегистрированное значение оставшейся памяти выделенного стека в течении всего цикла задачи, а не минимальное значение самого стека.
Интересно, а как эта штука работает? Мне лично известен только один способ "подкрасить" весь стек.
Спасибо, очень интересно
#ТОП!
вот. а так крутая подача, смотрится на одном дыхании, надо будет потом все серии на харде сохранить))
спасибо огромное
Ку, дядя Вова :) Хоть я и в основном плотно сижу на OSA, но вопросы всё те же к и FreeRTOS. В основном проблемы две... 1) Как приоритетами вообще не заблокировать некоторые задачи, ибо их может быть несколько готовых к выполнению, но с разными приоритетами. 2) Как обеспечить атомарность операций, когда на выполнение задачи требуется больше чем квант (а то и несколько) времени. Понятно что все видео уже отсняты, но, или надеюсь что этому будет уделено время, или будет доснято отдельное кино.
Ответы на эти вопросы в курсе есть. Особенно про потокобезопасность и критические секции кода. Так, что вы найдете ответы на свои вопросы.
Хорошо зашло. Хотим ещё 😉
Хорошее объяснение. Должно помочь в проектировании. Буду смотреть дальше.
Спасибо
Это очень интересно, спасибо.
Спасибо за курс, Владимир!
Можно еще коснуться вопроса глобальных переменных при использовании FreeRTOS. И отдельно по дерективам при объявлении переменных, типа volatile и т.п.
Это есть в курсе. На это выделено целое видео по потокобезопасности. Но оно ближе к концу. Не помню 12е или 13е по счету...
Чудо продолжается!
Владимир, продолжайте!!! И не затягивайте с курсом! 😊
Слишком часто выкладывать ролики очень плохая идея. Люди устанут и не будет просмотров. Труды просто улетят в трубу. А на это были потрачены сотни часов работы.
А разве TCB не должен хранить адрес текуще выполняемой операции (а не только адрес самой функции) ? Например шедулер отобрал управление у текущей задачи где-то посередине. Переменные мы запихнули в стэк, ок. Но когда нашей задаче снова дали порулить, то откуда шедулер узнает с какого места надо продолжить управление?
(если я верно понимаю) В стеке присутствует адрес возврата текущей функции. То есть примерно в момент заморозки задачи в стеке лежит набор значений от нашей задачи, набор значений самой задачи vTaskDelay... и инструкция "продолжить выполнение с адреса X". Таким образом после восстановления стека, первой же инструкцией будет "продолжить выполнение с адреса X"
Музыка такая интригующая на заставке)
а если поставить скорость воспроизведения ролика 0,25 и колонки погромче, то с ума сойти можно ещё до начала основной части ))
Не смотрел еще ни одной части, хочу разом частей по пять смотреть(судя по отзывам это будет просмотр в запой), лайк везде проставил.
"Переходи по ссылке, регистрируйся, присоединяйся к команде - " это уже не интерестно, ведь вас там нет.
Частей по 5 не получится. Все ролики длиной почти по часу...
@@VladimirMedintsev "Все ролики длиной почти по часу..." это не проблема))), значит это будет круче чем я думал.
Отлично, все понятно. Приступим к практике?
Да, практика следующее видео.
Фи га ты пулемет)))) Только 2-у часть досмотрел)))
vTaskDelayUntil() позволяет выполнять задачу с заданной периодичность с учетом времени выполнения кода, чего не делает vTaskDelay(), так ведь?
Наверное pdMS_TO_TICKS() лучше использовать везде чем писать в тиках? Таким образом будет более простой переход если изменится величина кванта времени (тика).
Да, верно. Про макрос pdMS_TO_TICK тоже верно. Но по умолчанию 1 тик = 1 мс. Но использование макроса конечно более правильно.
ого!
подача топ, но фундаметальнейшая тема про кооперативн. /вытесняющ. режимы планировщика затронуты вскользь. с учетом таймслайсинга у нас 4 возможных конфигураций планировщика фриртоса. и каждый режим надо разобрать.
Вопрос. А есть ли возможность блокировки задачи таким образом, что бы разблокировка произошла извне, например по прерыванию.
Да, разумеется, об этом есть одно из видео в учебном курсе.
В каком месте программы вызывается vTaskDelete (NULL) ? Так, как указано в видео ( например здесь 7:39 ) никогда не выполнится, так как находится за бесконечным циклом?
И слава богу, что не выполнится. В видео отчетливо говорится что нельзя выходить из задачи не удалив ее. Иначе это приведет к повреждению ОС. Это по большей части механизм предотвращения проблем.
Подскажите пожалуйста где выделяется память TCB?
В куче.
@@VladimirMedintsev спасибо
А будут примеры с уходом в сон, там же по сути основное(ые) ядро не работает (Режимы пониженного энергопотребления), и freeRTOS будет перезапущен при просыпании (скорее всего, точно не знаю). Хотя и в режиме пониженного энергопотребления есть область для хранения переменных, хоть и небольшая.
Принцип будет разобран очень подробно.
Здравствуйте. Спасибо за лекции. Я или прослушал, или не было сказано про принятую договорённость у FreeRTOS про маленькие буквы перед названием функции. И Вы как-то на мой взгляд сложно описали про переключение между кооперативным режимом и вытесняющим.
Доброго дня. Я правильно понял, по умолчанию, если задача с более высоким приоритетом встала в состояние "ready", то планировщик приостанавливает текущую низкоприоритетную задачу и отдает процессор высокоприоритетной задаче не смотря на то, что текущая задача не завершила работу в своем кванте времени?
Абсолютно верно.
@@VladimirMedintsev спасибо за ответ. Тогда мне не ясна логика работы планировщика. Он каждый момент времени проверяет состояние всех задач? Почему тогда в системе не "плывет" время. Планировщик же постоянно вынужден заниматься проверкой других задач, тратить на это сколько-то тактов процессора, пока одна задача выполняется.
Не спешите, следующее видео поставит все на свои места. Там все станет понятно на примерах.
@@arzamas1988 Что значит "Он каждый момент времени проверяет состояние всех задач"? Планировщик запускается только в отведённое ему время. В своём кванте времени никто задачу прерывать не будет, ну разве что если сама задача не дёрнет планировщик, ну или из какого-нибудь прерывания.
@@U_video как тогда планировщик узнает, что более приоритетная задача в реди перешла? Значит планировщик должен работать каждый раз, когда меняется состояние задач.
Правильно ли я понял? Планировщик переключает на выполнение следующей задачи сразу ( в случае досрочного выполнения задачи), несмотря на то что квант времени отведённый этой задачи ещё не истек или он утилизирует остаток кванта, а потом переключает контекст?
В следующем ролике на графиках увидите.
Владимир, курс и правда получается подробным и интересным, но хотелось бы пару моментов уточнить:
- 19:47 похоже на оговорку, планировщик не занимается выделением памяти из кучи;
- 36:17 IdleHook функция обратного вызова задачи со своими особенностями реализации, но она не воплощает саму задачу простоя (бездействия) там ведь ядро ещё делает ряд служебных операций, например, по сборке мусора. Полагаю в практике это ещё будете разбирать?
Эти видео - компиляция из десятков записей лекций прочитанных в течении года. Мелкие шероховатости там есть и будут.
@@sergsapov2927 Скорее всего Дмитрий прочитал об этом в руководстве. Там они реально пишут о сборке мусора.
@@sergsapov2927 Сбор мусора = высвобождение ресурсов удалённых задач. Да официальная документация и исходник tasks.c (см. функцию portTASK_FUNCTION)
@@sergsapov2927 По сути удалённая задача образует такие неиспользуемые участки в куче, которые не будут доступны, пока ядро явно не обработает их (не пометит как свободные) внутри этой задачи простоя. Понятие сборки мусора вполне хорошо описывает этот процесс и разумеется я его ввёл в контексте работы ОСРВ, а не конкретного языка.
Огромное спасибо за видео! Я заметил, что в данной архитектуре тип данных TickType_t имеет разрядность 32 бита. При частоте в 1 кГц это приведет к переполнению примерно через 50 дней. Мне интересно, не вызовет ли это переполнение проблем в операционной системе? Если я хочу использовать эту ОС в устройствах, которые будут находится во включенном состоянии очень долго, нужно ли как-то дополнительно учитывать этот момент?
Нет, эта проблема надуманная. Проблем при переполнении не возникает ведь это беззнаковое целое.
@@VladimirMedintsev т.е через 50 дней тик каунтер обнулится и начнет с начала. а не будет ли проблем если этот переход в ноль попадет на интервал заданный vTaskDelayUntil ?
походу дела таймслайсинг надо отключать при работе с ds1820 термометром, там вроде как в одну миллисекунду не получается его опросить, а шина критична ко времени.
Будет видео в данном курсе, где про это будет рассказано. Это будет 13е видео в курсе. Там как раз про такие случаи
@@VladimirMedintsev буду ждать как 17 мгновений весны))
И что общего между микропроцессорами и Крымским мостом?
А где в этом видео говорится о Крымском мосту?