Freertos

Introduction

Un RTOS ( Système d'exploitation temps reel ) est un programme informatique qui permet de crée un environnement multitâche temps reel avec les services associés le tout avec des contraintes temps reel. C'est à dire ???? D'un point de vu bas niveau, c'est un ensemble de fichiers que l'on va compiler avec notre projet et qui permet de faire comme si plusieurs programme s'executent en parallèle alors qu'un processeur monocoeur ne peut executé qu'une instruction à la fois.

On va ainsi pouvoir programmer sous forme de tâches (task) qui s'executent en parallèles et qui peuvent communiquer. En effet, le RTOS est aussi ici pour mettre en place les mécanismes de communication entres les tâches. On va pouvoir envoyer des messages d'une tâche à une autre et faire pleins d'autres choses.

On va prendre un exemple tout simple pour mieux comprendre !


Exemple:

J'ai un robot avec un processeur ou microcontroleur qui est équipé de deux moteurs et d'un capteur à ultrason. Le but du processeur c'est de venir lire la valeur du capteur en entrée et de commander les moteurs en fonction. Par exemple, si il n'y a pas d'obstacle devant je peux avancer. Le programme va être structuré comme ceci : - Une tâche qui lit le capteur et qui réalise une conversion en cm par exemple. Ce programme s'execute toutes les 20ms et envoi la valeur à une autre tâche. - La deuxième tâche lit toutes les 20ms la valeur du capteur que la première tâche lui a envoyée et réalise l'algorithme de contrôle des moteurs. - Une troisième tâche a été rajoutée pour faire clignoter une led toutes les 1 secs.

Le RTOS est le morceau de programme qui permet de lancer les tâches au bon moment et de les faire dialoguer.


Cet exemple montre qu'il va être simple de programmer dans un système comme celà parce que chacun peut programmer une tâche et le fait d'avoir une interface standard va permettre de facilement assembler les deux.

On peut se représenter ce qu'il se passe par ce schéma :

Notion de tâche

Concretement une tâche c'est une fonction avec une boucle infinie temporisée. Celà peut être un peu different mais on va dire que c'est quasiment tout le temps comme celà :

static void vATaskFunction( void *pvParameters )
{
    for( ;; )
    {
        -- Ajouter le code de votre tâche ici --
        vTaskDelay(10 / portTICK_RATE_MS);
    }
}
 
int main(void)
{
   xTaskCreate( vATaskFunction, "Test", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
 
   vTaskStartScheduler();
 
   return 0;
}

Les fonctions qui commencent par des x ou des v sont des fonctions du RTOS. xTaskCreate permet de crée une tâche et vTaskStartScheduler permet de lancer l'algorithme qui va dire aux tâches de s'execute au moment où il faut.

On voit que le RTOS c'est une bibliothèque qui va nous permettre de créer des tâches et qui va s'occuper de leurs donner la main au bon moment et de s'occuper des communications entres les tâches. Pour plus de détails voir le dernier paragraphe.

Communication entres les tâches

La façon la plus simple pour communiquer entres deux tâches c'est l'utilisation de Mailbox. Dans Freertos celà s'appelle une Queue car celà gère des files d'attente de toutes sortes.

Une Queue c'est une file d'attente de structure ou de ce que l'on veut. Il y a des fonctions pour acceder aux membres de la liste d'attente et poster des messages. Ces listes sont faites pour être globales et partagées par les differentes tâches. Le RTOS garantie qu'il n'y a pas de problèmes de pertes de données si une tâche prends la main sur une autre.

xQueueHandle HeartbeatQueue;
HeartbeatColor Couleur;
#define HEARTBEAT_ITEM_SIZE           sizeof(HeartbeatColor)
#define HEARTBEAT_QUEUE_SIZE          3
 
HeartbeatQueue = xQueueCreate(HEARTBEAT_QUEUE_SIZE, HEARTBEAT_ITEM_SIZE);

Fonctions utiles

Pour aller plus loin : Comment fonctionne un RTOS?