You are here

FreeRTOS ИПП: xTaskResumeFromISR()

Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS Task Control API Functions - xTaskResumeFromISR()

Назад: [vTaskResume()] Вверх: [ИПП: Управление задачами] Вперёд: [xTaskAbortDelay()]

 

xTaskResumeFromISR()

Функция объявляется в файле 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 );
}

.

Hobby's category: