Старт ARM. RTOS часть 4-ая. Семафоры.

Всем привет, продолжаем дальше на практике изучать FreeRTOS на базе STM32F429i – DISCO. Сегодня на повестки дня семафоры.
Семафор — объект, ограничивающий количество потоков, которые могут войти в заданный участок кода. Определение введено Эдсгером Дейкстрой. Семафоры используются при передаче данных через разделяемую память.
Семафор — это объект, с которым можно выполнить три операции.

Предположим, что есть такой участок кода:

Тогда не более пяти потоков могут одновременно выполнять функцию DoSomething().
В более сложных семафорах может использоваться очередь; при этом потоки, ожидающие освобождения семафора, будут проходить через семафор именно в том порядке, в котором они вызывали enter().
Применение семафоров
Вот некоторые из проблем, которые могут решать семафоры.
запрет одновременного выполнения заданных участков кода;
поочерёдный доступ к критическому ресурсу (важному ресурсу, для которого невозможен (или нежелателен) одновременный доступ).
Следующий пример показывает, как наладить поочерёдный доступ к консоли.

Этот код поможет предотвратить появление вывода наподобие

Проблемы семафоров
Во-первых, можно написать программу с «утечкой семафора», вызвав enter() и забыв вызвать leave(). Реже встречаются ошибки, когда дважды вызывается leave().
Во-вторых, семафоры чреваты взаимной блокировкой потоков. В частности, опасен такой код:

В качестве примера создадим бинарный семафор, функция vTask1 будет захватывать семафор, при следующем прохождении цикла планировщик переведет ее в блокирующее состояние, пока не возникнет прерывание и функция обработки прерывания не вернет семафор, как только семафор вернули, vTask1 снова захватит семафор и все повториться заново. Чтобы программа корректно работала я переопределяю configASSERT, без неё FreeRTOS и прерывания просто не дружат, и весь проект валится.

С семафорами на сегодня все! В следующий раз разберем пример для мьютекса. 🙂
Проект freeRTOS_semaphore.7z

Отправить ответ

Оставьте первый комментарий!

Уведомлять о
avatar
wpDiscuz