Document fait avec Nvu Document made with Nvu




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.