24
КОМПОНЕНТЫ И ТЕХНОЛОГИИ •
№ 7 '2011
микроконтроллеры
исходит прерывание при возникновении
какого-то внешнего события. В момент вре-
мени (2) управление получает обработчик
прерывания, который, используя механизм
двоичного семафора, выводит из блоки-
рованного состояния задачу-обработчик
прерывания. Так как приоритет задачи-
обработчика выше приоритета прикладной
задачи, то задача-обработчик вытесняет при-
кладную задачу, которая остается в состоя-
нии готовности к выполнению (3). В момент
времени (4) задача-обработчик блокируется,
ожидая возникновения следующего преры-
вания, и управление снова получает низко-
приоритетная прикладная задача.
В теории многопоточного программиро-
вания [1] двоичный семафор определен как
переменная, доступ к которой может быть
осуществлен только с помощью двух атомар-
ных функций (то есть тех, которые не могут
быть прерваны планировщиком):
1)
wait() или
P() — означает захват семафора,
если он свободен, и ожидание, если занят.
В примере выше функцию
wait() реализует
задача-обработчик прерывания.
2)
signal() или
V() — означает выдачу семафо-
ра, то есть после того как одна задача выда-
ет семафор, другая задача, которая ожидает
возможности его захвата, может его захва-
тить. В примере выше функцию
signal()
реализует обработчик прерывания.
Легко заметить, что операция выдачи
двоичного семафора напоминает операцию
помещения элемента в очередь, а операция
захвата семафора — чтения элемента из оче-
реди. Если установить размер очереди рав-
ным одному элементу, то очередь превра-
щается в двоичный семафор. Наличие эле-
мента в очереди означает, что одна (а может,
и несколько) задача произвела(и) выдачу
семафора, и теперь другая задача может его
захватить. Пустая же очередь означает ситуа-
цию, когда семафор уже был захвачен, и за-
дача, которая «хочет» его захватить, вынуж-
дена ожидать (находясь в блокированном со-
стоянии), пока другая задача или обработчик
прерывания произведут выдачу семафора.
В именах API-функций FreeRTOS для ра-
боты с семафорами используются термины
Достарыңызбен бөлісу: