Rendre le code FORTH accessible de manière permanente

publication: 28 décembre 2023 / mis à jour 28 décembre 2023

Read this page in english

 


Sélection de la mémoire RAM ou FLASH

MECRISP Forth écrit le code FORTH compilé en deux endroits bien distincts:

Si vous compilez du code FORTH, ce code disparait de la carte RP pico (ou toute autre carte) dès sa mise hors tension on un reset.

Un exemple simple en compilant juste cette définition:

: myTest  ." This is my test" ; 

Si on compile cette définition, puis on exécute list, on retrouve notre mot:

list
myTest --- Mecrisp-Stellaris RA 2.6.5 --- 2dup 2drop 2swap 2nip 2over 2tuck 2rot...

Ce code est compilé dans la mémoire RAM. Il ne peut donc pas être conservé après une mise hors tension de la carte RP pico ou l'execution de reset.

Fixer le code FORTH en mémoire FLASH

L'idée est de rendre toute ou une partie du code FORTH accessible en permanence comme le sont déjà tous le smots du dictionnaire FORTH.

Pour réaliser celà, on doit d'abord donner comme directive à MECRISP qu le code qui suit doit être enregistré en mémoire FLASH:

compiletoflash 
/ ...here my new words 

Une fois notre code compilé en mémoire FLASH, on exécute le mot save:

compiletoflash 
/ ...here my new words 
save 

Ceci fait, on peut reprogrammer la compilation des définitions vers la mémoire RAM avec compiletoflash:

compiletoflash 
/ ...here my new words 
save 
compiletoram 

Cas pratique, extension du dictionnaire

Voici un lien vers des définitions FORTH permettant une gestion simplifiée des ports GPIO:
GPIO general library

Les directives compiletoflash, save et compiletoram sont déjà intégrées au code source. Il suffit d'exécuter quelques copié/collé entre le code source et le terminal connecté à la carte RP pico pour intégrer ce code à MECRISP Forth.

Une fois ce code chargé, coupez l'alimentation de la carte RP pico, ou exécutez reset.

Après redémarrage de MECRISP Forth, vous devez retrouver ces mots dans le dictionnaire FORTH:

list   \ display:
.......singletask task-in-list? previous insert remove task: preparetask activate 
background tasks catch throw TIMEHW TIMELW TIMEHR TIMELR TIMERAWH TIMERAWL cycles 
delay-cycles us ms u.4 u.2 dump16 dump test SIO_BASE GPIO_OE GPIO_OE_SET GPIO_OE_CLR 
GPIO_IN GPIO_OUT GPIO_OUT_SET GPIO_OUT_CLR GPIO_OUT_XOR PIN_MASK GPIO_OUT GPIO_IN 
gpio_set_dir GPIO_HIGH GPIO_LOW gpio_put gpio_get IO_BANK0_BASE GPIO_CTRL 
GPIO_FUNC_SPI GPIO_FUNC_UART GPIO_FUNC_I2C GPIO_FUNC_PWM GPIO_FUNC_SIO GPIO_FUNC_PIO0 
GPIO_FUNC_PIO1 GPIO_FUNC_GPCK GPIO_FUNC_USB GPIO_FUNC_NULL gpio_set_function 
IO_BANK0_GPIO0_CTRL_FUNCSEL_BITS gpio_get_function

Ces définitions sont devenues permanentes. Elles font autant partie de FORTH que tous les autres mots déjà définis.

Pour rappel, le principe de base de la compilation FORTH consiste à étendre le dictionnaire FORTH.

Contrairement aux autres langages de programmation, avec FORTH il n'y a pas de distinction entre le compilateur, l'interpréteur, le code compilé. Exécutez juste ces quelques lignes:

25 constant BOARD_LED 
BOARD_LED GPIO_FUNC_SIO  gpio_set_function 
BOARD_LED GPIO_OUT gpio_set_dir 
BOARD_LED GPIO_HIGH gpio_put 
500 ms 
BOARD_LED GPIO_LOW gpio_put 

La LED intégrée à la carte RP pico doit s'allumer pendant une demi seconde.

Tous ces tests sont exécutables via l'interpréteur. On peut également compiler en mémoire RAM ces même tests:

25 constant BOARD_LED 
: LED.init ( -- ) 
    BOARD_LED GPIO_FUNC_SIO  gpio_set_function 
    BOARD_LED GPIO_OUT gpio_set_dir 
  ; 
: blink ( -- ) 
    begin 
        BOARD_LED GPIO_HIGH gpio_put 
        500 ms 
        BOARD_LED GPIO_LOW gpio_put 
        500 ms 
    key? until 
 ; 

Pour conclure, ne fixer en mémoire FLASH que du code FORTH testé et fiable. Nous verrons dans un autre article comment rendre un mot exécutable au démarrage de MECRISP Forth.


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