Autres articles / Other articles

Charger et exécuter du code FORTH au démarrage de ESP32Forth

publication: 22 mars 2022 / mis à jour 10 août 2022

Read this page in english

 


Appel à collaboration

Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.

Partagez-les ici sur ce site.

ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.

Vos montages peuvent aider d'autres développeurs.

Les montages des autres développeurs peuvent vous aider.

Pour proposer un article ou un montage, cliquez ici


Mettre le code FORTH dans un fichier

Au démarrage, ESP32Forth dispose d'un vocabulaire complet. Cependant, au cours des développements, il arrive de recourir à des mots utilisés de manière permanente. Par exemple, vous avez besoin de gérer des chaines de caractères tel que réalisé dans ce fichier:

  strings management for ESP32forth

Pour disposer de manière permanence de ces définitions, vous avez plusieurs solutions:

Préparer son code FORTH

La solution que nous proposons exploite les fichiers blocs. Elle consiste à mettre le code source de nos définitions dans un fichier situé sur notre carte ESP32Forth.

Reprenons le code de strings management for ESP32forth.

Ce code va être réécrit en supprimant toutes les lignes de commentaire et en compactant le code FORTH:

\ strings management for ESP32forth 
: $= ( addr1 len1 addr2 len2 --- fl ) str= ; 
: string  ( n --- names_strvar ) \ define a strvar 
  create dup ,  0 ,  allot does> cell+ cell+  dup cell - @ ; 
: maxlen$  over cell - cell - @ ; 
: $!  ( str strvar --- )  \ store str into strvar 
  maxlen$ nip rot min 2dup swap cell - ! cmove ; 
: 0$! ( addr len -- ) drop 0 swap cell - ! ; 
: right$  ( str1 n --- str2 ) 0 max over min >r + r@ - r> ; 
: left$  ( str1 n --- str2 ) 0 max min ; 
: mid$  ( str1 pos len --- str2 ) 
  >r over swap - right$ r> left$ ; 
: c+$! ( c str1 -- ) over >r + c! r> cell - dup @ 1+ swap ! ; 
: append$ { addr1 len1 addr2 len2 -- } 
  addr1 addr2 len2 + len1 cmove len1 addr2 cell - +! ; 
: input$  over swap maxlen$ nip accept swap cell - ! ; 

Chaque ligne de code ne doit pas dépasser 64 caractères. On va rajouter les commandes d'édition:

  0 r \ strings management for ESP32forth 
  1 r : $= ( addr1 len1 addr2 len2 --- fl ) str= ; 
  2 r : string  ( n --- names_strvar ) \ define a strvar 
  3 r   create dup ,  0 ,  allot does> cell+ cell+  dup cell - @ ; 
  4 r : maxlen$  over cell - cell - @ ; 
  5 r : $!  ( str strvar --- )  \ store str into strvar 
  6 r   maxlen$ nip rot min 2dup swap cell - ! cmove ; 
  7 r : 0$! ( addr len -- ) drop 0 swap cell - ! ; 
  8 r : right$  ( str1 n --- str2 ) 0 max over min >r + r@ - r> ; 
  9 r : left$  ( str1 n --- str2 ) 0 max min ; 
 10 r : mid$  ( str1 pos len --- str2 ) 
 11 r   >r over swap - right$ r> left$ ; 
 12 r : c+$! ( c str1 -- ) over >r + c! r> cell - dup @ 1+ swap ! ; 
 13 r : append$ { addr1 len1 addr2 len2 -- } 
 14 r   addr1 addr2 len2 + len1 cmove len1 addr2 cell - +! ; 
 15 r : input$  over swap maxlen$ nip accept swap cell - ! ; 

Charger le code dans un bloc

Ce code source va être chargé dans un bloc de code source FORTH. Pour ne pas saturer l'interpréteur de ESP32Forth, ce code sera transféré en plusieurs fois, par copié-collé.

Première section de code:

default-use 
editor 
  0 r \ strings management for ESP32forth 
  1 r : $= ( addr1 len1 addr2 len2 --- fl ) str= ; 
  2 r : string  ( n --- names_strvar ) \ define a strvar 
  3 r   create dup ,  0 ,  allot does> cell+ cell+  dup cell - @ ; 

Seconde section de code:

  4 r : maxlen$  over cell - cell - @ ; 
  5 r : $!  ( str strvar --- )  \ store str into strvar 
  6 r   maxlen$ nip rot min 2dup swap cell - ! cmove ; 
  7 r : 0$! ( addr len -- ) drop 0 swap cell - ! ; 

Troisième section de code:

  8 r : right$  ( str1 n --- str2 ) 0 max over min >r + r@ - r> ; 
  9 r : left$  ( str1 n --- str2 ) 0 max min ; 
 10 r : mid$  ( str1 pos len --- str2 ) 
 11 r   >r over swap - right$ r> left$ ; 

Dernière section de code:

12 r : c+$! ( c str1 -- ) over >r + c! r> cell - dup @ 1+ swap ! ; 
 13 r : append$ { addr1 len1 addr2 len2 -- } 
 14 r   addr1 addr2 len2 + len1 cmove len1 addr2 cell - +! ; 
 15 r : input$  over swap maxlen$ nip accept swap cell - ! ; 
save-buffers 
forth 

La commande save-buffers force l'enregistrement du contenu du bloc dans le fichier utilisé par défaut par l'éditeur de blocs.

Compilation du contenu de blocs

Débranchez la carte ESP32. Rebranchez-là. Si l'enregistrement du code source dans un bloc d'édition s'est correctement déroulé, on peut retrouver ce code source comme ceci: editor l

Ce qui doit afficher le conteu de notre bloc:

--> 0 list
Block 0
\ strings management for ESP32forth                            | 0
: $= ( addr1 len1 addr2 len2 --- fl ) str= ;                   | 1
: string  ( n --- names_strvar ) \ define a strvar             | 2
  create dup ,  0 ,  allot does> cell+ cell+  dup cell - @ ;   | 3
: maxlen$  over cell - cell - @ ;                              | 4
: $!  ( str strvar --- )  \ store str into strvar              | 5
  maxlen$ nip rot min 2dup swap cell - ! cmove ;               | 6
: 0$! ( addr len -- ) drop 0 swap cell - ! ;                   | 7
: right$  ( str1 n --- str2 ) 0 max over min >r + r@ - r> ;    | 8
: left$  ( str1 n --- str2 ) 0 max min ;                       | 9
: mid$  ( str1 pos len --- str2 )                              | 10
  >r over swap - right$ r> left$ ;                             | 11
: c+$! ( c str1 -- ) over >r + c! r> cell - dup @ 1+ swap ! ;  | 12
: append$ { addr1 len1 addr2 len2 -- }                         | 13
  addr1 addr2 len2 + len1 cmove len1 addr2 cell - +! ;         | 14
: input$  over swap maxlen$ nip accept swap cell - ! ;         | 15
 ok

Pour compiler ce code, il suffit de taper le numéro du bloc, 0 pour notre exemple, suivi de load. Il est aisé de vérifier que le contenu du bloc a été correctement compilé en tapant words.

Pour compiler le contenu de ce bloc automatiquement au démarrage de ESP32Forth, on va mettre cette commande de chargement dans le fichier /spiffs/autoexec.fs comme ceci:

s" 0 load " s" /spiffs/autoexec.fs" dump-file 

Le système tentera automatiquement de monter le système de fichiers SPIFFS sur /spiffs. Ce tentera alors au démarrage de charger /spiffs/autoexec.fs.

Une façon d'utiliser cette fonctionnalité pour charger un bloc.

Si votre code FORTH est réparti sur plusieurs blocs contigus, par exemple sur les blocs 0 à 5, faites exécuter 0 5 thru.

Le chargement du code source FORTH depuis les blocs est extrêmement rapide. Cette possibilité permet de rajouter des définitions sans nécessiter leur transfert de manière répétée par le terminal.


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