это флаг, когда установлен ISR прерывания.
Это не полное и точное описание семафора. То, что вы описали, является просто флагом . Семафор - объект синхронизации; Существуют три формы, предоставляемые типичной RTOS:
- бинарный семафор
- Counting Sempahore
- Взаимное исключение Семафор (Мьютекс)
В случае бинарного семафора, существуют две операции дать и принять. Задача, принимающая семафор, будет блок (т. Е. Приостановить выполнение и разрешить другим потокам с низким или равным приоритетом запускать потоки для запуска), пока какой-либо другой поток или обработчик прерываний не даст семафор. Двоичные семафоры используются для сигнализации между потоками и от ISR к потокам. Они часто используются для реализации обработчиков отложенных прерываний , так что ISR может быть коротким, а обработчик извлекает выгоду из механизмов RTOS, которые не допускаются в ISR (все, что блокирует или приостанавливает выполнение).
Несколько потоков могут блокироваться на одном семафоре, но только одна из этих задач будет отвечать на семафор. В некоторых RTOS есть операция flush (например, VxWorks), которая ставит все потоки, ожидающие семафора в состоянии , состояние одновременно, и в этом случае они будут выполняться в соответствии со схемой приоритетного планирования.
Подсчет Семафор похож на бинарного семафора, за исключением того, что она может быть задана несколько раз, и задачи может занять семафор без блокировки, пока счетчик не равен нулю.
A Mutex используется для блокировки ресурсов. Для этого можно использовать двоичный семафор, но мьютекс предоставляет функции, которые делают это более безопасным. Операциями над мьютексом являются блокировка и разблокировка. Когда поток блокирует мьютекс, а другая задача пытается заблокировать один и тот же мьютекс, вторая (и любая последующая) задача блокирует до тех пор, пока первая задача не разблокирует ее. Это можно использовать для предотвращения одновременного доступа нескольких потоков к ресурсу (памяти или ввода-вывода). Нить может блокировать мьютексы несколько раз; счет сохраняется, так что он должен быть разблокирован равным количеством раз до того, как блокировка будет отпущена. Это позволяет потоку встраивать блокировки.
Особенностью мьютекса является то, что если поток с блокировкой является более низким приоритетом для задачи, запрашивающей блокировку, то задача с более низким приоритетом повышается до приоритета выше, чтобы предотвратить инверсию приоритета, где задача среднего приоритета может вытеснить задачу с низким приоритетом с блокировкой, увеличивающей время, в течение которого задача с более высоким приоритетом должна ждать этого рендеринга, что планирование не является детерминированным.
Приведенные выше описания типовые; конкретные реализации RTOS могут отличаться. Например, FreeRTOS различает mutex и рекурсивный мьютекс , последний поддерживает функцию nestability; в то время как первый немного более эффективен, когда вложение не требуется.
Это немного больше, чем флаг или счет. Семафор также имеет контейнер, обычно очередь, для потоков, ожидающих на нем. –
Бинарный семафор - это всего лишь одно приложение семафора RTOS. На веб-сайте FreeRTOS есть [хорошая запись] (http://www.freertos.org/Inter-Task-Communication.html) – kkrambo
Я изучил его немного, и у меня создается впечатление, что он действует как счетчик некоторых сортировать, сколько ресурсов используется uptil теперь, подсчитывая флаги в ISR – johnny