Apparition de ROMFS dans MicroPython

Bonjour à tous,

ROMFS: une nouvelle fonctionnalité fait son apparition dans MicroPython. 


ROMFS qui est en développement depuis plusieurs années permet de stocker 

  • des utilitaires (scripts pré-compilé), 
  • des fichiers de données (fonts)
  • des programmes pre-compilés 
Au sein même d'une partition dans la Mémoire Flash (sous forme d'un système de fichiers en lecture seule).  

Le but de ROMFS est d'optimiser l'accès et la rapidité d'exécution de ressources  SANS DEVOIR RECOMPILER MicroPython à chaque fois. 

Jusqu'à maintenant, seule l'inclusion -au sein du firmware- de scripts pré-compilés avec mpy-cross permettait d'atteindre les performances nécessaires à l'exécution de code "time sensitive".

Certes, mpy-cross permet de compiler un script en byte-code (des fichiers .mpy) mais l'accès reste encore conditionné par le système de fichiers pour le chargement (ou chargements multiples). Les fichiers .mpy, bien que pré-compilé, nécessite malgré tout des vérifications de routine et du chargement d'information en RAM.

Avec ROMFS, une partition dans la mémoire Flash permet d'être accédée directement par la VirtualMachine MicroPython. Les ressources sont directement accessibles par le noyaux MicroPython qui peut aussi lancer l'exécution directement en Flash (In-Place execution)... et cela en s'évitant la lourdeur du système de fichiers, les phases de compilations et allocations de RAM. Les routines de vérifications sont elles aussi réduites au stricte nécessaire puisque celles-ci sont opérées majoritairement au moment de l'assemblage/compilation de la ROMFS.

Implémentation restreinte

Au moment de l'écriture de ces ligne (MicroPython v1.25), ROMFS n'est disponible nativement que sur certaines plateformes: PYBD-SFx (Pyboard D), ALIF-Ports, ESP8266_Generic, STM32 boards.

Sinon, il est possible de compiler le firmware en activant la flash_romfs (voir FLASH_2M_ROMFS).

Utilitaire mpremote

L'utilitaire MPRemote de MicroPython a également le nouveau mot clé romfs avec les options:

  • query: pour consulter la romfs dans la flash.
  • build: pour créer une image romfs sur l'ordinateur
  • deploy: pour déployer l'image sur la romfs dans la mémoire flash du microcontroleur.

A noter que la compilation/build d'une image romfs require l'utilitaire mpy-cross .

romfs query

La capture suivante indique le contenu de la romfs sur le microcontroleur.

mpremote romfs query


Comme l'indique le réponse de l'utilitaire, la partition n'est pas encore initialisée. La partition fait 131 Kio (32 blocks de 4 Kio chacun).

romfs build

Prenons l'exemple d'un répertoire "utilities" qui contient les sources. Celui-ci ne contient qu'un script nommé "scan_i2c.py".

L'image de la partition romfs est créé avec la commande suivante:

mpremote romfs -o utilities.img build utilities

Le nom de l'image à créer est spécifié par le paramètre '-o'.
Le contenu du répertoire à compiler est précisé après le paramètre 'build'.

romfs deploy

Une fois l'image prête sur l'ordinateur, l'option deploy permet de copier celle-ci sur le microcontroleur.

mpremote romfs deploy utilities.img


Une fois l'image déployée, il est possible de vérifier une nouvelle fois l'état de la ROMFS avec romfs query . Cette fois, la partition est initialisée.

Exploiter la ROMFS

Une fois romfs initialisé, il est très facile d'utiliser son contenu.
Utiliser Thonny IDE permet d'inspecter le système de fichiers MicroPython. 

La partition romfs est montée dans le système de fichiers MicroPython sous le répertoire 'rom'.
Il est donc possible d'en inspecter le contenu.

Comme le démontre le shell interactif, il est possible de charger et d'exécuter le contenu de scan_i2c.py (compilé en .mpy) en executant un simple "import" sous Python.

ROMFS est un système de fichiers

L'appel de mount() sans paramètre affiche les systèmes de fichiers déjà monté dans MicroPython.

Ainsi les lignes suivantes indique la présence de romfs:

>>> import vfs
>>> print( vfs.mount() )
[ VfsRom('rom'), VfsFat('/flash') ]
>>> 

Toutes les fonctions de manipulation de fichiers sont donc utilisable sur le système de fichiers ROMFS.

Ressources

 

1 commentaire: