Movatterモバイル変換


[0]ホーム

URL:


Aller au contenu
Wikipédial'encyclopédie libre
Rechercher

FreeRTOS

Un article de Wikipédia, l'encyclopédie libre.

FreeRTOS
Logo

FamilleSystème d'exploitation temps réel
Type denoyauMicronoyau
État du projetEn développement
Dépôtgithub.com/FreeRTOSVoir et modifier les données sur Wikidata
Plates-formesARM (ARM7, ARM9, Cortex-M3, Cortex-M4, Cortex-A),Atmel AVR,AVR32(en),HCS12(en),MicroBlaze,MSP430,Microcontrôleur PIC,RenesasH8/S,SuperH, RX,x86,8052,Motorola ColdFire,V850(en), 78K0R, Fujitsu MB91460 series, Fujitsu MB96340 series,Nios II(en)
Entreprise /
Fondateur
Amazon Web ServicesVoir et modifier les données sur Wikidata
Entreprise /
Développeur
Amazon, Richard Barry et FreeRTOS Team
LicenceMIT, précédemmentGNU GPL modifiée
États des sourcesLogiciel libre poursystème embarqué
Écrit enCVoir et modifier les données sur Wikidata
Dernière version stable202212.01 ()[1]
202210.01-LTS ()[2]Voir et modifier les données sur Wikidata
Site webwww.freertos.org
modifier 

FreeRTOS est unsystème d'exploitation temps réel (RTOS) faibleempreinte,portable,préemptif etOpen source pourmicrocontrôleur. Il a été porté sur plus de 40 architectures différentes. Créé en 2003 par Richard Barry et la FreeRTOS Team, il est aujourd’hui parmi les plus utilisés dans le marché des systèmes d'exploitation temps réel.

FreeRTOS est disponible gratuitement sous unelicence MIT depuis le 29 novembre 2017[3]. Les versions précédentes étaient disponibles souslicence GPL modifiée et utilisable sans paiement de redevances, cette licence n’oblige pas les développeurs à publier le code de leurs logiciels applicatifs mais impose de garder le noyau de FreeRTOS Open Source. Une licence commerciale avec le supportad hoc (OpenRTOS) est également proposée par la société High Integrity Systems.

Le nombre de tâches exécutées simultanément et leur priorité ne sont limités que par le matériel. L'ordonnancement est un système de file d'attente basé sur les Sémaphores et lesMutex. Il est basé sur le modèleRound-Robin avec gestion des priorités. Conçu pour être très compact, il n'est composé que de quelques fichiers en langage C, et n'implémente aucunpilote matériel.

Les domaines d'applications sont assez larges, car les principaux avantages de FreeRTOS sont l’exécution temps réel, un code source ouvert et une taille très faible. Il est donc utilisé principalement pour lessystèmes embarqués qui ont des contraintes d'espace pour le code, mais aussi pour des systèmes de traitement vidéo et des applications réseau qui ont des contraintes de temps réel.

Définition

[modifier |modifier le code]

FreeRTOS unsystème d'exploitation temps réellibre etopen source[4] originellement développé par Real Time Engineers Ltd[5].

En 2017, le projet et son équipe de développeurs ont été acquis par Amazon[6]. Une version spécifique de FreeRTOS appelée Amazon FreeRTOS a d'ailleurs été créée, incluant une série de librairies facilitant l'intégration avec le cloud Amazon AWS.

Il a été porté sur plus de 40 architectures et 15chaînes de compilation différentes[7]. En 2019, il a été téléchargé plus de 185 500 fois[7].

Sa conception est volontairement minimaliste pour qu'il puisse être installé sur de petits systèmes.L'image binaire dunoyau pèse entre 4KB et 9KB[8] (4,3 KB compilé sur ARM7). Le kit minimal ne compte que quelques fonctions pour gérer les tâches et la mémoire[4]. De plus, lesfiles d'attente, lessémaphores et lesmutex sont implémentés[4].

Le noyau de la version 7.3.0 n'est composé que de cinq fichiers codés enlangage C. Des sections enAssembleur permettent d'assurer la compatibilité de FreeRTOS avec les différentesarchitectures matérielles.

Un nombre illimité detâches peut être exécuté simultanément et sans contrainte[4].

Architecture

[modifier |modifier le code]

FreeRTOS a été conçu pour être très léger, de 4 kio à 9 kio[8] pour une image binaire classique dunoyau RTOS. Le noyau lui-même n'est composé que de trois fichiers source écrit enlangage C.

L’ordonnanceur

[modifier |modifier le code]

L'ordonnancement des tâches a pour but principal de décider parmi les tâches qui sont dans l'état « prêt », laquelle exécuter. Pour faire ce choix, l'ordonnanceur de FreeRTOS se base uniquement sur la priorité des tâches[9].

Les tâches en FreeRTOS se voient assignées à leur création, un niveau de priorité représenté par un nombre entier. Le niveau le plus bas vaut zéro et il doit être strictement réservé pour la tâcheIdle[10]. L'utilisateur a la possibilité de surcharger ce niveau avec une priorité personnalisée en modifiant laconstante :tskIDLE_PRIORITY.Le nombre maximum de niveaux de priorités est défini par la constante :tskMAX_PRIORITIES.Plusieurs tâches peuvent appartenir à un même niveau de priorité[11].

Dans FreeRTOS Il n'y a aucun mécanisme automatique de gestion des priorités. La priorité d'une tâche ne pourra être changée qu'à la demande explicite du développeur[10].

Les tâches sont de simples fonctions qui généralement s’exécutent enboucle infinie[12] et qui suivent la structure générique suivante :

voidvATaskFunction(void*pvParameters){for(;;){--Ajouterlecodedevotretâcheici--}}


Dans le cas d'un micro-contrôleur possédant un seul cœur, il y aura à tout moment une seule tâche en exécution[13]. L’ordonnanceur garantira toujours que la tâche de plus haute priorité pouvant s’exécuter sera sélectionnée pour entrer dans l'état d’exécution[9]. Si deux tâches partagent le même niveau de priorité et sont toutes les deux capables de s'exécuter, alors les deux tâches s'exécuteront en alternance par rapport aux réveils de l’ordonnanceur (round robin)[9].

Afin de choisir la tâche à exécuter, l'ordonnanceur doit lui-même s'exécuter et préempter la tâche en état d'exécution. Afin d'assurer le réveil de l'ordonnanceur, FreeRTOS définit une interruption périodique nommé la "tick interrupt"[9]. Cette interruption s'exécute infiniment selon une certainefréquence qui est définie dans lefichierFreeRTOSConfig.h par la constante :

configTICK_RATE_HZ/* Fréquence d’exécution de la "tick interrupt" en Hz. */

Cette constante décrit alors la période de temps allouée au minimum pour chaque tâche ou expliqué autrement, l'intervalle séparant deux réveils de l’ordonnanceur[9].

Comme décrit dans cette section, FreeRTOS est donc un RTOS qui utilise un ordonnancement préemptif pour gérer les tâches. Néanmoins il peut aussi utiliser optionnellement (si la directive lui est donnée)l'ordonnancement coopératif[14]. Dans ce mode d'ordonnancement, un changement de contexte d’exécution a lieu uniquement si la tâche en exécution permet explicitement à une autre tâche de s’exécuter (en appelant un Yield() par exemple) ou alors en entrant dans un état de blocage[14]. Les tâches ne sont donc jamais préemptées. Ce mode d’ordonnancement simplifie beaucoup la gestion des tâches malheureusement il peut mener à un système moins efficace et moins sûr.

FreeRTOS peut aussi utiliser un ordonnancement hybride, utilisant l'ordonnancement préemptif et l’ordonnancement coopératif[14]. Dans ce mode, un changement de contexte d’exécution peut aussi avoir lieu lors de l’événement d'une interruption.

La famine

[modifier |modifier le code]

Dans FreeRTOS, la tâche de plus haute priorité prête à s'exécuter sera toujours sélectionnée par l'ordonnanceur. Ceci peut amener à une situation defamine[15]. En effet, si la tâche de plus haute priorité n'est jamaisinterrompue, toutes les tâches ayant une priorité inférieure ne s’exécuteront jamais.FreeRTOS n’implémente aucun mécanisme automatique pour prévenir le phénomène de famine[9]. Le développeur doit s'assurer lui-même qu'il n'y ait pas de tâches monopolisant tout le temps d’exécution du micro-contrôleur[16]. Pour cela, il peut placer des événements qui interrompront la tâche de plus haute priorité pour un temps déterminé ou jusqu'à l’avènement d'un autre événement et laissant ainsi le champ libre aux tâches de priorités inférieures pour s’exécuter.

Afin d'éviter la famine, le développeur peut utiliserl'ordonnancement à taux monotones (RMS)[14]. C'est une technique d'assignation de priorité qui attribue à chaque tâche une unique priorité selon sa fréquence d’exécution. La plus grande priorité est attribuée à la tâche de plus grande fréquence d’exécution et la plus petite priorité est attribuée à la tâche de plus petite fréquence.L'ordonnancement à taux monotones permet de maximiser l'ordonnançabilité des tâches mais cela reste difficile à atteindre du fait de la nature des tâches qui ne sont pas totalement périodiques[14].

La tâche Idle

[modifier |modifier le code]

Un micro-contrôleur doit toujours avoir quelque chose à exécuter[17]. En d'autres termes, il doit toujours y avoir une tâche en exécution. FreeRTOS gère cette situation en définissant la tâche Idle qui est créée au lancement de l’ordonnanceur[17]. La plus petite priorité du noyau est attribué à cette tâche. Malgré cela, la tâche Idle peut avoir plusieurs fonctions à remplir dont :

  • Libérer l'espace occupé par une tâche supprimée[17].
  • Placer le micro-contrôleur en veille afin d'économiser l'énergie du système lorsqu'aucune tâche applicative n'est en exécution[17].
  • Mesurer le taux d'utilisation duprocesseur[17].

La description des tâches

[modifier |modifier le code]

Dans FreeRTOS, chaque tâche est décrite par un TCB (Task control Block) qui contient toutes les informations nécessaires afin de spécifier et de représenter une tâche[18].

Diagramme d'état d'une tâche
Task Control Block
VariablesDescription
pxTopOfStackPointeur vers le dernier élément placé en haut de la pile
xGenericListItemÉlément (xListItem) de laliste utilisé pour placer la TCB dans une listed'états (Prêt, bloqué ou suspendu).
xEventListItemÉlément (xListItem) de la liste utilisé pour placer la TCB dans une liste d’événements.
uxPriorityPriorité de la tâche
pxStackPointeur vers le début de la pile du processus
pxEndOfStackPointeur vers la fin de la pile du processus
uxTCBNumberTaille de la pile en nombre de variables
pcTaskNameNombre s'incrémentant à chaque fois qu'une TCB est créée (utilisé pour le débogage)
uxBasePriorityLa dernière priorité assignée à la tâche
ulRunTimeCounterCalcule le temps passé par la tâche dans un état d’exécution
pxTaskTagPermet d'ajouter un Tag à une tâche. Le Tag s'utilise pour réaliser des Log via les sorties analogique ou digitales grâce à la fonction traceSWITCHED_IN().
uxCriticalNestingPermet de sauvegarder la profondeur d'imbrication des sections critiques de cette tâche. À chaque fois que la tâche entre dans une section critique, la variable est incrémentée, elle est décrémentée dès que la tâche sort d'une section critique.

Cette variable est nécessaire, car il est possible que la tâche rende la main pendant qu'elle est en section critique.

Les tâches sous FreeRTOS peuvent exister sous 5 états : "supprimé", "suspendu", "prêt", "bloqué" ou "en exécution"[18].

Dans FreeRTOS, il n'y a aucunevariable pour spécifier explicitement l'état d'une tâche, en contrepartie FreeRTOS utilise des listes d'états. La présence de la tâche dans un type de listes d'états détermine son état (prêt, bloqué ou suspendu). Les tâches changeant souvent d'état, l’ordonnanceur n'aura alors qu'à déplacer la tâche (l'élément (xListItem) appartenant à cette même tâche) d'une liste d'états à une autre[18].

À la création d'une tâche, FreeRTOS crée et remplit la TCB correspondant à la tâche, puis il insère directement la tâche dans une "Ready List" (Liste contenant une référence vers toutes les tâches étant dans l'état "Prêt")[18].

FreeRTOS maintient plusieurs "Ready List", une liste existe pour chaque niveau de priorité. Lors du choix de la prochaine tâche à exécuter, l’ordonnanceur analyse les "Ready list" de la plus haute priorité à la plus basse[18].

Plutôt que de définir explicitement un état "en exécution" ou une liste associée à cet état, le noyau FreeRTOS décrit une variable "pxCurrentTCB" qui identifie le processus en exécution. Cette variable pointe vers la TCB correspondant au processus se trouvant dans l'une des 'Ready list'[18].

Une tâche peut se retrouver dans l'état "bloqué" lors de l’accès à une file enlecture/écriture dans le cas où la file est vide/pleine. Chaque opération d'accès à une file est paramétrée avec un timeout (xTicksToWait), Si ce timeout vaut 0 alors la tâche ne se bloque pas et l'opération d'accès à la file est considérée comme échouée. Dans le cas où le timeout n'est pas nul, la tâche se met dans l'état 'bloqué' jusqu'à ce qu'il y ait une modification de la file (par une autre tâche par exemple). Une fois l'opération d'accès à la file possible, la tâche vérifie que son timeout n'est pas expiré et termine avec succès son opération[18].

Une tâche peut être volontairement placée dans l'état "suspendu", elle sera alors totalement ignorée par l’ordonnanceur et ne consommera plus aucune ressource jusqu'à ce qu'elle soit retirée de l'état et remise dans un état "prêt"[19].

Le dernier état que peut prendre une tâche est l'état "supprimé", cet état est nécessaire car une tâche supprimée ne libère pas ses ressources instantanément. Une fois dans l'état "supprimé", la tâche est ignorée par l'ordonnanceur et une autre tâche nommée "IDLE" est chargée de libérer les ressources allouées par les tâches étant en état "supprimé"[18].

La tâche 'IDLE' est créée lors du démarrage de l'ordonnanceur et se voit assigner la plus petite priorité possible ce qui conduit à une libération retardée desressources lorsque aucune autre tâche est en exécution[20].

Les structures de données de FreeRTOS

[modifier |modifier le code]

Les Listes

[modifier |modifier le code]

Les listes sont lesstructures de données les plus utilisées dans FreeRTOS. Elles sont utilisées pour organiser et ordonnancer les tâches, ainsi que pour l’implémentation des files[18].

FreeRTOS définit plusieurs structures afin de représenter les listes :

  • La structurexLIST représente l'en-tête des listes qui sont créées et utilisées par l'ordonnanceur. Par exemple, les listes des tâches prêtes (une liste par niveau de priorité), la liste des tâches bloquées, etc. Cette structure contient d'une certaine façon les autres structures de listes utilisées par FreeRTOS[18].

La structurexLIST est définie comme suit :

typedefstructxLIST{volatileunsignedportBASE_TYPEuxNumberOfItems;/* Le nombre d'éléments dans cette liste. */volatilexListItem*pxIndex;/* Pointeur utilisé pour parcourir cette liste,                                                         il pointe successivement sur les éléments (xLIST_ITEM)                                                         contenus dans cette liste. */volatilexMiniListItemxListEnd;/* Élément marquant la fin de cette liste.                                                         Elle contient pour cela la valeur maximale de la variable                                                         xItemValue dans la liste. */}xList;


  • La structurexLIST_ITEM représente les éléments d'une liste (de Type xLIST). Chaque élément d'une liste est liée à une tâche et les différentes variables de la structurexLIST_ITEM servent à organiser les tâches et à les lier entre elles afin de former une liste doublement chaînée[18].

La structurexLIST_ITEM est définie comme suit :

structxLIST_ITEM{portTickTypexItemValue;/* Une valeur attribuée à cet élément,                                                cette valeur est utilisée afin de trier                                                la liste (de type (xLIST) contenant cet élément (xLIST_ITEM))                                                dans un ordre décroissant. */volatilestructxLIST_ITEM*pxNext;/* Pointeur vers le prochain élément (xLIST_ITEM)                                                dans la liste (xLIST). */volatilestructxLIST_ITEM*pxPrevious;/* Pointeur vers le précédent élément (xLIST_ITEM)                                                dans la liste (xLIST). */void*pvOwner;/* Pointeur vers l'objet contenant cet élément,                                                cet objet est, dans la plupart des cas, le TCB d'une tâche. */void*pvContainer;/* Pointeur vers la liste (xLIST) dans laquelle cet                                                élément est contenu. */};


  • La structureXMiniListItem est une version réduite deXLIST_ITEM. Elle ne dispose pas des variablespvOwner etpvContainer. Elle représente un élément marquant la fin de cette liste.


Description d'un chaînage de tâche dans FreeRTOS

Les files

[modifier |modifier le code]

Les files sont les mécanismes principaux qui permettent de faire communiquer et synchroniser les tâches entre elles[18].

La structure basique d'une file est décrite comme suit :

typedefstructQueueDefinition{signedchar*pcHead;/* Pointeur sur l'octet de début de la file                                               en mémoire */signedchar*pcTail;/* Pointeur sur l'octet de fin de la file                                               en mémoire (un octet de plus que nécessaire,                                               car utilisé comme un marqueur de fin).  */signedchar*pcWriteTo;/* Pointeur sur le prochain [[octet]] libre dans la                                               file. */signedchar*pcReadFrom;/* Pointeur sur le dernier octet lu de la file. */xListxTasksWaitingToSend;/* Liste des tâches (ordonnées par niveau de priorités)                                               qui sont bloquées en attente d’écriture                                               sur la file. */xListxTasksWaitingToReceive;/* Liste des tâches (ordonnées par niveau de priorités)                                               qui sont bloquées en attente de lecture depuis la                                               file .*/volatileunsignedportBASE_TYPEuxMessagesWaiting;/* Nombre d'éléments actuellement contenus                                                         dans la file. */unsignedportBASE_TYPEuxLength;/* Taille de la file définit comme le nombre                                                         d'éléments maximum qu'elle peut contenir                                                         et non le nombre d'octets. */unsignedportBASE_TYPEuxItemSize;/* Taille de chaque élément (en octet) que                                                         la file pourra contenir. */}xQUEUE;


Une file contient un nombre fini d'éléments de taille fixe[21]. La taille physique d'une file est déterminée par le nombre maximum d'éléments qu'elle peut contenir (uxLength) multiplié par la taille en octet de chaque élément (uxItemSize).

Dans FreeRTOS, l'écriture ou l'envoi de données dans une file est effectuée en copiant octet par octet et quel que soit son type[21],[18] car la durée de vie de l'élément sauvegardé est bien souvent inférieure à la durée de vie de la file[18].À l'instar de l'opération d'écriture, la lecture ou réception de données est également effectuée en copiant octet par octet la donnée qui sera supprimée de la file[21].

Les files sont des objets indépendants, il n'y a aucune assignation ou appartenance à une tâche[21]. Elles sont les structures qui permettent aux tâches de communiquer entre elles. De ce fait, elles peuvent avoir plusieurs tâches en lecture et en écriture simultanément.

Les opérations d'écriture ou de lecture sur les files peuvent être bloquantes ou non-bloquantes. Les opérations non-bloquantes retournent directement le statutréussi ouéchoué sur la file. Les opérations bloquantes sont paramétrées avec un timeout qui leur permet de se bloquer et qui détermine le temps maximum pendant lequel elles peuvent rester dans cet état[18].

La gestion des ressources

[modifier |modifier le code]

FreeRTOS utilise les files comme moyen de communication entre les tâches. Cependant, les files gèrent aussi la synchronisation et la concurrence entre les tâches[18]. De ce fait, cette structure est l'élément de base pour la gestion des ressources dans FreeRTOS.

FreeRTOS synchronise les tâches en utilisant principalement deux mécanismes :les Sémaphores etles Mutex[18].

Sémaphores

[modifier |modifier le code]
Schéma basique d'utilisation d'un sémaphore binaire

FreeRTOS permet la création et l'utilisation deSémaphores à plusieurs éléments[22]. Les sémaphores sont implémentés sous forme defile tel que le nombre d'éléments du sémaphore représente le nombre d'éléments maximum que la file peut contenir. La file représentant le sémaphore ne sauvegarde aucune donnée, elle s'occupe uniquement d'enregistrer le nombre de ses entrées actuellement occupées[18]. La taille des éléments de la file est donc nulle (uxItemSize=0).Un accès au Sémaphore ne fait qu'augmenter ou diminuer le nombre d'entrées occupées dans la file et aucune copie d'élément n'est effectuée[18].

L'API offerte par FreeRTOS pour la gestion des sémaphores fait une différence entre les sémaphores à N éléments et les sémaphore binaires[23]. Les Sémaphores binaires peuvent être vus comme des files ne pouvant contenir qu'un seul élément.Un Sémaphore binaire ne pourra donc être pris qu'une seule fois avant qu'il ne devienne indisponible contrairement au Sémaphore à n éléments qui pourra être pris à plusieurs reprises ce qui permet par exemple, de définir un nombre de ressources disponibles ou alors de compter le nombre d'événements qui doit être encore exécuté[24].

Mutex

[modifier |modifier le code]
Schéma d'utilisation d'un Mutex pour assurer l'exclusion mutuelle

UnMutex est utilisé afin de protéger une ressource partagée.

L’implémentation des Mutex dans FreeRTOS est similaire à celle des Sémaphores binaires (sous la forme d'une file)[25] sauf que la tâche qui prend le Mutex doit obligatoirement le rendre. Cela peut être vu comme l'association d'un jeton à une ressource, une tâche prend le jeton et utilise la ressource puis rend le jeton à la fin, au même moment aucun autre jeton supplémentaire ne pourra être associé à la tâche.

Une autre différence majeure entre les Mutex et les Sémaphores binaires dans FreeRTOS est le système d'héritage de priorité. Quand plusieurs tâches demandent à prendre un Mutex, la priorité du détenteur du Mutex est fixée momentanément à la valeur de la plus haute priorité parmi les tâches qui attendent sa libération. Cette technique a pour effet de prévenir les phénomènes à risquesd'inversion de priorité même si cela ne garantit pas une sécurité infaillible face à ces phénomènes.


La gestion des interruptions

[modifier |modifier le code]

Une interruption est un mécanisme purement matériel qui est implémenté et lancé par ce dernier.FreeRTOS ne fait que fournir des méthodes servant à la gestion des interruptions et il peut également lancer des interruptions par appel à une instruction matérielle[26].

FreeRTOS n'impose aux développeurs aucune stratégie spécifique pour la gestion des interruptions mais il offre plusieurs moyens pour que la stratégie choisie puisse être implémentée et maintenue facilement.

Les routines d'interruptions (ISR) sont des fonctions exécutées par le micro-contrôleur lui-même et qui ne peuvent être gérées par FreeRTOS[27], ce qui peut poser certains problèmes. Pour ces raisons, les routines d'interruptions ne peuvent pas utiliser les fonctions habituelles de l'API FreeRTOS que toute autre tâche basique peut utiliser. Néanmoins FreeRTOS définit un groupe de fonctions spécialement conçues pour les ISR, par exemple, une ISR utilisera la fonctionxSemaphoreGiveFromISR() plutôt quexSemaphoreGive(), de la même manière, elle utilisera la fonctionxQueueReceiveFromISR() plutôt quexQueueReceive().

Gestion d'interruptions matérielles par FreeRTOS selon leurs niveaux de priorité

Afin de spécifier une politique de gestion des interruptions et de gérer l'accès aux fonctions du noyau spécifiques aux ISR, FreeRTOS définit des constantes dans le fichier de configurationFreeRTOSConfig.h :

  • configKERNEL_INTERRUPT_PRIORITY : Définit le niveau de priorité de l'interruption temporelle (ang. Tick interrupt) qui est une interruption périodique utilisée pour lancer l'ordonnanceur à chaque intervalle de temps[9].
  • configMAX_SYSCALL_INTERRUPT_PRIORITY : Définit le plus haut niveau de priorité pour lequel les fonctions spécifiques aux ISR de FreeRTOS peuvent être utilisées.

La définition de ces deux constantes permet de spécifier une politique de gestion des ISR selon leur niveau de priorités :

  • une ISR ayant un niveau de priorité compris entreconfigKERNEL_INTERRUPT_PRIORITY etconfigMAX_SYSCALL_INTERRUPT_PRIORITY pourra utiliser les fonctions de l'API spécifique aux ISR, pourra préempter une tâche, mais pas le noyau ni une tâche exécutant unesection critique. Elle ne pourra pas être préemptée par l'ordonnanceur car l'interruption du tick timer a une priorité plus basse.
  • une ISR ayant un niveau de priorité strictement supérieur àconfigMAX_SYSCALL_INTERRUPT_PRIORITY pourra préempter l'ordonnanceur, même lors de l’exécution de sections de code critique. En contrepartie elle n'aura plus accès à aucune des fonctions de l'API de FreeRTOS[28].
  • une ISR n'utilisant aucune des fonctions de l'API de FreeRTOS peut utiliser n'importe quel niveau de priorité[28].

La définition des deux constantes précédentes ajoute aussi aux ISR la particularité d'imbrication d'interruptions (ang. Interrupt Nesting)[29].L'imbrication d'interruptions est la possibilité qu'une deuxième interruption ait lieu au même moment que le traitement d'une autre interruption par une ISR. Cette deuxième interruption peut préempter la première si elle dispose d'une priorité plus élevée.

Il est à noter que les priorités des interruptions sont définies par l'architecture du micro-contrôleur. Ce sont des priorités matérielles qui n'ont aucune relation avec les priorités logicielles que l'on peut attribuer aux tâches grâce à FreeRTOS[29].

Les interruptions différées

[modifier |modifier le code]
Schéma décrivant l'utilisation d'une interruption différée

Comme spécifié précédemment, les ISR sont des sections de code exécutées par le micro-contrôleur et non par FreeRTOS. Ce qui amène à des comportements inattendus du noyau. Pour cette raison, il est nécessaire de réduire au maximum le temps d’exécution d'une ISR.Une stratégie pour réduire le temps d’exécution est d'utiliser les Sémaphores binaires offerts par FreeRTOS. Un Sémaphore binaire peut être utilisé afin de débloquer une tâche à chaque fois qu'une interruption particulière a lieu. Ainsi la partie de code exécutée dans l'ISR pourra être très largement réduite et la gestion de l'interruption reviendra en grande partie à la tâche débloquée. On aura ainsidifféré le processus d'interruption vers une simple tâche[30].

Si l'interruption s'avère être critique, alors la priorité de la tâche de gestion de l’interruption pourra être définie de manière à toujours préempter les autres tâches du système[30].

Suspension des interruptions

[modifier |modifier le code]

FreeRTOS permet de protéger des sections de code appartenant à une tâche de tout changement de contexte, d'opération de l’ordonnanceur ou même d'une levée d'interruption, ces portions de code sont appeléessections critiques.L'utilisation de sections critiques peut être efficace pour respecter l'atomicité de certaines instructions. Néanmoins ces sections critiques sont à utiliser avec précaution car pendant leur exécution, le système reste statique et totalement inactif envers d'autres tâches critiques qui seraient bloquées ou alors envers des interruptions signalant des événements extérieurs critiques.

Afin de définir une partie de code comme étant une section critique, il suffit de l'englober entre les deux instructions de début et de fin de section critique :taskENTER_CRITICAL() ettaskEXIT_CRITICAL()[31].

La gestion de la mémoire

[modifier |modifier le code]

Lenoyau FreeRTOS doit allouer dynamiquement lamémoireRAM à chaque fois qu'unetâche, unefile ou unSémaphore est créé[32].L'utilisation des traditionnelles méthodesMalloc() etFree() est toujours possible mais elle peut poser quelques problèmes car elles ne sont pas déterministes et elles peuvent souffrir d'une mémoire trop fragmentée. De ce fait, deux méthodes reprenant les mêmes prototypes existent dans FreeRTOS :pvPortMalloc() etvPortFree()[32].

Chacune d'elles est implémentée de trois manières différentes décrites dans les fichiersHeap_1.c,Heap_2.c etHeap_3.c mais l'utilisateur est libre de définir ses propres fonctions[32].

La constanteconfigTOTAL_HEAP_SIZE définie dans le fichier de configurationFreeRTOSConfig.h

La première implémentation

[modifier |modifier le code]
Schéma explicatif de la première implémentation de l'allocation de la mémoire dans FreeRTOS

Cette version ne définit pas de méthode pour libérer de l'espace mémoire RAM[32].

La mémoire est divisée en un tableau de tailleconfigTOTAL_HEAP_SIZE (en octets) nommé "la pile FreeRtos"[32].

Lorsque le noyau a besoin d'allouer de la mémoire, il réserve deux espaces libres pour une même tâche. Le premier est utilisé pour la TCB alors que le second représente la file[32]. Dans la mesure où l'espace mémoire des tâches n'est jamais libéré, la pile se remplit jusqu'à épuisement de l'espace disponible.

La deuxième implémentation

[modifier |modifier le code]
Schéma explicatif de la seconde implémentation de l'allocation de la mémoire dans FreeRTOS

Cette représentation se différencie de la première par le fait qu'elle dispose d'une méthodevPortFree() qui libère la mémoire allouée pour une tâche et peut l'allouer de nouveau à une autre tâche[33]. Il faut que la taille du bloc mémoire de la nouvelle tâche soit au maximum égale à la taille du bloc de l'ancienne tâche.

La troisième implémentation

[modifier |modifier le code]

Il ne s'agit ici que d'une redéfinition deMalloc() etFree() mais où la sécurité a été augmentée en suspendant toutes les tâches pendant la durée de l'opération sur la mémoire[34].

Caractéristiques

[modifier |modifier le code]

Architectures matérielles supportées

[modifier |modifier le code]

Services fournis et domaines d'application

[modifier |modifier le code]

Grâce à son très faible encombrement mémoire et son portage sur de nombreuses architectures matérielles, FreeRTOS est principalement utilisé comme système d'exploitation embarqué[35]. Il a été implémenté sur des périphériques mobiles et est souvent utilisé sur les processeurs ARM.

Étant un système d'exploitation purement orienté temps réel et livré sans application, il sert souvent de socle pour le développement d'API spécifiques et/ou propriétaires.Il est donc utilisé dans des domaines très variés où la contrainte temps réel est forte, comme les appareils de surveillance médicale, les outils de contrôle sismique et d'environnement ou encore le pilotage d'appareils et de robots industriels[36].Ses fonctionnalités de gestion des tâches permettent de garantir l'intégrité des données collectées en temps réel par l'utilisation des plus hauts niveaux de priorités[36].

Le domaine technique dans lequel cesystème temps réel est le plus utilisé est le réseau, et plus particulièrement pour latransmission de données sur des réseaux sans fils.Pour des réseaux à très haute fréquence comme leWPAN, sur des architectures matérielles à très faible capacité mémoire, des phénomènesd'overflow interviennent durant les échanges pour des systèmes à boucle unique. Cependant l'implémentation de ces échanges sous forme de différentes tâches complique le développement.Grâce à sa gestion des priorités et son ordonnanceur multitâche, FreeRTOS permet d'éliminer ce type de problèmes[37].Chaque tâche ayant un bloc réservé, le phénomène d'overflow est supprimé car il n'y a plus de dépassement mémoire par manque de ressources.

Pour les applications de contrôle commel'eye-tracking à base de matériel embarqué à ressources limitées, FreeRTOS fournit un core pour le système de base gérant le matériel permettant d'y ajouter des applications spécifiques[38]. Là encore c'est surtout l'ordonnanceur et son système de gestion et de priorité des tâches qui est primordial pour ce type d'application. Lefirmware de ce périphérique mobile est composée de 3 couches, la HAL qui gère lacouche d'abstraction matérielle, la DEL qui gère les composants additionnels au processeur et la TAL qui est la partie tâches qui gère FreeRTOS. Ce type d'application est destinée à s'adapter à l’utilisateur en fonction de ces réactions perçues au travers des mouvements de ses yeux.

FreeRTOS est très utilisé aussi pour l'implémentation de pile réseau et est souvent associé à uIP. Pour les périphériques mobiles comme les téléphones, on peut même le retrouver pour la gestion de la vidéo[39].On l'utilise aussi souvent pour des implémentations decouche réseau MAC comme le protocole 802.15.4 très utilisé pour les réseaux de capteurs sans fil[37].Une des forces de FreeRTOS est aussi son aspect open-source et le fait qu'il permet l'implémentation de couches réseaux IP très légères et facilement portable comme uIP ou lwIP[40].

Un autre grand domaine d'application est leréseau de capteurs sans fils. Ces systèmes consistent en un ensemble de capteurs transmettant leurs données à un nœud pour éventuellement les envoyer à un système central. Ce type de réseau est présent dans le domaine médical pour monitorer les patients ou dans l'agriculture pour localiser et surveiller les élevages[41].

FreeRTOS est le système d'exploitation temps réelde prédilection dans ce domaine[réf. nécessaire] car les capteurs consomment très peu d’énergie et disposent de ressources RAM très limitées[42].

La consommation électrique est aussi un argument en faveur de FreeRTOS. Les périphériques mobiles de toutes sortes ont en commun cette contrainte essentielle, et ce système d'exploitation permet un traitement temps réel tout en garantissant un minimum de consommation électrique[43].

Avec la convergence des différentes technologies et leur miniaturisation, FreeRTOS permet d'allier des implémentations de piles réseau simples et efficaces aux besoins d'économie d'énergie. Les nouveaux périphériques mobiles comme les téléphones en sont un bon exemple[40]. Cette solution logicielle permet aussi d'abaisser fortement les coûts de fabrication[44].

Ayant été porté sur beaucoup d'architectures et avec le développement de carte notamment à base deFPGA intégrant descartes réseau, FreeRTOS permet d'avoir des systèmes avec un système adapté permettant de se focaliser sur les objectifs finaux du projet[45],[46].

Cependant étant sous licence GPL, même s'il permet le développement d'applications propriétaires, son code source doit rester ouvert et il est donc privilégié dans le domaine de la recherche et de l'enseignement[47].Ses concurrents propriétaires commeQNX sont le plus souvent choisis dans le monde de l'industrie.

Dans le domaine de l'enseignement là aussi, les différentes utilisations sont nombreuses.FreeRTOS est utilisé pour étudier l'implémentation d'ordonnanceur, la gestion de tâches et la programmation modulaire[48]. Il permet également de développer des applications dans le domaine de l'électronique comme la lecture de température et son affichage[49].

FreeRTOS a aussi fait naître des frameworks grâce à son code ouvert, sa faible taille, ses possibilités de mise à l'échelle ainsi que son extensibilité[50]. Certains de ces frameworks sont utilisés dans le secteur automobile[51]

Solutions alternatives

[modifier |modifier le code]

Déclinaisons de FreeRTOS

[modifier |modifier le code]

Le projet FreeRTOS a donné naissance à deux versions de systèmes d'exploitation temps réel basés sur le noyau FreeRTOS : OpenRTOS et SafeRTOS.

OpenRTOS

[modifier |modifier le code]

OpenRTOS est une version commerciale de FreeRTOS, qui inclut une suite de pilotes de connexion USB, unsystème de fichier FAT ainsi qu'une pile TCP/IP.La licence commerciale libère les utilisateurs de OpenRTOS de l'obligation de publier leurs modifications du noyau FreeRTOS et leur offre le support commercial et les protections nécessaires pour leurs réalisations[52].

OpenRTOS est fourni parA global engineering company sous licence deReal Time Engineers Ltd[7].

SafeRTOS

[modifier |modifier le code]

SafeRTOS est un système d'exploitation temps réel destiné au marché dessystèmes critiques. Il a été développé par la sociétéWHIS (WITTENSTEIN high integrity systems) en partenariat avecReal Time Engineers Ltd[53].

SafeRTOS et FreeRTOS partagent le même algorithme d'ordonnancement, la même API, les mêmes exigences en matière de RAM et de ROM et fonctionnent sur les mêmes types de micro-contrôleurs. Cependant ils ont été développés différemment et avec différents objectifs[54],[55].

FreeRTOS a été le sujet d'une étudeHAZOP qui a identifié plusieurs faiblesses fonctionnelles et comportementales liées à l'API ou à de possibles erreurs de l'utilisateur du système. Afin de résoudre ces faiblesses, SafeRTOS a été développé à travers un cycle de développementCEI 61508SIL de niveau 3[55]. SafeRTOS est certifié SIL3 par l'organisme allemand de certification et de normalisationTÜV[56].

Une des grandes particularités de SafeRTOS est son empreinte mémoire ne dépassant pas les 14KB ce qui lui permet de résider directement dans la mémoire ROM d'un micro-contrôleur[55]. De plus, lors de son implémentation en mémoire ROM le code de SafeRTOS ne peut être utilisé que dans sa configuration initiale et ne peut plus être changé, ce qui élimine les possibles défaillances du système liées aux erreurs d'utilisateur et facilite la certification et la validation du système basé sur le noyau SafeRTOS[57].

SafeRTOS est utilisé dans plusieurs systèmes commerciaux, notamment dans certains micro-contrôleurs Stellaris ARM deTexas Instruments[58].

SafeRTOS est fourni parA global engineering company sous licence deReal Time Engineers Ltd[7].

Distinctions

[modifier |modifier le code]
  • Le système d'exploitation temps réel le plus utilisé en 2011 et 2012[59].
  • Le système d'exploitation temps réel considéré comme futur projet en 2011 et 2012[59].

Notes et références

[modifier |modifier le code]

Références

[modifier |modifier le code]
  1. « FreeRTOSv202212.01 Latest »,(consulté le)
  2. « 202210.01-LTS (November 2022) »,(consulté le)
  3. (en-US) « Announcing FreeRTOS Kernel Version 10 | Amazon Web Services »,Amazon Web Services,‎(lire en ligne, consulté le).
  4. abc etdMelot 2009+,p. 4.
  5. Contact, Support and Advertising for FreeRTOS.
  6. (en-US) « Announcing Amazon FreeRTOS – Enabling Billions of Devices to Securely Benefit from the Cloud | Amazon Web Services »,Amazon Web Services,‎(lire en ligne, consulté le).
  7. abc etdFreeRTOS, Homepage.
  8. a etbFreeRTOS, Homepage : Why Choose FreeRTOS ? 2007.
  9. abcdef etgBarry 2009,p. 15.
  10. a etbMelot 2009+,p. 08.
  11. Barry 2009,p. 28.
  12. Barry 2009,p. 04.
  13. Barry 2009,p. 05.
  14. abcd eteBarry 2009,p. 44.
  15. Barry 2009,p. 19.
  16. Melot 2009+,p. 09.
  17. abcd eteBarry 2009,p. 29.
  18. abcdefghijklmnopqr etsSvec 2012.
  19. Barry 2009,p. 32.
  20. Barry 2009,p. 42.
  21. abc etdBarry 2009,p. 47.
  22. Melot 2009+,p. 12.
  23. Barry 2009,p. 80.
  24. Barry 2009,p. 83.
  25. Barry 2009,p. 105.
  26. Melot 2009+,p. 16.
  27. Melot 2009+,p. 17.
  28. a etbBarry 2009,p. 95.
  29. a etbBarry 2009,p. 94.
  30. a etbBarry 2009,p. 69.
  31. Melot 2009+,p. 18.
  32. abcde etfBarry 2009,p. 135.
  33. Barry 2009,p. 138.
  34. Barry 2009,p. 139.
  35. Woodcock 2009,p. 24.
  36. a etbYu 2009,p. 2.
  37. a etbWauthy 2010,p. 3.
  38. Bulling 2008,p. 3.
  39. Szczesny 2009,p. 3.
  40. a etbBorchert 2012,p. 446.
  41. Schoofs 2009,p. 3.
  42. Chen 2010,p. 3.
  43. Mera 2010.
  44. Borchert 2012,p. 435.
  45. Huangfu 2009,p. 2.
  46. Tardieu 2009,p. 4.
  47. Machanick 2011,p. 2.
  48. Vanhatupa 2010,p. 2.
  49. Salminen 2011,p. 4.
  50. Inam 2011.
  51. Vu 2012,p. 7.
  52. OpenRTOS, Homepage.
  53. SafeRTOS, Homepage.
  54. Yan 2008,p. 3728.
  55. ab etcSafeRTOS, Overview.
  56. SafeRTOS, Certification.
  57. Texas Instruments SafeRTOS.
  58. Texas Instruments stellaris.
  59. a etbEETIMES Embedded Market Study 8 avril 2011.

Annexes

[modifier |modifier le code]

Bibliographie

[modifier |modifier le code]

Articles connexes

[modifier |modifier le code]

Liens externes

[modifier |modifier le code]
v ·m
Apple
Mac OSClassic
Dérivés de NeXTSTEP
Dérivés deBeOS
DOS
IBM
Microsoft Windows
Fondés sur MS-DOS
Branche NT
ReactOS Foundation
Branche NT (GPL/LGPL/AGPL) non-Microsoft
POSIX /Unix
AT&T /Laboratoires Bell
BSD
GNU Hurd
Linux(liste)
Autres dérivés
Dérivés d'AmigaOS
Dérivés duTOS
D’importance historique
Mobile
Noyau Linux
Autres noyaux
Embarqués
Pour capteur en réseau
Pour carte à puce
Temps réel
Autres systèmes
Pour une liste complète, voir laliste des systèmes d’exploitation et lacatégorie « Système d’exploitation ».
Ce document provient de « https://fr.wikipedia.org/w/index.php?title=FreeRTOS&oldid=227551387 ».
Catégorie :
Catégories cachées :

[8]ページ先頭

©2009-2026 Movatter.jp