Почему мьютекс не может быть освобожден от ISR - PullRequest
3 голосов
/ 02 декабря 2010

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

Я не могу понять причину так же.

Спасибо, Закс.

1 Ответ

9 голосов
/ 03 декабря 2010

Помните, что Mutex должен сначала быть получен / взят затем выпущен / отдан.Кроме того, задача, которая получает мьютекс , владеет им.Это не позволяет другой задаче освободить мьютекс, который ему не принадлежит.

В этом случае становится ясно, что, поскольку ISR не может получить мьютекс (или любой семафор в этом отношении - это операция блокировки)из этого следует, что он не может дать мьютекс.

ISR вполне может дать двоичный или счетный семафор, чтобы сигнализировать задаче о том, что что-то происходит.Но мьютексы - это всегда пара «бери / отдай».

Чтобы прояснить ситуацию.В VxWorks контекст ISR не совпадает с контекстом задачи!
Недопустимый следующий сценарий:

  Task A            ISR
  semTake(mutex)
   ....
                    semGive(mutex)

Задача A владеет мьютекс.Когда ISR работает, он выполняется в совершенно ином контексте.Большинство современных процессоров имеют отдельный стек ISR.Поскольку Задача А владеет мьютексом, как ISR может отказаться от него?На самом деле, какова у вас гарантия того, что ISR сработает, когда у мьютекса А. будет *.1024 * Задача A отключается из-за вызова, не связанного с мьютексом, и выполняется задача B.ISR теперь выполняется во время работы B.Будет ли по-прежнему допустимо давать ISR?

Независимо от всего этого, простой факт заключается в том, что в паре Get / Set всегда используется мьютекс.Я не вижу варианта использования, в котором у вас был бы отдельный semGive.

Есть ли у вас какая-то особая ситуация, которая потребовала бы semGive из контекста ISR?

...