You are here

Реализация задачи

Перевод может содержать ошибки. Читайте первоисточник: Implementing a Task

Назад: [Как работает FreeRTOS] Вверх: [Как работает FreeRTOS] Вперёд: [Как работает FreeRTOS]

 

Задача во FreeRTOS должна иметь следующую структуру:

/*----------------------------------------------------------------------------*/
void vATaskFunction( void *pvParameters )
{
    for( ;; )
    {
        -- Код задачи приложения расположен здесь. --
    }

    /* Задачи не должны предпринимать попыток возврата из функции, */
    /* реализующей их, или выходить каким-либо другим образом. */
    /* В более новых портах FreeRTOS попытка сделать это приведёт */
    /* к вызову макроса configASSERT(), если он определён. */
    /* Если это необходимо, для выхода из задачи тогда используйте вызов */
    /* vTaskDelete( NULL ), чтобы гарантировать, что выход выполнен чисто. */
    vTaskDelete( NULL );
}

В фрагменте кода использованы макрос configASSERT() и функция vTaskDelete().

Тип TaskFunction_t определяется как функция, которая возвращает void и получает указатель на void в качестве параметра. Все функции котори реализуют задачи должны иметь такой тип. Параметр может быть использован для передачи в задачу информации любого типа - это демонстрируется некоторыми задачами стандартного демонстрационного приложения.

Функции задач никогда не должны возвращаться, поэтому кака правило реализуются в виде вечного цикла. Снова посмотрите демонстрационное приложение, содержащее примеры функций задач.

Задачи создаются вызовом функций API xTaskCreate() или xTaskCreateStatic(), и удаляются вызовом vTaskDelete().

 

Макрос создания задачи

Функции задачи могут быть дополнительно определены использованием макросов portTASK_FUNCTION() и portTASK_FUNCTION_PROTO(). Эти макросы для добавления синтаксиса, специфичного для используемого компилятора, к определению функции и прототипа соответственно. Их использование не является необходимым, если специально не указано для используемого порта. В настоящее время (v??.?.?) эти макросы используются только для порта PIC18 fedC (wizC). - а их использование в версии v10.1.1 ещё можно встретить в портах msp430_CrossWorks, msp430_IAR, MCF5235_GCC и некоторых других.

Прототип для функции, приведённой выше, может быть записан так...:

void vATaskFunction( void *pvParameters );

...или так:

portTASK_FUNCTION_PROTO( vATaskFunction, pvParameters );

Аналогично функция, приведённая выше, может быть написана в таком формате:

/*----------------------------------------------------------------------------*/
portTASK_FUNCTION( vATaskFunction, pvParameters )
{
    for( ;; )
    {
         -- Код задачи приложения расположен здесь. --
    }
}

 

Hobby's category: