pdTRUE
•
— означает, что переключение
контекста произошло сразу после возоб-
новления работы планировщика.
pdFALSE
•
— во всех остальных случаях.
В о з м о ж е н в л о ж е н н ы й в ы -
з о в API-функций vTaskSuspendAll()
и xTaskResumeAll(). При этом ядро автома-
тически подсчитывает глубину вложенности.
Работа планировщика будет возобновлена,
если глубина вложенности станет равна 0.
Этого можно достичь, если каждому вызо-
ву vTaskSuspendAll() будет соответствовать
вызов xTaskResumeAll().
Мьютексы
Взаимное исключение называют также
мьютексом (mutex — MUTual EXclusion),
этот термин чаще используется в операцион-
ных системах Windows и Unix-подобных [5].
Мьютекс во FreeRTOS представляет собой
специальный тип двоичного семафора, ко-
торый используется для реализации совмест-
ного доступа к ресурсу двух или большего
числа задач. При использовании в качестве
механизма взаимного исключения мьютекс
можно представить как семафор, относя-
щийся к ресурсу, доступом к которому необ-
ходимо управлять.
В отличие от семафора мьютекс во FreeRTOS
предоставляет механизм наследования при-
оритетов, о котором будет рассказано ниже.
Также следует отметить, что использование
мьютекса из тела обработчика прерыва-
ния невозможно.
Чтобы корректно получить доступ к ресур-
су, задача должна предварительно захватить
мьютекс, стать его владельцем. Когда владелец
семафора закончил операции с ресурсом, он
должен отдать мьютекс обратно. Только когда
мьютекс освободился (возвращен какой-либо
задачей), другая задача может его захватить
и безопасно выполнить свои операции с об-
щим для нескольких задач ресурсом. Задаче
не разрешено выполнять операции с ресур-
сом, если в данный момент она не является
владельцем мьютекса. Процессы, происходя-
щие при взаимном исключении доступа с ис-
пользованием мьютекса, приведены на рис. 1.
Обе задачи нуждаются в доступе к ресурсу,
однако только задача-владелец мьютекса мо-
жет его получить (рис. 1а). Задача А пытается
захватить мьютекс, в этот момент он свобо-
ден, поэтому она становится его владельцем
(рис. 1б). Задача А выполняет некоторые дей-
ствия с ресурсом. В этот момент задача Б пы-
тается захватить тот же самый мьютекс, однако
это ей не удается, потому что задача А все еще
является его владельцем. Соответственно, пока
задача А выполняет операции с ресурсом, за-
дача Б не может получить к нему доступ и пе-
реходит в блокированное состояние (рис. 1в).
Задача А до конца завершает операции с ресур-
сом и возвращает мьютекс обратно (рис. 1г).
Это приводит к разблокировке задачи Б, теперь
она получает доступ к ресурсу (рис. 1д). При
завершении действий с ресурсом задача Б обя-
зана отдать мьютекс обратно (рис. 1е).
Легко заметить, что мьютексы и двоичные
семафоры очень похожи в использовании.
Отличие заключается в том, что мьютекс по-
сле захвата обязательно должен быть возвра-
щен, иначе другие задачи не смогут получить
доступ к разделяемому ресурсу. Двоичный
семафор, используемый в целях синхрони-
зации выполнения задач (и прерываний), на-
оборот — не должен возвращаться задачей,
которая его захватила.
Важным моментом является то, что непосред-
ственно мьютекс не защищает ресурс от одно-
временного доступа нескольких задач. Вместо
этого реализация всех задач в системе должна
быть выполнена так, чтобы перед инструкцией
доступа к ресурсу следовал вызов API-функции
захвата соответствующего мьютекса. Эта обя-
занность ложится на программиста.
Достарыңызбен бөлісу: |