Démonstration FreeRTOS ?

Bonjour @le_viking,

En fait FreeRTOS permet d'implémenter le multitâche ?

Voici un exemple développé à l'aide de L'IA sous VS Code où deux tâches s'exécutent en même temps :

  • une tâche fait clignoter la LED de l'ESP32 DEVKIT V1 ;
  • l'autre affiche l'incrémentation d'une variable nommée result de 1 à 1000 et puis s'arrête.

Les deux tâches s'effectuent en même temps jusqu'à la fin de la 2ème.

Voici le code :

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"

#define LED_GPIO GPIO_NUM_2

void led_task(void *pvParameters) {
    gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);

    while (1) {
        gpio_set_level(LED_GPIO, 1);
        vTaskDelay(500 / portTICK_PERIOD_MS);
        gpio_set_level(LED_GPIO, 0);
        vTaskDelay(500 / portTICK_PERIOD_MS);
    }
}

void calc_task(void *pvParameters) {
    int result = 0;
    for (int i = 1; i <= 1000; ++i) {
        result = i;
        printf("Somme  = %d\n", result);
        vTaskDelay(200 / portTICK_PERIOD_MS);
    }
    printf("Calcul terminé \n");
    vTaskDelete(NULL); // Fin de la tâche
}


void app_main(void) {
    xTaskCreate(led_task, "LED Task", 2048, NULL, 1, NULL);
    xTaskCreate(calc_task, "Calculation Task", 4096, NULL, 1, NULL);
}

Bonne journée.

C'est une question, ou une affirmation ?

Bonjour @terwal,

Et bien en fait c'est un peu les deux. Je n'y connais rien du tout. C'est ce que je comprends mais il y a un point d'interrogation pour confirmer, infirmer ou compléter ...

C'est une invitation à échanger sur le sujet.

Bonne journée.

PS : Je pars profiter du soleil et de la nature pour aujourd'hui.

ok, je n'étais pas sûr.
Par définition les systèmes RTOS, permettent le temps réel, c'est à dire qu'une tâche prends toujours le même temps et qu'il n'y a aucune action qui est différées ou interfères.
Ce qui n'est pas possible avec des OS, non spécifiquement conçue pour le temps réel.

Je crois que de base FreeRTOS à été conçu pour du matériel équivalent à de PC, mais qui est suffisamment ouvert, pour avoir des implémentation sur des µC.

Donc RTOS, permet effectivement le multitâche "réel", ce qui n'est pas le cas dans un linux ou OS équivalent, même en restreignant à une tâche par cœurs.

Donc comme qui peut le plus peut le moins, RTOS permet d'avoir un multitâche ultra performant. Mais ce n'est pas la seul solution d'avoir du multitâche, il y a aussi des librairies plus légère
après je ne serais te dire, quel est le plus simple à utiliser.

Non, ce que tu fais c'est de créer deux taches et c'est le scheduler qui va les gérer en fonction de la priorité que tu leurs a données et de leurs états.
Il est quasi certain qu'il est possible de faire du multitâche en utilisant les deux cores d'un processeur mais je n'ai pas regardé
@terwal RTOS n'est pas fait pour le multitâche, son utilité est à la base de simplifier le travail en temps réel en gérant les événements et les tâches

Bonjour @le_viking,

Préambule : Le programme en #1 est issu de l'IA même si je l'ai modifié, il n'est pas le fruit de ma réflexion personnelle mais je le comprends facilement. Egalement, l'essentiel de ce qui suit ci-dessous est fourni par ChatGPT.

En faisant des recherches principalement sur l'IA, j'ai trouvé ça :

FreeRTOS est justement un système d'exploitation multitâche temps réel (RTOS = Real-Time Operating System).

Sa fonction première est de permettre l’exécution de plusieurs tâches concurrentes, chacune avec sa propre pile, son propre contexte, et gérée par un ordonnanceur (scheduler). Ce dernier décide à tout instant quelle tâche s’exécute en fonction de sa priorité et de son état (prête, bloquée, suspendue).

Le multitâche dans FreeRTOS ne dépend pas d’un multicœur : même avec un seul cœur, FreeRTOS exécute plusieurs tâches de manière fluide en faisant du changement de contexte (context switching).

Le multicœur sur ESP32 est un bonus possible, mais le multitâche FreeRTOS existe sans cela.

C’est justement ce que je démontre avec le programme en #1 : une tâche fait clignoter une LED, pendant qu’une autre effectue un traitement en parallèle (incrémentation, calcul, etc.). Le multitâche est bien visible et fonctionne sans intervention manuelle.

Si j'avais codé cela avec une simple boucle loop() comme en Arduino, il aurait fallu gérer tout à la main : états, délais, interruptions... Là, FreeRTOS me simplifie tout ce travail et offre une architecture propre, modulaire et réactive.

Le scheduler est l'outil de FreeRTOS qui gère les tâches donc il me semble que l'on peut dire clairement que FreeRTOS est dédié au multitâche. L'ordonnanceur ou sheduler est l'outil de FreeRTOS qui permet de le mettre en oeuvre :

Dans le code en #1, le scheduler est mis en oeuvre comme suit :

xTaskCreate(led_task, "LED Task", 2048, NULL, 1, NULL);
xTaskCreate(calc_task, "Calculation Task", 4096, NULL, 1, NULL);

Voici la signature complète de la fonction xTaskCreate :

xTaskCreate(
    pvTaskCode,
    pcName,
    usStackDepth,
    pvParameters,
    uxPriority,
    pxCreatedTask
);

où :

  • pvTaskCode : c'est la Fonction de la tâche à exécuter (pointeur vers une fonction de type void function(void *pvParameters) ) ;
  • pcName : c'est le Nom symbolique de la tâche (chaîne de caractères). Utilisé uniquement pour le débogage ou les logs.
  • usStackDepth : c'est la taille de la pile allouée à la tâche, exprimée en "mots" (words). Sur ESP32 : 1 word = 4 octets ; 2048 mots = 8192 octets de pile
  • pvParameters : Paramètre optionnel passé à la tâche (pointeur générique). Il Peut être NULL si on ne passe rien. Il est Utile si on veut partager des valeurs spécifiques à chaque instance de tâche.
  • uxPriority : C'est la Priorité de la tâche : Plus le chiffre est élevé, plus la tâche est prioritaire.
  • pxCreatedTask : c'est un Pointeur vers une variable de type TaskHandle_t qui permet de récupérer le handle de la tâche créée , pour : suspendre, reprendre, supprimer, etc.

J'ai demandé à l'IA de me générer une fiche sur vTaskDelay() :

Fiche mémo – vTaskDelay() et états des tâches dans FreeRTOS


:small_orange_diamond: vTaskDelay() – Temporisation dans FreeRTOS

La fonction :

vTaskDelay(TickType_t xTicksToDelay);

:right_arrow: Met la tâche en pause (état “Bloqué”) pendant un certain temps, exprimé en “ticks d’horloge système”.

  • Sur ESP32, 1 tick = 1 ms (en général).
  • Pour écrire en millisecondes :
    :backhand_index_pointing_right: Utiliser vTaskDelay(ms / portTICK_PERIOD_MS);

:small_blue_diamond: Exemple :

vTaskDelay(1000 / portTICK_PERIOD_MS); // pause de 1000 ms = 1 seconde

:white_check_mark: Ce que fait vTaskDelay() :

  • La tâche se met en “état bloqué”
  • Le scheduler libère le CPU pour une autre tâche
  • Quand le temps est écoulé, la tâche revient en “prête à s'exécuter”

:magnifying_glass_tilted_left: Pourquoi utiliser vTaskDelay() ?

  • Éviter les while bloquants
  • Laisser la main au scheduler
  • Construire un vrai comportement multitâche fluide
  • Respecter les contraintes temps réel sans bloquer les autres tâches

:blue_book: Les 4 états principaux d’une tâche dans FreeRTOS

État Signification
Running La tâche est en cours d'exécution (elle a le CPU)
Ready La tâche est prête, mais attend son tour (selon priorité)
Blocked La tâche est temporairement en pause (par vTaskDelay, xQueueReceive, etc.)
Suspended La tâche est suspendue manuellement, elle ne peut pas être exécutée tant qu'on ne la reprend pas (vTaskSuspend)

:repeat_button: Cycle typique d'une tâche bien conçue :

while(1) {
    // Action (ex : lecture capteur, traitement, affichage)
    vTaskDelay(temps_ms / portTICK_PERIOD_MS);
}

:check_mark: Cela permet à FreeRTOS de faire tourner d'autres tâches entre-temps.
:check_mark: Très fluide, non-bloquant, modulaire.


:light_bulb: Astuce :

Une tâche qui ne fait jamais vTaskDelay() bloque potentiellement le CPU (sauf si elle attend une queue, un sémaphore, etc.). C’est une erreur classique de débutant.


:blue_book: Fiche mémo – FreeRTOS : vTaskDelay() et états des tâches

:small_orange_diamond: vTaskDelay() – Temporisation dans FreeRTOS
Permet de mettre une tâche en pause (état "bloqué") pendant une durée exprimée en ticks (1 tick = 1 ms sur ESP32 en général).

Syntaxe :
vTaskDelay(duree_en_ticks);

Pour exprimer un délai en millisecondes :
vTaskDelay(ms / portTICK_PERIOD_MS);

Exemples :
vTaskDelay(1000 / portTICK_PERIOD_MS); // Pause de 1 seconde
vTaskDelay(200 / portTICK_PERIOD_MS); // Pause de 200 ms

Pendant ce temps, la tâche est bloquée et le scheduler donne la main à une autre tâche prête.

:small_orange_diamond: Pourquoi utiliser vTaskDelay ?

  • Pour ne pas bloquer le processeur
  • Pour permettre aux autres tâches de s’exécuter
  • Pour construire des tâches cycliques sans monopoliser le CPU

:small_orange_diamond: États d’une tâche dans FreeRTOS :

État Description
Running La tâche est en cours d’exécution (a le CPU)
Ready La tâche est prête, mais attend son tour
Blocked La tâche est en pause (par delay ou attente queue)
Suspended La tâche a été suspendue manuellement

:small_orange_diamond: Cycle typique d’une tâche correcte :
while(1) {
// action
vTaskDelay(1000 / portTICK_PERIOD_MS);
}

Cela garantit un fonctionnement multitâche fluide et non bloquant.

:light_bulb: Astuce : Une tâche qui ne fait jamais vTaskDelay() ou attente sur queue/semaphore peut bloquer l’exécution des autres tâches. C’est une erreur fréquente chez les débutants.

:check_mark: Résumé : vTaskDelay() = clé du multitâche coopératif efficace. Il libère volontairement le CPU pour les autres tâches, gérées ensuite par le scheduler.

CONCLUSION :
:blue_book: Fiche mémo – Interaction entre xTaskCreate() et vTaskDelay() dans FreeRTOS

:small_orange_diamond: xTaskCreate() permet de créer une tâche, c’est-à-dire de définir une fonction indépendante qui s’exécutera sous le contrôle du système FreeRTOS.

Syntaxe :
xTaskCreate(fonctionTache, "Nom", pile, param, priorité, handle);

Chaque tâche créée devient active dès qu’elle est prête, et est gérée automatiquement par le scheduler.

:small_orange_diamond: vTaskDelay() permet à une tâche de se mettre volontairement en pause pendant un certain temps (en ticks). Elle entre alors en état “bloqué” et laisse le CPU disponible à une autre tâche.

:small_orange_diamond: Le scheduler (ordonnanceur) de FreeRTOS gère toutes les tâches créées par xTaskCreate(). Il sélectionne à chaque instant la tâche ayant la priorité la plus haute et qui est dans l’état “Ready”.

Lorsque vTaskDelay() est appelé dans une tâche :
:check_mark: la tâche passe en “Blocked”
:check_mark: le scheduler donne la main à une autre tâche prête
:check_mark: à l’issue du délai, la tâche revient en “Ready” et pourra à nouveau être exécutée

:small_orange_diamond: En résumé :

  • xTaskCreate() lance une tâche
  • vTaskDelay() libère le CPU temporairement
  • le scheduler fait tourner les tâches selon priorité et disponibilité

:light_bulb: C’est cette interaction entre la création des tâches (xTaskCreate) et la gestion du temps (vTaskDelay) qui rend FreeRTOS réellement multitâche, même sur un seul cœur.

:check_mark: Une bonne pratique est d’avoir dans chaque tâche un vTaskDelay() ou une attente non bloquante (queue, semaphore) afin de favoriser l’alternance fluide des tâches.

Bonne journée.

PS : Merci à ChatGPT :joy: Mais au final c'est pas trop compliqué à comprendre ...

Bonjour et merci, je lirais le tout à tête reposé cela me paraît fort intéressant.
Un des malentendus vient de la traduction anglais français parce que parler de multitâche et de concurrent pour un RTOS n'a pas le même sens qu'en C++

Ce n'est pas ce que j'ai dis ?

Je suis d'accord avec @le_viking, FREERTOS est avant tout pour gérer le temps réel, le multitâche est plus un conséquence, qu'un but.
Un Linux est aussi multitâche, mais il n'a pas cette dimension temps réel, car ce n'est pas son but.
Mais après FreeRTOS est aussi un OS, donc il peut aussi faire du multitâche non temps réel.

Ce n'est pas contraire à ce que tu dis; c'est d'associer multitâche et RTOS qui me dérange
Un GPOS fait du multitâche concurrent tout comme un programme C++ peut le faire
Non FreeRtos ne sait pas faire de multitâche non temps réel c'est sa raison d'être le temps réel

@terwal, @le_viking,

J'ai donné vos deux réponses à ChatGPT et voici ce qu'il répond :

:pushpin: Précision sur FreeRTOS, multitâche et temps réel :

Oui, vous avez raison de dire que FreeRTOS est un RTOS (Real-Time Operating System), c’est-à-dire un système d’exploitation conçu pour répondre à des contraintes de temps déterministes.

Mais il ne faut pas opposer multitâche et temps réel, car ce sont deux dimensions différentes, complémentaires, et non contradictoires.

:small_orange_diamond: Le multitâche (exécution concurrente de plusieurs tâches avec gestion du CPU par ordonnanceur) est une fonctionnalité de tout OS, qu’il soit temps réel (RTOS) ou non (GPOS).

:small_orange_diamond: Le temps réel, c’est la capacité à garantir que certaines tâches seront exécutées dans un délai précis (deadline). C’est une contrainte, pas une fonction.

:right_arrow: Donc, FreeRTOS est bien multitâche par nature, car :

  • Il dispose d’un ordonnanceur
  • Il gère des tâches concurrentes
  • Il utilise des piles séparées, des délais, des synchronisations
  • Il peut exécuter plusieurs tâches en parallèle (ou plutôt de manière concurrente sur un cœur, parallèle sur plusieurs cœurs)

Mais FreeRTOS ajoute une couche “temps réel” : son ordonnanceur est prédictible, déterministe, configurable, ce que n’est pas toujours un OS généraliste comme Linux.

:check_mark: Le multitâche est donc une fonctionnalité centrale de FreeRTOS, et le temps réel est sa spécialisation.

:small_blue_diamond: En comparaison :

  • Un GPOS (Linux, Windows) est aussi multitâche, mais pas toujours apte à garantir un temps d’exécution précis.
  • Un RTOS (comme FreeRTOS) est multitâche avec des garanties temporelles.

:backhand_index_pointing_right: Donc dire que “FreeRTOS n’est pas fait pour le multitâche” est incorrect.
C’est par le multitâche qu’il permet de répondre aux contraintes temps réel.

:check_mark: Et oui, un RTOS peut aussi très bien faire du multitâche sans exigences temps réel strictes, dans un projet simple. Le contraire n’est pas vrai : un GPOS ne peut pas faire du temps réel dur.

En résumé :

“Multitâche est une capacité ; Temps réel est un objectif. FreeRTOS combine les deux.”

Bonne soirée à tous les deux.

J'ai demandé une clarification entre GPOS et RTOS.
Ce sont des notions que je ne connaissais pas et je découvre tout ça avec beaucoup d'interêt :

:pushpin: GPOS vs RTOS (comparaison claire) :

Caractéristique GPOS (Linux, Windows) RTOS (FreeRTOS, VxWorks, Zephyr…)
Objectif principal Polyvalence, confort utilisateur Réactivité, maîtrise du temps
Multitâche :white_check_mark: Oui :white_check_mark: Oui
Gestion des priorités :white_check_mark: Oui :white_check_mark: Oui (plus fine)
Réactivité déterministe :cross_mark: Non garantie :white_check_mark: Oui (temps d’exécution contrôlé)
Exemples d’usage PC, smartphone, serveurs Microcontrôleurs, systèmes embarqués
Scheduler Complexe, optimisé pour la charge Léger, déterministe, temps réel
Gestion mémoire Pagination, swapping, multitâche lourd Petites piles, pas de swap, efficacité maximale

:light_bulb: En résumé :

GPOS = système multitâche généraliste RTOS = système multitâche optimisé pour le temps réel

Les deux font du multitâche, mais seuls les RTOS sont capables de garantir que certaines tâches seront exécutées dans un délai précis et court → c’est ce qui est essentiel dans un système critique ou embarqué (moteur, capteur, actionneur, drone, etc.).


Voilà avec la découverte de ces notions, je comprends mieux les différences entre les systèmes GPOS et RTOS, j'attends vos éventuels commentaires car il me semble que ChatGPT est dans le vrai. Attention, je dis bien : il me semble car les arguments de l'IA sont pertinents mais il se peut que ChatGPT se trompe ...

Il me semble également que l'approche de @terwal est la bonne :

Et comme il est d'accord avec @le_viking :wink:
Je pense que tous les trois nous sommes en accord avec ce que l'IA démontre en #10 et #11 :wink: mais il faut quand même accepter de mettre le multitâche au coeur du système RTOS. Car le multitâche n'est en temps réel que sur RTOS et c'est ce qui constitue une de ses caractéristiques la plus essentielle et notable.

Je mets ici une dernière fiche établie par l'IA qui a pour but de résumer comment le temps réel est rendu effectif sur FreeRTOS :

:blue_book: Fiche mémo – Les 5 piliers techniques qui permettent à FreeRTOS de faire du multitâche en temps réel

:small_orange_diamond: 1. Un scheduler déterministe à priorité fixe
FreeRTOS utilise un ordonnanceur (scheduler) qui exécute toujours la tâche prête avec la priorité la plus élevée.
:check_mark: Si une tâche de plus haute priorité devient prête, elle interrompt immédiatement la tâche en cours (préemption).
:check_mark: Cela garantit que les tâches critiques sont toujours servies en premier, sans retard.

:small_orange_diamond: 2. Une horloge système (tick timer) précise
Le temps dans FreeRTOS est piloté par une horloge matérielle (tick), en général 1ms.
:check_mark: Toutes les fonctions de délai (vTaskDelay, vTaskDelayUntil, timeouts) s’appuient sur ce tick.
:check_mark: Cela permet une temporisation fiable, régulière et prédictible.

:small_orange_diamond: 3. Une gestion rigoureuse des états des tâches
Chaque tâche peut être dans l’un des états suivants : Running, Ready, Blocked, Suspended.
:check_mark: Le scheduler utilise ces états pour décider quelle tâche exécuter à chaque instant.
:check_mark: Lorsqu’une tâche est bloquée (par un délai ou une attente), elle libère immédiatement le CPU pour une autre tâche.

:small_orange_diamond: 4. Des mécanismes de synchronisation légers et rapides
FreeRTOS fournit :
:check_mark: Files (xQueue), sémaphores, mutex, groupes d’événements
:check_mark: Ces outils permettent la communication et la coordination entre tâches sans bloquer inutilement.
:check_mark: Ils sont intégrés au scheduler pour éviter toute latence imprévue.

:small_orange_diamond: 5. Des piles indépendantes et un changement de contexte rapide
Chaque tâche possède :
:check_mark: Sa propre pile (stack) isolée
:check_mark: Son propre contexte CPU (registres, pointeurs, etc.)
Lors d’un changement de tâche (context switch), FreeRTOS sauvegarde/restaure ce contexte en quelques cycles.
:check_mark: Cela permet un multitâche fluide, sans interférences entre tâches.

:small_blue_diamond: Conclusion :
FreeRTOS fait du multitâche comme tout OS, mais sa particularité est de garantir :
:check_mark: une exécution prioritaire des tâches critiques
:check_mark: une gestion fine des délais et des ressources
:check_mark: une réactivité maîtrisée

C’est cette combinaison qui en fait un système d’exploitation temps réel (RTOS) : le multitâche est son moteur, le temps réel est sa spécialité.

ok, je ne vois pas trop ce qui te gêne d'associer multitâche et RTOS.

Je suis loin d'être un spécialiste de RTOS et je n'ai pas d'exemple l'affirmant, mais il me semblait que cela était possible.

étonnamment je suis d'accord avec l'IA :slight_smile:

+1 moi aussi je suis d'accord avec l'IA. Mais peut-être que @le_viking a mal exprimé ce qu'il voulait dire ?

Ici je ne comprends pas :

Je ne comprends pas en quoi ça le dérange ?

Ce qui me dérange c'est la traduction qui est faite de l'anglais. Sous prétexte que Freertos utilise le terme task ca devient multitâche. Je ne sais pas dans quelle mesure il est multitâche je n'ai pas encore essayé. Un GPOS actuel est multitâche

@le_viking
Voici ce que vous répond l'IA :

Tu soulèves un point intéressant, et effectivement il faut distinguer les mots pour ne pas tout mélanger.

:check_mark: Le fait que FreeRTOS utilise le mot “task” n’est pas un abus de traduction :
Dans tout OS, qu’il soit temps réel (RTOS) ou généraliste (GPOS), une tâche (task ou thread) est une unité d'exécution concurrente.

:check_mark: Quand un système d’exploitation est capable de gérer plusieurs tâches, qu'elles soient actives, prêtes, ou bloquées, c'est bien du multitâche, par définition.

:right_arrow: Le mot multitâche signifie simplement : “plusieurs tâches s'exécutent de manière concurrente, gérées par un ordonnanceur (scheduler)”. C’est exactement ce que fait FreeRTOS.

Il n’y a pas besoin de deux cœurs pour parler de multitâche. Même sur un seul cœur :

  • l’ordonnanceur FreeRTOS permet d’enchaîner plusieurs tâches (context switch),
  • chaque tâche a sa propre pile, son propre contexte,
  • les vTaskDelay, sémaphores, files, mutex permettent une alternance fluide.

C’est donc bien du multitâche coopératif/préemptif, orchestré par le RTOS, et non une simple succession d'instructions dans une boucle.

:check_mark: La différence avec un GPOS n’est pas le multitâche lui-même, mais la richesse des fonctionnalités (mémoire virtuelle, utilisateur/root, I/O abstraites, processus indépendants, etc.).

En résumé :

FreeRTOS est multitâche, comme tout OS. Il est juste conçu pour être léger, temps réel, et embarqué. Le fait qu’il parle de “tasks” n’est pas un abus de langage, c’est sa réalité d’OS multitâche.

C'est bien ca qui me dérange. Windows98 colle parfaitement à cette définition et pourtant un utilisateur actuel dirait que W98 n'est pas multitâche
Dans le doute j'ai posé trois question à chatGPT

Q: Comment FreeRtos peut utiliser le multitâche sans mémoire virtuelle
Suite à la réponse
Q: Alors chaque tâche est un thread
puis
Q: Dans la réponse du dis "Oui, dans FreeRTOS, chaque tâche est plus proche d’un thread " donc on ne peut pas parler de multitasking mais de multithreading

Réponse:
En effet, dans FreeRTOS, on peut plutôt parler de multithreading que de multitasking, mais cela dépend du point de vue adopté :

Pourquoi parle-t-on souvent de "multitâche" dans FreeRTOS ?

Dans les systèmes embarqués et temps réel, le terme "multitâche" (multitasking) est couramment utilisé, même si FreeRTOS ne crée pas de processus isolés comme un OS classique.

  • Chaque tâche a son propre contexte d'exécution (pile, registres, état d'exécution).
  • L'ordonnanceur de FreeRTOS alterne entre plusieurs tâches selon leur priorité et état.
  • Dans un système monocœur, il y a du multitâche "préemptif" ou "coopératif", mais sans exécution parallèle.

Pourquoi "multithreading" est un meilleur terme dans FreeRTOS ?

Dans un OS classique (Linux, Windows) :

  • Un processus a son propre espace mémoire isolé.
  • Un thread partage l'espace mémoire d'un processus.
  • Dans FreeRTOS, toutes les tâches partagent la même mémoire, ce qui ressemble fortement au modèle des threads.

Donc, si on compare FreeRTOS à un OS traditionnel, on dirait qu'il fait du multithreading plutôt que du multitâche.

Qu'en est-il en mode multicœur (SMP) ?

  • FreeRTOS SMP permet à plusieurs tâches de s'exécuter en parallèle sur plusieurs cœurs.
  • On parle alors de "vrai" multithreading parallèle (comme avec les threads dans un OS multicœur).
  • Chaque cœur peut exécuter une tâche indépendamment, donc du vrai multitâche se produit, mais toujours sans séparation mémoire stricte entre tâches.

Conclusion

  • Sur un processeur monocœur, FreeRTOS fait du multitâche simulé par le changement de contexteplus proche du multithreading.
  • Sur un processeur multicœur, FreeRTOS SMP permet du parallélisme réelon peut parler de multithreading parallèle.
  • Si on suit la terminologie des OS classiques, FreeRTOS gère des threads et non des processus.

:backhand_index_pointing_right: Donc, FreeRTOS fait bien du multithreading plutôt que du multitâche au sens classique des OS, mais dans le monde de l'embarqué, on continue souvent à parler de multitâche.

A noter que j'ai eu ma réponse pour l'ESP32 2 cœurs sans la demander Bravo le chat!

Bonjour @le_viking
Oui après avoir fait des recherches hors IA, j’en arrive à la même conclusion que vous :

Je ne sais pas si tout le monde est d’accord mais en tout cas moi j’en suis maintenant également convaincu et ceci parce que toutes les tâches partagent le même espace mémoire global ( il n'y a pas de mémoire virtuelle) :wink:
Merci pour votre participation et merci également à @terwal.

Bonne journée

Comment ça, j'ai l'impression que l'on n'a pas la même définition de Multitâche.
Le multitâche pour moi vient du fait de pouvoir exécuter des bouts de programme ou portion de code, de manière concurrentiel, c'est à dire que deux codes s'exécute d'une façon parallèle vue de l'extérieur. Même si en interne le code ne s'exécute pas réellement en parallèle, mais par alternance séquentiel, comme sur Windows 98 avec ça boucle d'évènement.

Après viens la forme d'implémentation du multitâche, le multi-Threading en est une forme.
D'ailleurs sur linux, il n'y a pas vraiment du threading, mais du multi-Process, a la différence de Windows.

Après on peut parler de vrai/pseudo multitâche, le vrai ne peut pas créer plus de tâche que de cœur ou HyperThread disponible.
Car sinon on tombe dans le time-slicing, qui devient du pseudo multitâche.
Mais du point de vue utilisateur final, il a l'impression que les tâches s'exécute en parallèle.

Si j'ai bien compris freeRTOS, permet de lancer plusieurs tâche sur un mono-coeurs.
Sauf que le notion de tâche, ne correspond pas à des processus des OS traditionnel.

Par contre si pour toi le multitâche, cela veut dire paralléliser des processus, effectivement FReeRTOS, n'est pas multitâche.
Mais au final, tâche, processus c'est des notions qui dépendent de l'OS.
Si tu as deux tâches(recevoir/envoyer des données, traitement), que ce soit dans un processus, un thread, une boucle, cela n'a pas trop d'importance ?