FlashFORTH sur ARDUINO

publication: 20 mai 2024 / mis à jour 20 mai 2024

Read this page in english

 

article: 11 mai 2019 / mis à jour 07 nov. 2019


ARDUINO c'est aussi un environnement de développement qui privilégie le langage C. Mais cet environnement exige d'incessantes compilations et téléversements vers la carte ARDUINO en cours de développement. La mise au point d'applications complexes peut vite devenir un vrai calvaire qui peut décourager les plus vaillants.

Avantages et inconvénients du langage C

Avec Arduino, nous devons utiliser un code minimal lorsque l'on crée un programme en langage C. Ce code permet de diviser le programme que nous allons créer en deux grosses parties:

void setup() //fonction d'initialisation de la carte
{
    //contenu de l'initialisation
}
void loop() //fonction principale qui se répète (s’exécute) à l'infini
{
    //contenu du programme
}

Un programme pour ARDUINO écrit en langage C devra obligatoirement être imbriqué à loop() pour le tester et l'exploiter.

Parmi les avantages du langage C: il dispose d'une bibliographie impressionnante, il est utilisé par beaucoup de développeurs, les librairies d'applications sont nombreuses...

Parmi les inconvénients du langage C: il reste verbeux, il n'y a aucune maitrise du code compilé, il est difficile de mettre au point des sous-programmes de manière indépendante du programme général...

Pour nous, le principal inconvénient des programmes écrits en langage C pour ARDUINO est la difficulté à diagnostiquer les bugs et dysfonctionnements des programmes réalisés. Ceci implique de développer couche par couche et tester chaque fonction individuellement avant de les imbriquer dans le programme général. Si une fonction en langage C modifie une variable, la seule manière de connaître la valeur prise par cette variable est de demander à la fonction d'en afficher le contenu.

Cette phase de conception et mise au point nécessite de fréquentes compilations et téléversements du code source écrit en langage C.

L'idéal serait de disposer d'un véritable langage de programmation alternatif, de préférence implanté directement sur la carte ARDUINO. Il en existe un: FORTH. Un langage très compact, puissant, rapide.

Qu'est-ce que FORTH?

FORTH peut s'installer sur une carte ARDUINO, tant pour le développement qu'en fonctionnement pour toutes vos applications, sans perte de performances.

Un programme écrit en FORTH s'exécute quasiment aussi rapidement que son équivalent en langage machine pur. Et les programmes FORTH compilés sont plus compacts que ceux écrits en langage C.

Vous tapez une liste de commandes FORTH. FORTH exécute ces commandes en séquence et attend la liste suivante de commandes. Exemple:

123 dup * .  \ affiche 15129 ok 

Les nouvelles commandes sont compilées pour étendre les listes de commandes existantes.

:   ; 

Exemple:

: carre dup * ; 
123 carre .   \ affiche 15129 

FORTH est l'interface homme-machine la plus simple

Les commandes les plus avancées peuvent être testées et déboguées de manière interactive, grâce à l'intrepréteur intégré au langage FORTH.

La programmation par le bas permet de créer et de tester des applications fiables. Tous les mots définis ou pré-définis peuvent être testés via l'interpréteur à l'exception de quelques mots utilisables exclusivement en compilation (IF..ELSE..THEN par exemple)

Les périphériques de mémoire et d'E/S peuvent être examinés et programmés de manière interactive, toujours grâce à l'interpréteur. L'accès à n'importe quel registre est totalement transparent: PORTA c@ récupère via l'interpréteur le contenu du registre PORTA du PORT A.

Les caractéristiques uniques de Forth:

Les avantages de FORTH:

L'interpréteur de texte analyse une liste de commandes sous forme textuelle. Exemples:

13 DUP * . 
WORDS 
HEX 
0 100 DUMP 

Quelques commandes FORTH:

 + - * / mod
 and or xor not
 key emit type dump
 @ ! c@ c! cmove fill erase
 dup drop swap over rot
 If-else-then, begin-while-repeat,
 for-next

Le compilateur FORTH

Le compilateur FORTH est l'interpréteur de texte fonctionnant en mode compilation.

Le compilateur FORTH crée de nouvelles commandes. Celles-ci regroupent des listes de commandes existantes.

Exemples:

: CARRE DUP * ; 
: SALUT CR ." BONJOUR LES AMIS!" ; 
: FIBONACCI ( n --) 
    0 1 ROT 
    FOR SWAP OVER + NEXT 
    DROP ; 

FORTH pour Arduino

Quelques versions du langage FORTH pour Arduino:

Exécution de FORTH pour Arduino

exemple fonctionne avec AmForth

Allumage et extinction LED:

HEX 
20 24 C! \ positionne Pin 13 en sortie 
20 23 C! \ bascule Pin 13 

exemple fonctionne avec Flash FORTH

La plupart des exemples sont compatibles entre la version AmForth et Flash Forth, ce dernier étant sensible à la casse des caractères, il sera nécessaire de parfois d'adapter les codes sources disponibles sur le net.

Allumage et extinction LED connectée au pin 13:

hex 
20 24 c! \ positionne Pin 13 en sortie 
20 23 c! \ bascule Pin 13 

Cet exemple est exécutable directement en mode interpérté depuis un terminal relié à la carte ARDUINO, sans compilation ni téléversement comme ce serait le cas en langage C!

exemple fonctionne avec AmForth

Allumage et extinction beeper:

40 2A C! \ positionne Pin 6 en sortie 
42 44 C! \ positionne Timer0 en mode CTC 
FF 47 C! \ comptage maximum pour Timer0 
3 45 C!  \ prescaler=3, démarrage beeper 
0 45 C!  \ prescaler=0, arrêt beeper 

L'exemple peut être entré ligne à ligne depuis le terminal ou en faisant un copié/collé entre cette page et le terminal connecté à la carte ARDUINO (voir: Communiquer avec Flash Forth)