Le multitâche avec MECRISP Forth

publication: 30 décembre 2023 / mis à jour 30 décembre 2023

Read this page in english

 


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:

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