mardi 1 septembre 2015

Forth pour LPC1114FN28

Il y a quelques jours, en parcourant les news du site http://hackaday.com, je suis 'tombé' sur une nouvelle intéressante concernant le portage du langage Forth sur le processeur LPC1114FN28 de chez NXP. Ce superbe travail a été effectué par Matthias Koch. Nouvelle intéressante car j'ai développé une carte d'expérimentation pour ce circuit. Je pensais donc être en mesure d'obtenir rapidement un système autonome et assez efficace. Ce fût le cas.

La carte de dev LPC en compagnies de quelques cartes sœurs.
Pour rappel, la carte de développement Micromite (autre carte développée par mes soins) contient, elle, un interpréteur Basic extrêmement efficace. Mais il s'agit d'un interpréteur. Dans le cas du Forth, il s'agit plus d'un compilateur qui traduit directement les lignes de code entrées par le port série, en code natif, d'ou une exécution extrêmement rapide des programmes. A noter que cette implémentation Forth fonctionne dès 512 octets de RAM et est en mesure de générer le code soit en RAM, soit directement en Flash, un peu à la manière du Micromite.

La procédure d'implémentation de ce compilateur Forth est on ne peu plus triviale. Il est nécessaire de télécharger la version mecrisp-stellaris-2.1.3.tar.gz (version 2.1.3 à la date de ce billet) disponible sur le site Sourceforge.net. La décompression de cette archive permettra de trouver le fichier 'mecrisp-stellaris-lpc1114fn28.hex' dédié, on s'en douterait, au processeur LPC1114FN28! 

Ce fichier 'hex' doit être programmé dans le LPC à l'aide de la carte de développement que j'ai développé (la programmation peut aussi se faire sur plaque d'essais en fil volants, mais c'est moins pratique), et par exemple le logiciel FlashMagic : 

Il n'y a plus qu'a user du bouton 'start'!
Avec le message de fin de programmation si la procédure s'est déroulée correctement. Il n'y a pas de raison qu'il en soit autrement avec la carte de développement :

Ready!
Il ne reste plus qu'à utiliser un émulateur de terminal série pour vérifier le bon fonctionnement du système. Ici encore, la flexibilité de la carte de développement permettra de travailler directement en USB sur n'importe quel PC. En ce qui me concerne, j'utilise couramment le logiciel Realterm, facilement trouvable sur Internet. Il convient cependant de configurer cet émulateur de terminal pour un résultat optimal.

Tout d'abord le type d'émulation :



Puis le port série concerné et la configuration nécessaire à la communication avec Forth à savoir 115200, 8, N, 1 : 


Enfin, il est nécessaire de désactiver les broches RTS et DTR de l'interface série sinon le processeur reste constamment en mode RESET :


Il ne reste plus qu'à appuyer sur le bouton RESET de la carte pour obtenir l'invite du compilateur Forth : 

J'aime qu'un plan se déroule sans accrocs ;-)
Et maintenant? Impossible de ne pas tenter l'inévitable "Hello World" de l'électronique, à savoir la LED qui clignote. Très sympa, l'auteur de ce compilateur Forth, non content d'avoir eu la bonne idée de prévoir une implémentation du Forth sur le LPC1114, a aussi prévu quelques programmes de test dont l'inévitable Blinky dont je reproduis ci-dessous le code :

\ Blink a LED on P1.8

$40044014 constant IOCON_PIO1_8
$50013FFC constant GPIO1_DATA
$50018000 constant GPIO1_DIR

: blinky ( -- )
  $C0 IOCON_PIO1_8 ! \ Set P1.8 as GPIO without Pullup/Pulldown. $C0 are reserved bits that must be set.
  256 GPIO1_DIR    ! \ Set P1.8 as Output

  begin
    256 GPIO1_DATA !
    1000000 0 do loop
      0 GPIO1_DATA !
    1000000 0 do loop
  key? until
;

Ce code se passe de commentaire... Si ce n'est que, bien que la carte de développement possède une LED dédiée à ce type d'exercice, je ne souhaitait pas modifier le programme de l'auteur car sur la carte, la LED ne se trouve pas sur le port P01_8. J'ai donc câblé une LED 'externe' directement sur le PORT P01_8 :


Le système utilisé avec la LED jaune reliée sur le connecteur externe.

L'étape suivante consiste donc à 'envoyer' ce fichier à la carte de développement à l'aide de l'émulateur de terminal. Afin de laisser le temps au noyeau Forth de décoder les lignes envoyées et de les gérer, j'ai inséré quelques milli-secondes d'attente après chaque lignes. Realterm permet d'effectuer ce type d'action très facilement : 

Juste avant d'appuyer sur 'Send file'....
La carte a correctement reçu le programme :


Il suffit dès lors de taper la commande 'blinky' pour lancer l'application et constater le clignotement de la LED : 

Et voilà!
Remarque : la rapidité d'exécution de ce système est remarquable. Une boucle vide telle que le 'programme' suivant : 

: delay 0 do loop ;  ok.

10000000 delay ok.
 
s'exécute en à peu près 4 secondes. Pour rappel, le Micromite version 2 exécute une boucle basic vide en 11 secondes. Une carte à 8051 basic rapide, en 50 secondes et le vénérable Sharp PC1500 en 3000 secondes. Nous sommes donc plus de 700 fois plus rapide que le PC1500.

1 commentaire:

  1. Bonjour,

    Je croyais être le seul français à avoir flashé Mecrisp-Stellaris !
    Je l'ai fait sur une stm32f429 à écran graphique il y a 2 ans. Mais devant l'apparente petitesse de la communauté française j'ai laissé tomber pour me tourner vers FlashForth pour Atmel 328p.
    Néanmoins si l'on peut se compter en France , pourquoi ne pas retenter le coup.
    Peut être à vous lire.

    Guy Fortabat
    78squirel78@gmail.com

    PS: j'ai toujours un Sharp PC1350 ;-)

    RépondreSupprimer