FreeRTOS: Как xSemaphoreTakeFromISR может разбудить любую задачу

#semaphore #freertos

Вопрос:

Новичок в FreeRTOS и пытается понять это в деталях.

Согласно инструкции здесь…: https://www.freertos.org/xSemaphoreTakeFromISR.html

… возможно, что вызов xSemaphoreTakeFromISR может привести к выходу какой-либо задачи из заблокированного состояния.

Как это возможно ?

Как какая-то задача могла попасть в заблокированное состояние, вызвав xSemaphoreGive в первую очередь ?

Я понимаю, что семафоры и мьютекс реализуются очередями, и у xQueueSend есть параметр xTicksToWait (значение которого равно portMAX_DELAY может привести к тому, что эта функция перейдет в заблокированное состояние). Но все внутренние реализации xSemaphoreGive устанавливают этот параметр (xTicksToWait) равным нулю.

Пожалуйста, объясните, почему я должен проверять параметр pxHigherPriorityTaskWoken в xSemaphoreTakeFromISR и в каких редких случаях он может быть установлен в значение pdTRUE ?

Комментарии:

1. Я думаю, что API может быть таким, как есть, из-за соображений согласованности (в отношении функций FromISR). Я также думаю, что вы правы в том, что сигнализация семафора не может блокировать задачу, следовательно, ее использование не может разблокировать ее. Здесь есть больше шансов получить ответ forums.freertos.org