Autres articles / Other articles

Dictionnaire / Pile / Variables / Constantes

publication: 23 février 2023 / mis à jour 23 février 2023

Read this page in english

 

Étendre le dictionnaire

Forth appartient à la classe des langages d'interprétation tissés. Cela signifie qu'il peut interpréter les commandes tapées sur la console, ainsi que compiler de nouveaux sous-programmes et programmes.

Le compilateur Forth fait partie du langage et des mots spéciaux sont utilisés pour créer de nouvelles entrées de dictionnaire (c'est-à-dire des mots). Les plus importants sont : (commencer une nouvelle définition) et ; (termine la définition). Essayons ceci en tapant:

: *+ * + ;

Ce qui s'est passé? L'action de : est de créer une nouvelle entrée de dictionnaire nommée *+ et passer du mode interprétation au mode compilation. En mode compilation, l'interpréteur recherche les mots et, plutôt que de les exécuter, installe des pointeurs vers leur code. Si le texte est un nombre, au lieu de le pousser sur la pile, ESP32forth construit le nombre dans le dictionnaire l'espace alloué pour le nouveau mot, suivant le code spécial qui met le numéro stocké sur la pile chaque fois que le mot est exécuté. L'action d'exécution de *+ est donc d'exécuter séquentiellement les mots définis précédemment * et +.

Le mot ; est spécial. C'est un mot immédiat et il est toujours exécuté, même si le le système est en mode compilation. Ce que fait ; est double. Tout d'abord, il installe le code qui renvoie le contrôle au niveau externe suivant de l'interpréteur et, deuxièmement, il revient du mode compilation au mode interprétation.

Maintenant, essayez votre nouveau mot :

decimal 5 6 7 *+ . \ display 47 ok<#,ram> 

Cet exemple illustre deux activités principales de travail dans Forth: ajouter un nouveau mot au dictionnaire, et l'essayer dès qu'il a été défini.

Gestion du dictionnaire

Le mot forget suivi du mot à supprimer enlèvera toutes les entrées de dictionnaire que vous avez faites depuis ce mot:

: test1 ; 
: test2 ; 
: test3 ; 
forget test2  \ delete test2 and test3 from dictionnary 

Piles et notation polonaise inversée

Forth a une pile explicitement visible qui est utilisée pour passer des nombres entre les mots (commandes). Utiliser Forth efficacement vous oblige à penser en termes de pile. Cela peut être difficile au début, mais comme pour tout, cela devient beaucoup plus facile avec la pratique.

En FORTH, La pile est analogue à une pile de cartes avec des nombres écrits dessus. Les nombres sont toujours ajoutés au sommet de la pile et retirés du sommet de la pile. ESP32forth intègre deux piles: la pile de paramètres et la pile de retour, chacune composée d'un certain nombre de cellules pouvant contenir des nombres de 16 bits.

La ligne d'entrée FORTH:

decimal 2 5 73 -16 

laisse la pile de paramètres dans l'état

cell number content comment
0-16TOS (Top Of Stack)
173NOS (Next Of Stack)
25
32

Nous utiliserons généralement une numérotation relative à base zéro dans les structures de données Forth telles que piles, tableaux et tables. Notez que, lorsqu'une séquence de nombres est saisie comme celle-ci, le nombre le plus à droite devient TOS et le nombre le plus à gauche se trouve au bas de la pile.

Supposons que nous suivions la ligne d'entrée d'origine avec la ligne

+ - * . 

pour produire une valeur xxx. Quel serait le xxx Les opérations produiraient les oprations de pile successives:

Après les deux lignes, la console affiche :

decimal 2 5 73 -16  \ display: 2 5 73 -16 ok 
+ - * .             \ display: -104 ok 

Notez que ESP32forth affiche commodément les éléments de la pile lors de l'interprétation de chaque ligne et que la valeur de -16 est affichée sous la forme d'entier non signé 32 bits. En outre, le mot . consomme la valeur de données -104, laissant la pile vide. Si nous exécutons . sur la pile maintenant vide, l'interpréteur externe abandonne avec une erreur de pointeur de pile STACK UNDERFLOW ERROR.

La notation de programmation où les opérandes apparaissent en premier, suivis du ou des opérateurs est appelée Notation polonaise inverse (RPN).

Manipulation de la pile de paramètres

Étant un système basé sur la pile, ESP32forth doit fournir des moyens de mettre des nombres sur la pile, pour les supprimer et réorganiser leur ordre. On a déjà vu qu'on peut mettre des nombres sur la pile simplement en les tapant. Nous pouvons également intégrer les nombres dans la définition d'un mot FORTH.

Le mot drop supprime un numéro du sommet de la pile mettant ainsi le suivant au sommet. Le mot swap échange les 2 premiers numéros. dup copie le nombre au sommet, poussant tout les autres numéros vers le bas. rot fait pivoter les 3 premiers nombres. Ces actions sont présentées ci-dessous.

La pile de retour et ses utilisations

Lors de la compilation d'un nouveau mot, ESP32forth établit des liens entre le mot appelant et les mots définis précédemment qui doivent être invoqués par l'exécution du nouveau mot. Ce Le mécanisme de liaison, lors de l'exécution, utilise la pile de retour (rstack). L'adresse du mot suivant à invoquer est placé sur la pile de retour de sorte que, lorsque le mot courant est terminé en cours d'exécution, le système sait où passer au mot suivant. Comme les mots peuvent être imbriqués, il doit y avoir une pile de ces adresses de retour.

En plus de servir de réservoir d'adresses de retour, l'utilisateur peut également stocker et récupérer à partir de la pile de retour, mais cela doit être fait avec soin car la pile de retour est essentielle à l'exécution du programme. Si vous utilisez la pile de retour pour le stockage temporaire, vous devez la remettre dans son état d'origine, sinon vous ferez probablement planter le système ESP32forth. Malgré le danger, il y a des moments où l'utilisation de pile de retour comme stockage temporaire peut rendre votre code moins complexe.

Pour stocker dans la pile, utilisez >r pour déplacer le sommet de la pile de paramètres vers le haut de la pile de retour. Pour récupérer une valeur, r> déplace la valeur supérieure de la pile de retour vers le sommet de la pile de paramètres. Pour supprimer simplement une valeur du haut de la pile, il y a le mot rdrop. Le mot r@ copie le haut de la pile de retour dans la pile de paramètres.

Utilisation de la mémoire

Dans ESP32forth, les nombres 32 bits sont extraits de la mémoire vers la pile par le mot @ (fetch) et stocké du sommet à la mémoire par le mot ! (store). @ attend une adresse sur la pile et remplace l'adresse par son contenu. ! attend un nombre et une adresse pour le stocker. Il place le numéro dans l'emplacement de mémoire référencé par l'adresse, consommant les deux paramètres dans le processus.

Les nombres non signés qui représentent des valeurs de 8 bits (octets) peuvent être placés dans des caractères de la taille d'un caractère. cellules de mémoire en utilisant c@ et c!.

create testVar 
    cell allot 
$f7 testVar c! 
testVar c@ .    \ display 247 

Variables

Une variable est un emplacement nommé en mémoire qui peut stocker un nombre, tel que le résultat intermédiaire d'un calcul, hors de la pile. Par exemple:

variable x 

crée un emplacement de stockage nommé, x, qui s'exécute en laissant l'adresse de son emplacement de stockage au sommet de la pile:

x .    \ display address 

Nous pouvons alors aller chercher ou stocker à cette adresse :

variable x 
3 x ! 
x @ .   \ display: 3 

Constants

Une constante est un nombre que vous ne voudriez pas changer pendant l'exécution d'un programme. Les adresses des registres de fonctions spéciales du microcontrôleur sont un bon exemple de utiliser et, parce que les nombres constants sont stockés dans la mémoire Flash non volatile, ils sont disponible même après un cycle d'alimentation. Le résultat de l'exécution du mot associé à un constante est la valeur des données restant sur la pile.

\ define VSPI pins 
19 constant VSPI_MISO 
23 constant VSPI_MOSI 
18 constant VSPI_SCLK 
05 constant VSPI_CS 
\ define SPI port frequency 
4000000 constant SPI_FREQ 
 
\ select SPI vocabulary 
only FORTH  SPI also 
 
\ initialize SPI port 
: init.VSPI ( -- ) 
    VSPI_CS OUTPUT pinMode 
    VSPI_SCLK VSPI_MISO VSPI_MOSI VSPI_CS SPI.begin 
    SPI_FREQ SPI.setFrequency 
  ; 

Values

Une valeur définie avec value est un type hybride de variable et constante. Nous définissons et initialisons une valeur et est invoquée comme nous le ferions pour une constante. On peut aussi changer une valeur comme on peut changer une variable.

decimal 
13 value thirteen 
thirteen .      \ display: 13 
47 to thirteen 
thirteen .      \ display: 47 

Le mot to fonctionne également dans les définitions de mots, en remplaçant la valeur qui le suit par tout ce qui est actuellement au sommet de la pile. Vous devez faire attention à ce que to soit suivi d'une valeur définie par value et non d'autre chose.

Outils de base pour l'allocation de mémoire

The words create and allot are the basic tools for setting aside memory and attaching a convenient label to it. For example, the following transcript shows a new dictionary entry x being created and an extra 16 bytes of memory being allotted to it.

create graphic-array ( --- addr ) 
    %00000000 c, 
    %00000010 c, 
    %00000100 c, 
    %00001000 c, 
    %00010000 c, 
    %00100000 c, 
    %01000000 c, 
    %10000000 c, 

Lorsqu'il est exécuté, le mot graphic-array poussera l'adresse de la première entrée dans sa mémoire allouée place sur la pile. Le mot u. imprime une représentation non signée d'un nombre et le mot renvoie ici l'adresse du prochain espace disponible en mémoire. Dans l'exemple ci-dessus, il commence par la même valeur que graphic-array mais est incrémenté de seize (décimal) lorsque nous avons alloué la mémoire.

Nous pouvons maintenant accéder à la mémoire allouée à graphic-array en utilisant les mots de récupération et de stockage discutés plus tôt. Pour calculer l'adresse du troisième octet attribué à graphic-array on pourrait dire graphic-array 2 +, en se rappelant que les indices commencent à 0.

30 graphic-array  2 + c! 
graphic-array  2 + c@ .     \ display 30 

Legal: site web personnel sans commerce / personal site without seling