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


pdTRUE • — означает, что переключение  контекста произошло сразу после возоб- новления работы планировщика. pdFALSE



Pdf көрінісі
бет82/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   78   79   80   81   82   83   84   85   ...   129
Kurniz

pdTRUE

— означает, что переключение 
контекста произошло сразу после возоб-
новления работы планировщика.
pdFALSE

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


Достарыңызбен бөлісу:
1   ...   78   79   80   81   82   83   84   85   ...   129




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

    Басты бет