Использование спин-блокировки и семафора в Linux в контексте процесса и прерывания
Что произойдет, если я использую семафорные и мьютексные блокировки в контексте прерывания? Обычно семафор используется в механизме синхронизации. Что произойдет, если я использую это в контексте прерывания?
Я работаю над проектом на gpio pins, и когда происходит прерывание, я должен отправить один сигнал в ISR. Я использую спин-блокировки.
Что произойдет, если я использую семафор и мьютекст в ISR?
1 ответ
Ожидание в мьютексах и семафорах осуществляется с помощью переключения текущего состояния задачи на TASK_INTERRUPTIBLE
/ TASK_UNINTERRUPTIBLE
и подобное с дальнейшим призывом к schedule()
,
призвание schedule()
с текущим состоянием задачи отличалось от TASK_RUNNING
приводит к переходу на другой процесс. И если current
относится к контексту прерывания, вы никогда не вернетесь к нему, потому что планирование может переключаться только на процесс.
Таким образом, когда вы блокируете семафор / мьютекс в состоянии прерывания (то есть в настоящий момент заблокирован) в контексте прерывания, вы просто теряете текущий поток выполнения.
Если вы заблокируете семафор / мьютекс, который не используется (в настоящее время не заблокирован), выполнение будет корректным, за исключением предупреждения в системном журнале о неправильном использовании семафора / мьютекса.