Le multitâche avec MECRISP Forth
publication: 30 décembre 2023 / mis à jour 30 décembre 2023
Le système FORTH est bien plus qu’un simple interpréteur/compilateur. C’est un système complet. FORTH intègre un système de gestion de tâches par jeton. Ce mécanisme est totalement transparent pour l’utilisateur. Bien que très efficace, il a quelques menus inconvénients:
- une tâche peut être préemptive. En clair, elle peut empêcher le passage de jeton et bloquer le système;
- du fait d’un passage de jeton, les tâches ne peuvent pas être synchrones.
Mais dans la très grande majorité des situations, la gestion multi-tâche est efficace.
Reprenons le code du clignotement de la LED implantée sur la carte RP pico rattachée au GPIO 25:
25 constant ONBOARD_LED : led.init ( -- ) ONBOARD_LED GPIO_FUNC_SIO gpio_set_function ONBOARD_LED GPIO-OUT gpio_set_dir ; : blink ( -- ) led.init begin ONBOARD_LED PIN_MASK GPIO_OUT_XOR ! 300 ms again ;
Si on exécute blink
, la LED implantée sur la carte RP pico va bien clignoter. Mais c’est tout
ce qu’on peut faire. Car la partie de code gérant le clignotement est située entre begin
et again
,
en rouge dans le code ci-dessus.
La question est: «comment exécuter un autre code pendant que la LED clignote?». C’est une excellente question, je vous remercie de l’avoir posée.
A moins de réaliser un code complexe, il n’y a aucune solution élégante et facile à maintenir. Ou à modifier.
Le muti-tâche est une solution permettant de décrire quelle partie de code est défini dans une
tâche, puis exécuter cette tâche en laissant disponible le reste du système FORTH. Pour définir
une tâche, on utilise le mot de création task:
comme ceci:
task: blinktask
Je dirai que le plus dur est fait! Enfin, presque… Car il faut maintenant indiquer la partie de
code à exécuter dans cette tâche. C’est ce qu’on va faire dans la définition de blink
:
: blink& ( -- ) led.init blinktask activate begin ONBOARD_LED PIN_MASK GPIO_OUT_XOR ! 300 ms again ;
Notez au passage que le mot blink
est devenu blink&
dans notre code. Ce renommage n’a rien
d’obligatoire. Le rajout du caractère &
après blink
est surtout une habitude héritée du monde
UNIX où les programmes multi-tâches étaient marqués de cette manière.
Activer et désactiver des tâches
Pour activer le moteur multi-tâche, on exécute:
multitask
Puis on exécute une seule fois la tâche à insérer dans la boucle de gestion multi-tâche:
blink&
Dès cet instant, la LED implantée sur la carte RP pico clignote. Jusque là, rien d’étonnant. Mais ce qui peut surprendre le programmeur débutant en FORTH, c’est d’avoir toujours la main pour taper d’autres commandes FORTH!

Ça surprend toujours la première fois! Nous avons pourtant une boucle begin again
active.
Théoriquement on ne peut en sortir, sauf à débrancher la carte RP pico. Mais on doit se rendre à l’évidence, on a bien la main sur l’interpréteur FORTH.
Pour interrompre cette tâche, on exécute:
blinktask idle
Et pour la ré-activer, on exécute:
blinktask wake
Allez-y, essayez!
Vous commencez maintenant à comprendre toute la puissance du langage FORTH. Car nous venons tout simplement d’ouvrir la porte à des possibilités de programmation extraordinaires.
Pour connaître le nombre de tâches actives, on exécute tasks
.
Pour revenir à une gestion de tâche unique, exécuter singletask
. Ceci interrompt toutes
les tâches autre que la tâche gérant l’interpréteur FORTH.
En théorie, il est possible d’exécuter plusieurs tâches en même temps. Mais si une tâche particulière nécessite une réactivité quasi instantanée, cette réactivité sera limitée par le passage de jeton des autres tâches. Si vous effectuez du traitement de signal à très haute fréquence, on évitera le multi-tâche.
Toutes les variables définies dans FORTH peuvent être lues ou modifiées par une tâche quelconque.
Plusieurs tâches distinctes peuvent appeler un même mot. Les paramètres posés sur la pile par une tâche restent spécifiques à cette tâche.
La tâche système principale ne peut être interrompue.
Legal: site web personnel sans commerce / personal site without seling