2015-03-27 2 views
1

Я знаю, что такое двоичный семафор: это флаг, когда в ISR прерывания установлен флаг 1.Семафор при использовании упреждающего ядра

Но что такое семафор, когда мы используем упреждающее ядро, скажем, FreeRTOS? Это то же самое, что и двоичный семафор?

+1

Это немного больше, чем флаг или счет. Семафор также имеет контейнер, обычно очередь, для потоков, ожидающих на нем. –

+0

Бинарный семафор - это всего лишь одно приложение семафора RTOS. На веб-сайте FreeRTOS есть [хорошая запись] (http://www.freertos.org/Inter-Task-Communication.html) – kkrambo

+0

Я изучил его немного, и у меня создается впечатление, что он действует как счетчик некоторых сортировать, сколько ресурсов используется uptil теперь, подсчитывая флаги в ISR – johnny

ответ

2

это флаг, когда установлен ISR прерывания.

Это не полное и точное описание семафора. То, что вы описали, является просто флагом . Семафор - объект синхронизации; Существуют три формы, предоставляемые типичной RTOS:

  • бинарный семафор
  • Counting Sempahore
  • Взаимное исключение Семафор (Мьютекс)

В случае бинарного семафора, существуют две операции дать и принять. Задача, принимающая семафор, будет блок (т. Е. Приостановить выполнение и разрешить другим потокам с низким или равным приоритетом запускать потоки для запуска), пока какой-либо другой поток или обработчик прерываний не даст семафор. Двоичные семафоры используются для сигнализации между потоками и от ISR к потокам. Они часто используются для реализации обработчиков отложенных прерываний , так что ISR может быть коротким, а обработчик извлекает выгоду из механизмов RTOS, которые не допускаются в ISR (все, что блокирует или приостанавливает выполнение).

Несколько потоков могут блокироваться на одном семафоре, но только одна из этих задач будет отвечать на семафор. В некоторых RTOS есть операция flush (например, VxWorks), которая ставит все потоки, ожидающие семафора в состоянии , состояние одновременно, и в этом случае они будут выполняться в соответствии со схемой приоритетного планирования.

Подсчет Семафор похож на бинарного семафора, за исключением того, что она может быть задана несколько раз, и задачи может занять семафор без блокировки, пока счетчик не равен нулю.

A Mutex используется для блокировки ресурсов. Для этого можно использовать двоичный семафор, но мьютекс предоставляет функции, которые делают это более безопасным. Операциями над мьютексом являются блокировка и разблокировка. Когда поток блокирует мьютекс, а другая задача пытается заблокировать один и тот же мьютекс, вторая (и любая последующая) задача блокирует до тех пор, пока первая задача не разблокирует ее. Это можно использовать для предотвращения одновременного доступа нескольких потоков к ресурсу (памяти или ввода-вывода). Нить может блокировать мьютексы несколько раз; счет сохраняется, так что он должен быть разблокирован равным количеством раз до того, как блокировка будет отпущена. Это позволяет потоку встраивать блокировки.

Особенностью мьютекса является то, что если поток с блокировкой является более низким приоритетом для задачи, запрашивающей блокировку, то задача с более низким приоритетом повышается до приоритета выше, чтобы предотвратить инверсию приоритета, где задача среднего приоритета может вытеснить задачу с низким приоритетом с блокировкой, увеличивающей время, в течение которого задача с более высоким приоритетом должна ждать этого рендеринга, что планирование не является детерминированным.

Приведенные выше описания типовые; конкретные реализации RTOS могут отличаться. Например, FreeRTOS различает mutex и рекурсивный мьютекс , последний поддерживает функцию nestability; в то время как первый немного более эффективен, когда вложение не требуется.

+0

Спасибо за подробный ответ, кстати, я принимал бинарный семафор в голом металле, я обычно использовал его, чтобы сохранить ISR short – johnny

+0

@johnny: Если вы только имеют основной контекст и контекст ISR, не существует понятия «блокировка», основной поток просто вращается, ожидая флага, или опросы его и продолжаются - в любом случае, это не семафор. – Clifford

+0

@Clifford хорошо, семафоры часто используются для связи между ISR и потоками пользовательского состояния. отправить, (но, конечно, не дождаться) на семафоре, безопасно для всех ОС, которые я использовал. Если ISR выходит через планировщик (вместо обычного прямого возврата прерывания), такой ISR может сделать поток, который ожидал на семафоре, готовый/запущенный «немедленно». –

1

Семафоры - это не только флагов или графов. Они поддерживают операции отправки и ожидания. Поток пользовательского пространства может ждать семафора без ненужного и нежелательного опроса и быть готовым/запущенным «немедленно», когда другой поток или соответствующий драйвер/ISR отправляет единицу.

Под «соответствующим образом спроектированным драйвером/ISR» я имею в виду тот, который может выполнять операцию send(), а затем выходить через планировщик ОС всякий раз, когда ему нужно настроить готовность/выполнение ожидающего потока.

Такой механизм жизненно важен для упреждающих ядер, поскольку он позволяет им добиться очень хороших результатов ввода-вывода без потери времени, циклов процессора и полосы пропускания памяти при опросе. Неприемлемые системы безнадежно медленны, латентны и расточительны при вводе-выводе, и именно поэтому они по существу больше не используются и почему мы терпим все проблемы синхронизации/блокировки/очереди и т. Д.

Смежные вопросы