Кооперативная многозадачность
во FreeRTOS
До этого момента при изучении FreeRTOS
мы использовали режим работы ядра с вы-
тесняющей многозадачностью. Тем не менее,
кроме вытесняющей, FreeRTOS поддержи-
вает кооперативную и гибридную (смешан-
ную) многозадачность.
Самое весомое отличие кооперативной
многозадачности от вытесняющей — то, что
планировщик не получает управление каж-
дый системный квант времени. Вместо этого
тело функции, реализующей задачу, должно
содержать явный вызов API-функции плани-
ровщика taskYIELD().
Результатом вызова taskYIELD() может
быть как переключение на другую задачу, так
и отсутствие переключения, если других за-
дач, готовых к выполнению, нет. Вызов API-
функции, которая переводит задачу в блоки-
рованное состояние, также приводит к вызо-
ву планировщика.
Следует отметить, что отсчет квантов
времени ядро FreeRTOS выполняет при ис-
пользовании любого типа многозадачности,
поэтому API-функции, связанные с отсчетом
времени, корректно работают и в режиме
кооперативной многозадачности. Как и для
вытесняющей, в случае применения коопера-
тивной многозадачности каждой задаче необ-
ходим собственный стек для хранения своего
контекста.
Преимущества кооперативной многоза-
дачности:
1. Меньшее потребление памяти стека при пе-
реключении контекста задачи, соответствен-
но, более быстрое переключение контекста.
С точки зрения компилятора вызов плани-
ровщика «выглядит» как вызов функции,
поэтому в стеке автоматически сохраняются
регистры процессора и нет необходимости
их повторного сохранения в рамках сохра-
нения контекста задачи.
2. Существенно упрощается проблема со-
вместного доступа нескольких задач
к одному аппаратному ресурсу. Например,
не нужно опасаться, что несколько задач
одновременно будут модифицировать
одну переменную, так как операция моди-
фикации не может быть прервана плани-
ровщиком.
Недостатки:
1. Программист должен в явном виде вы-
зывать API-функцию taskYIELD() в теле
задачи, что увеличивает сложность про-
граммы.
2. Одна задача, которая по каким-либо причи-
нам не вызвала API-функцию taskYIELD(),
приводит к «зависанию» всей программы.
3. Трудно гарантировать заданное время ре-
акции системы на внешнее событие, так
как оно зависит от максимального вре-
менного промежутка между вызовами
Достарыңызбен бөлісу: |