Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS Task Control API Functions - xTaskResumeFromISR()
Назад: [vTaskResume()] | Вверх: [ИПП: Управление задачами] | Вперёд: [xTaskAbortDelay()] |
Функция объявляется в файле task.h
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume );
Настройки INCLUDE_vTaskSuspend и INCLUDE_xTaskResumeFromISR в файле FreeRTOSConfig.h должны быть установлены в 1. Без этого функция недоступна.
Функция возобновляет выполнение приостановленной задачи. Предназначена для вызова из контекста прерывания.
Задача, которая была приостановлена одним или несколькими вызовами vTaskSuspend() будет снова готова к запуску после однократного вызова xTaskResumeFromISR().
Функция xTaskResumeFromISR() считается потенциально небезопасной, т.к. её действия не фиксируются. По этой причине её лучше не использовать для синхронизации задачи с прерыванием, если существует вероятность того, что прерывание будет вызвано до приостановки задачи. Ведь в этом случае факт возникновения прерывания будет пропущен (потерян). Поэтому предпочтительнее будет использование семафора, или ещё лучше прямого уведомления задаче. Рабочий пример кода, использующий прямое уведомление задаче, приведён в разделе Использование уведомлений в качестве счётных семафоров.
Параметры:
xTaskToSuspend | Дескриптор возобновляемой задачи. |
Возвращаемое значение:
Если возобновление задачи должно привести к переключению контекста, возвращается значение pdTRUE. В противном случае возвращается значение pdFALSE. Возвращаемое значение используется обработчиком прерывания, чтобы определить, может ли потребоваться переключение контекста при возврате из обработчика прерывания.
Пример использования:
/* Дескриптор задачи. */
TaskHandle_t xHandle;
void vAFunction( void )
{
/* Создаём задачу, сохраняем её дескриптор. */
xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
/* ... */
}
void vTaskCode( void *pvParameters )
{
/* Задача, которая будет приостанавливаться и возобновляться. */
for( ;; )
{
/* ... */
/* Приостановка задачей самой себя. */
vTaskSuspend( NULL );
/* Задача была приостановлена, поэтому здесь окажемся только когда из
прерывания будет выполнено возобновление этой задачи. */
}
}
void vAnExampleISR( void )
{
BaseType_t xYieldRequired;
/* Возобновляем приостановленную задачу. */
xYieldRequired = xTaskResumeFromISR( xHandle );
/* Проверяем необходимость переключения контекста при возврате из прерывания.
ПРИМЕЧАНИЕ: то, каким образом это будет выполнено, зависит от используемого
порта. Для уточнения обратитесь к документации на используемый вами порт. */
portYIELD_FROM_ISR( xYieldRequired );
}
.