Interprétation/Compilation conditionnelle
Instructions
Utilisation
Exemple
Principe
Il s'agit de disposer d'un jeu d'instructions permettan
d'interpréter ou de compiler un programme ou plusieurs
selon des conditions qui peuvent dépendre de la configuration
de l'environnement matériel d'un système.
Afin de faire des économies en matière d'espace
mémoire, il est judicieux de ne compiler, que les instructions
spécifiques des périphériques utilisés
par un système. Prenons par exemple le cas du coeur FORTH,
il n'est pas forcément nécessaire de disposer de
l'interface VGA dans une application embarquée. Il suffi
alors de signaler au compilateur d'éviter de créer
l'ensemble des instructions graphiques si cette interface n'es
pas présente dans le FPGA. On gagne ainsi l'espace mémoire
correspondant à ces instructions devenues alors inutiles.
Ce même espace mémoire peut alors contenir un autre
jeu d'instructions spécifiques de l'application.
Pour cela, il est nécessaire de disposer d'instructions
qui, d'une part , sont exécutables en mode interprétation
ET en mode compilation et, d'autre part, ne consomment pas de
ressources supplémentaires. Par exemple, il faut pouvoir
créer une variable indiquant la disponibilité des
différents périphériques sans que celle-ci
ne soit intégrée au code résultat sachan
qu'elle ne sert que pour sa génération.
Tout ceci est pris en compte dans le jeu d'instructions
suivant.
Instructions
n [IF] - instructions
- [THEN] -
Les instructions entre "[IF]" e
"[THEN]" sont interprétées/compilées
si n est différent de 0
n [IF] - instructions 1
- [ELSE] - instructions 2
- [THEN] -
Si n est différent de 0, seules les
instructions 1 sont interprétées/compilées,
sinon ce sont les instructions 2
- [LABEL] "nom" -
- [GOTO] "nom" -
"[GOTO] nom" force l'interprétation/compilation
des instructions qui suivent "[LABEL] nom"
- [VARIABLE] "nom"
adresse
"[VARIABLE]" crée, si elle
n'existe pas encore, et/ou donne l'adresse d'une variable 32 bits
"nom"
Utilisation
Si l'utilisation des instructions [IF], [ELSE] et [THEN]
ne posent pas de difficultées pour un habitué du
langage FORTH, il faut détailler un peu les instructions
[VARIABLE], [LABEL] et [GOTO].
[VARIABLE] crée une variable qui ne sera disponible
que pendant l'interprétation/compilation du programme.
Celle-ci ne sera donc pas intégrée au dictionnaire
FORTH du système.
[LABEL] indique à l'interpréteur/compilateur
que le mot suivant est une étiquette qui ne sera pas intégrée
au dictionnaire FORTH.
[GOTO] demande à l'interpréteur/compilateur
de sauter à l'étiquette (mot suivant) qui doit se
retrouver à la suite d'une instruction [LABEL].
Voici un petit exemple d'interprétation conditionnelle:
ECHO" Debut du programme." CR
10 [VARIABLE] numero_boucle !
[LABEL] boucle
[VARIABLE] numero_boucle @ 1- ?DUP
[IF]
DUP [VARIABLE] numero_boucle ! ECHO" Execution
d'un rebouclage, numero_boucle = " . CR [GOTO] boucle
[ELSE]
ECHO" Fin du programme." CR
[THEN]
Cet exemple doit produire le résultat suivant:
Debut du programme.
Execution d'un rebouclage, numero_boucle = 9
Execution d'un rebouclage, numero_boucle = 8
Execution d'un rebouclage, numero_boucle = 7
Execution d'un rebouclage, numero_boucle = 6
Execution d'un rebouclage, numero_boucle = 5
Execution d'un rebouclage, numero_boucle = 4
Execution d'un rebouclage, numero_boucle = 3
Execution d'un rebouclage, numero_boucle = 2
Execution d'un rebouclage, numero_boucle = 1
Fin du programme.
OK
>
Exemple
Voici un exemple de programme contenant les pilotes
de plusieurs périphériques qui, par l'intermédiaire
de variables associées, seront intégrés ou
pas dans le dictionnaire FORTH du système:
( Exemple de structure de programme utilisant les instructions
d'interpretation/compilation conditionnelle.
Version 0.10 du 5 Decembre 2004.
Ecrit par jpb.forth .
)
TELECHARGEMENT
( Declaration des peripheriques existants:
----------------------------------------
)
1 [VARIABLE] VGA !
0 [VARIABLE] I2C !
0 [VARIABLE] USB !
( ... )
( Saut en fin du programme si aucun peripherique n'est present:
-------------------------------------------------------------
)
[VARIABLE] VGA @ [VARIABLE] I2C @ OR [VARIABLE] USB @ OR 0=
[IF]
[GOTO] fin_du_programme
[THEN]
( Instructions d'acces aux differents peripheriques:
--------------------------------------------------
)
[VARIABLE] VGA @
[IF]
ECHO" Installation des instructions du peripherique VGA.
"
: VGA_INIT
( ... )
;
: VGA_LIRE ( - --> n )
( ... ) 1234
;
: VGA_ECRIRE ( n --> - )
( ... ) DROP
;
[THEN]
[VARIABLE] I2C @
[IF]
ECHO" Installation des instructions du peripherique I2C.
"
: I2C_INIT
( ... )
;
: I2C_LIRE ( - --> n )
( ... ) 5678
;
: I2C_ECRIRE ( n --> - )
( ... ) DROP
;
[THEN]
[VARIABLE] USB @
[IF]
ECHO" Installation des instructions du peripherique USB.
"
: USB_INIT
( ... )
;
: USB_LIRE ( - --> n )
( ... ) 3456
;
: USB_ECRIRE ( n --> - )
( ... ) DROP
;
[THEN]
( Instructions de test des differents peripheriques:
--------------------------------------------------
)
[VARIABLE] VGA @
[IF]
: VGA_TEST ( - --> 0 si OK )
." Test du peripherique VGA en cours..." CR
( ... ) 0
;
[THEN]
[VARIABLE] I2C @
[IF]
: I2C_TEST ( - --> 0 si OK )
." Test du peripherique I2C en cours..." CR
( ... ) 0
;
[THEN]
[VARIABLE] USB @
[IF]
: USB_TEST ( - --> 0 si OK )
." Test du peripherique USB en cours..." CR
( ... ) 0
;
[THEN]
( Sequence de test des differents peripheriques:
----------------------------------------------
)
[VARIABLE] VGA @
[IF]
VGA_TEST
[IF]
ECHO" Le peripherique VGA est en PANNE!" CR
[ELSE]
ECHO" Le peripherique VGA est operationnel." CR
[THEN]
[THEN]
[VARIABLE] I2C @
[IF]
I2C_TEST
[IF]
ECHO" Le peripherique I2C est en PANNE!" CR
[ELSE]
ECHO" Le peripherique I2C est operationnel." CR
[THEN]
[THEN]
[VARIABLE] USB @
[IF]
USB_TEST
[IF]
ECHO" Le peripherique USB est en PANNE!" CR
[ELSE]
ECHO" Le peripherique USB est operationnel." CR
[THEN]
[THEN]
( Retrait des programmes de test devenus inutiles:
------------------------------------------------
)
FIND VGA_TEST
[IF]
FORGET VGA_TEST
[ELSE]
FIND I2C_TEST
[IF]
FORGET I2C_TEST
[ELSE]
FORGET USB_TEST
[THEN]
[THEN]
[LABEL] fin_du_programme
( FIN
)
Le comportement de cet exemple peut être modifié
avec les valeurs des variables VGA, I2C et USB.