Помните, что 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?