Séquenceur Temps Réel
Instructions
Utilisation
Exemple
Principe
Si le noyau temps réel développé
dans ce système
permet la gestion de plusieurs tâches à différents niveaux pour la
réalisation de programmes plus ou moins complexes, il est souvent
suffisant de disposer d'un simple séquenceur de tâches plus facile à
mettre au point. De plus, la résolution de 1 milliseconde, nécessaire
dans des systèmes rapides comme la surveillance de courant de
consommation à la sortie d'un commutateur électronique, n'est pas
indispensable dans des systèmes plus lents comme la régulation de la
température d'un radiateur électrique se contentant d'une résolution de
quelques secondes.
Le
principe est donc de fournir un jeu d'instructions complémentaires pour
réaliser des fonctions relativement lentes en garantissant plus
facilement leur répartition temporelle. Les fonctions sont de simples
instructions FORTH dont l'exécution est lancée selon une table gérée
par une seule tâche du noyau temps réel. La base de temps est un nombre programmable
de milisecondes. Les fonctions sont toutes réalisées au même niveau que
la tâche d'appel et exécutées dans un ordre séquentiel déterministe.
Instructions
- SEQUENCE adr
Adresse des variables utilisées par la gestion des séquences
- T_SEQ -
Tâche d'exécution des séquences (niveau de priorité de 32768)
Cette instruction n'existe pas dans le noyau du Micro FORTH en version séquenceur
- SEQ_BEGIN[ -
Début d'une table de séquences
deb_per,nbr_per SEQ_ADD "nom" -
Insertion d'une séquence dans une table de séquences:
"nom" est le nom du mot FORTH qui doit être exécuté
deb_per indique le numéro de la première période d'éxécution
nbr_per indique l'intervalle entre 2 exécutions
- SEQ_END] -
Fin d'une table de séquence
Utilisation
Il
faut commencer par définir les différentes instructions à exécuter
séquentiellement. Ces instructions ne doivent pas utiiser de paramètres
d'entrée et sortie sur la pile des données comme dans le cas de tâche
du noyau temps réel sachant qu'elles peuvent être appelées à n'importe
quel moment selon le séquencement choisi.
Il faut
ensuite construire la table d'appel séquentielle à
l'aide de l'instruction "SEQ_ADD" définissant la date du premier appel
de chaque instruction ("deb_per") et leur période de répétition
("nbr_per").
Il
suffit alors de lancer cette tâche particulière en définissant sa
période d'appel en millisecondes. La tâche
effectuera périodiquement le balayage de la table de séquence en
respectant les paramètres temporels de chaque instruction de manière
déterministe.
Exemple
Afin de mieux appréhender les
possibilités du séquenceur temps réel, voici un programme
simple qui utilise les instructions définies dans cette page:
0 VARIABLE DUREE
: SEQUENCE_10ms
CR ." Seq. 10 ms " 10 TEMPO
;
: SEQUENCE_20ms
." Seq. 20 ms " 20 TEMPO
;
: SEQUENCE_30ms
." Seq. 30 ms " 30 TEMPO
;
: SEQUENCE_40ms
." Seq. 40 ms " 40 TEMPO
;
: SEQUENCE_50ms
." Seq. 50 ms " 50 TEMPO
;
: SEQ_START ( periode en ms --> - )
SEQ_BEGIN[
4 1 SEQ_ADD SEQUENCE_10ms
4 3 SEQ_ADD SEQUENCE_20ms
4 3 SEQ_ADD SEQUENCE_30ms
5 3 SEQ_ADD SEQUENCE_40ms
6 3 SEQ_ADD SEQUENCE_50ms
SEQ_END]
;
1000 SEQ_START
Il s'agit d'un programme permettant d'exécuter
5 séquences de 10 à 50 ms toutes les secondes selon le chronnogramme suivant:

La copie d'écran suivante montre le déroulement de ce séquenceur à partir du début:
