Je continue mon travail sur Tiny BASIC sur STM8 Depuis une semaine environ j'ai travaillé sur l'amélioration des performances de l'interpréteur et j'ai multiplié celle-ci par 4,7. 12 millisecondes pour effectuer 1000 boucles FOR...NEXT vide alors que dans la version précédente il fallait 56 millisecondes.
Dans cette nouvelle version l'analyse lexicale est faite une seule fois et l'interpréteur fait la lecture d'une liste d'unités lexicales plutôt que du texte source. Il serait bien sur possible d'améliorer encore plus la performance en compilant le code source en byte code à exécuter par une machine virtuelle comme le fait MicroPython. Mais alors il serait très complexe de retrouver le texte original. Le problème est le suivant. Il n'y a que 5741 octets de RAM disponible pour les programmes BASIC. Il n'est pas possible de conserver une copie du programme source. Donc pour retravailler le code source il faut le rendre disponible sous forme texte.
Avec la méthode que j'utilise il est relativement simple de reconstruire l'équivalent du code source à partir de la liste des unités lexicales. Il est donc possible à tout moment d'examiner le programme sous forme texte et de modifier le programme comme s'il était conservé dans sa forme originale. Comme s'il s'agissait d'un éditeur de texte.
Je ne veux pas utiliser la mémoire flash car l'édition d'un code source requiert de fréquentes modifications. Hors la mémoire flash n'est garantie que pour 10 000 cycle d'effacement/écriture. Ce n'est donc pas recommandé de l'utiliser comme tampon pour l'édition d'un texte.
Rappel des objectifs
Il s'agit de concevoir un interpréteur Tiny BASIC résident sur le microcontrôleur et qui utilise un émulateur de terminal sur le PC pour l'interface utilisateur. Les programmes sont exécutés à partir de la mémoire RAM mais peuvent-être sauvegardés sous forme de fichiers dans la mémoire étendue du microcontrôleur. Cette mémoire étendue est de 96Ko sur le STM8S208RB.
Il s'agit donc d'un système REPL Read,Execute,Print,Loop comme MicroPython. Ce système rappel les premier ordinateurs personnel des années 1970s, comme le TRS-80 I, le Appel II, etc, sauf ici qu'il s'agit de programmer un microcontrôleur et non d'un ordinateur d'usage général.
Une fois le système installé sur la carte il suffit de relier celle-ci à un PC avec un câble USB pour l'alimente. L'interface USB de la carte NUCLEO a un canal de classe ACM pour la communication par port sériel. Sur le PC un émulateur de terminal comme pTTY, TeraTerm, GtkTerm ou autre permet d'interagir avec la carte. Sous Linux ce périphérique sériel se présente comme /dev/ttyACMn où n est un nombre qui différencie les différents périphérique de ce type.
picatout$: ls /dev/ttyACM*
/dev/ttyACM0
picatout$: minicom -D/dev/ttyACM0 -b115200
Exemple de programme
Voici un exemple de programme extrait du manuel de l'utilisateur. Ce programme contrôle l'intensité de la LED LD2 qui est sur la carte à partir du terminal. La touche u augmente l'inensité. la touche d la diminue et la touche q termine le programme. La valeur de l'intensité est affichée sur le terminal à position fixe et mise à jour à chaque changement.
5 'Software PWM, controle LD2 sur carte
7 PRINT # 6,
10 R = 511 :PRINT R ,
20 K = 0
30 IF R :BSET GPIO ( 2 ,ODR ), 32
40 FOR A = 0 TO R :NEXT A
50 BRES GPIO ( 2 ,ODR ), 32
60 FOR A =A TO 1023 :NEXT A
70 IF QKEY :K =KEY
80 IF K =ASC (\u):GOTO 200
90 IF K =ASC (\d):GOTO 400
100 IF K =ASC (\q):STOP
110 GOTO 20
200 IF R < 1023 :R =R + 1 :GOTO 600
210 GOTO 20
400 IF R > 0 :R =R - 1 :GOTO 600
410 GOTO 20
600 PRINT "\b\b\b\b\b",R ,
610 GOTO 20
Aucun commentaire:
Publier un commentaire
Remarque : Seuls les membres de ce blogue sont autorisés à publier des commentaires.