Компоненты и технологии • №2 '2011 компоненты


Кооперативная многозадачность



Pdf көрінісі
бет41/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   37   38   39   40   41   42   43   44   ...   129
Kurniz

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


Достарыңызбен бөлісу:
1   ...   37   38   39   40   41   42   43   44   ...   129




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет