Aller au contenu

Les Tâches

Dans un système multi-tâches, la tâche (ou thread) est une séquence d’instructions qui implémente une action. C’est un peu comme une procédure ou une méthode mais avec la différence qu’une tâche est exécutée en concurrence avec d’autres tâches.

Note

On parle de concurrence et non de parallélisme car sur un système mono-coeur, les tâches s’exécutent en pseudo-parallélisme. On a l’illusion d’un système parallèle, mais en fait, les tâches reçoivent un peu de CPU à tour de rôle:

Avec FreeRTOS, une tâche est créée avec la fonction xTaskCreate().

BaseType_t xTaskCreate(TaskFunction_t pvTaskCode,
                       const char* const pcName,
                       configSTACK_DEPTH_TYPE usStackDepth,
                       void* pvParameters,
                       UBaseType_t uxPriority,
                       TaskHandle_t* pxCreatedTask);

Exemple :

// Task to be created.
void vTaskCode(void* pvParameters) {
    // The parameter value is expected to be 1 as 1 is passed in the
    // pvParameters value in the call to xTaskCreate() below.
    configASSERT(((uint32_t)pvParameters) == 1);

    for (;;) {
        // Task code goes here.
    }
}

// Function that creates a task.
void vOtherFunction(void) {
    BaseType_t xReturned;
    TaskHandle_t xHandle = NULL;

    // Create the task, storing the handle.
    xReturned =
        xTaskCreate(vTaskCode,         // Function that implements the task.
                    "NAME",            // Text name for the task.
                    STACK_SIZE,        // Stack size in words, not bytes.
                    (void*)1,          // Parameter passed into the task.
                    tskIDLE_PRIORITY,  // Priority at which the task is created.
                    &xHandle);  // Used to pass out the created task's handle.

    if (xReturned == pdPASS) {
        // The task was created.  Use the task's handle to delete the task.
        vTaskDelete(xHandle);
    }
}

Les priorités

Dans la configuration utilisée pour les TPs, la priorité maximale est 55 (voir constante configMAX_PRIORITIES dans le fichier FreeRTOSConfig.h). Vous pouvez définir une priorité par défaut (priorité normale) à 24.

Dans la majorité des cas, il est plus simple de définir la même priorité pour toutes les tâches. Si vous êtes sûr d’avoir besoin de priorités différentes, une valeur plus grande représente une priorité plus élevée.

L’état des tâches

La figure ci-dessous illustre les états possibles pour une tâche ainsi que les fonctions de FreeRTOS qui influencent ces états :

États des _threads_

États des threads et leurs transitions