Utiliser nos librairies sous Linux aarch64 ou arm64

Utiliser nos librairies sous Linux aarch64 ou arm64

Quelques clients nous ont demandé si nous supportons Linux aarch64 ou arm64, c'est-à-dire un Linux qui utilise un processeur ARM 64 bits. La réponse est : oui et non. Nous ne fournissons pas de binaires pré-compilés pour ces plateformes, donc par défaut nos librairies ne fonctionnent pas. Mais il est possible de recompiler nos librairies pour les faire fonctionner correctement. Explications...





Tout d'abord, clarifions les appellations aarch64 et arm64, certaines distributions utilisent le terme arm64 alors que d'autres utilisent le terme aarch64, pareil pour les compilateurs. Dans les deux cas, cela fait référence à l'utilisation d'un processeur ARM qui fonctionne en mode 64 bits. Dans cet article, nous utiliserons le terme aarch64 car c'est celui qui est utilisé par le kernel Linux.


L'architecture aarch64


Pour exécuter un binaire aarch64 il faut donc un processeur ARM de la famille ARMv8 qui supporte les instructions 64 bits et une distribution Linux qui soit prévue pour fonctionner en 64 bits sur ce type de processeur.

Bien que les processeurs ARM supportant les instructions 64 bits soient très répandus sur les smartphones, la plupart des mini-PCs continuent à utiliser des distributions Linux qui fonctionnent uniquement en 32 bits. L'exemple le plus connu est le Raspberry Pi 3 et 3+. Leurs processeurs supportent les instructions 64 bits mais la distribution Raspbian continue à ne supporter que le mode 32 bits.

Le résultat de la commande uname sur in Rapsberry Pi 3 avec la distribution Raspbian:

pi@raspberrypi:~ $ uname -a Linux raspberrypi 4.9.80-v7+ #1098 SMP Fri Mar 9 19:11:42 GMT 2018 armv7l GNU/Linux



Il est toutefois possible d'utiliser d'autre distributions, par exemple Ubuntu, et de les installer sur un Raspberry Pi 3 pour qu'il fonctionne en aarch64.

Le résultat de la commande uname sur in Rapsberry Pi 3 avec la distribution Ubuntu arm64:

ubuntu@ubuntu:~/yoctolib/v1.0/Public/python/Sources$ uname -a Linux ubuntu 4.14.66-chainsx-cxcore+ #2 SMP PREEMPT Sun Aug 26 03:37:14 EDT 2018 aarch64 aarch64 aarch64 GNU/Linux



Bref, l'architecture aarch64 est pour l'instant très peu utilisée dans le domaine de l'IoT. Ce qui est assez logique. Le support 64 bits n'apporte rien d’intéressant pour ce type d'usage.

Nous avons cependant certains clients qui utilisent des board Jetson de Nvidia et qui aimeraient pourvoir utiliser nos modules sur ces plateformes.


Les librairies compatibles


Comme nous l'avons dit plus tôt, nous ne fournissons pour l'instant pas de binaires aarch64, cependant comme nous fournissons les sources de toutes nos librairies de programmation, il est possible de les recompiler pour qu'elles fonctionnent sur cette plateforme.

Les librairies qui peuvent être utilisées sous Linux sont les librairies C++, Python, Java et notre librairie en ligne de commande.

La librairie en ligne de commande


C'est le cas le plus simple, la librairie supporte complètement l'architecture aarch64, mais les binaires ne sont pas inclus dans l'archive. Pour compiler les versions aarch64 de tous les exécutables, il faut simplement exécuter la commande suivante à la racine de la librairie:

./build.sh aarch64



La compilation est assez longue, mais à la fin tous les exécutables se trouvent
dans le sous-répertoire Binaries/linux/aarch64.

La librairie C++


Tout comme pour la librairie en ligne de commande, il suffit d’exécuter sur votre marchine aarch64 la commande ./build.sh aarch64 pour recompiler la librairie C++ ainsi que tous les exemples. Si vous désirez compiler uniquement un exemple, vous pouvez lancer la commande make aarch64 dans l'exemple qui vous intéresse. Tous les fichiers compilés finiront dans un sous-répertoire "linux/aarch64".

Note: Si vous utilisez votre propre projet, il n'y rien de particulier à faire. Il suffit d'inclure les fichiers sources à votre projet et tout devrait compiler sans erreur ou warning.


La librairie Python


Pour Python, c'est un petit peu plus compliqué. La librairie est composée de deux parties:

  • Le code Python qui implémente les objets de notre librairie
  • Une librairie dynamique yapi pour chaque plateforme (Windows, Linux 32bits, Linux armhf, etc.)


Le code Python est compatible avec l'architecture aarch64 car c'est la machine virtuelle Python qui compile le code et génère du code machine que le processeur sait interpréter.

Pour la librairie dynamique, c'est différent, car il s'agit un fichier binaire déjà compilé pour une architecture spécifique. Lors de l’exécution, la machine virtuelle va chercher la version aarch64 de la librairie dynamique yapi. Comme elle n'est pas incluse par défaut, une erreur est retournée lors du premier appel à YAPI.RegisterHub().

ubuntu@ubuntu:~/python/Examples/Doc-Inventory$ python inventory.py Traceback (most recent call last): File "inventory.py", line 25, in <module> if YAPI.RegisterHub("usb", errmsg) != YAPI.SUCCESS: File "../../Sources/yocto_api.py", line 2368, in RegisterHub res = YAPI.InitAPI(0, errmsg) File "../../Sources/yocto_api.py", line 2257, in InitAPI YAPI.yloadYapiCDLL() File "../../Sources/yocto_api.py", line 1008, in yloadYapiCDLL "), make sure it is available and accessible.") ImportError: YAPI shared library is missing (../../Sources/cdll/libyapi-aarch64.so), make sure it is available and accessible.




Mais, comme nous fournissons le code source de toutes nos librairies de programmation, il est possible de compiler cette librairie dynamique pour la plateforme aarch64 et de l'ajouter à la librairie Python.

Compiler la librairie dynamique yapi pour aarch64


Le code source de la librairie dynamique yapi n'est pas inclus dans la librairie Python, il se trouve dans la librairie C++. Il faut donc télécharger la librairie C++ et la déziper sur la machine aarch64.

Il faut ensuite compiler la librairie avec la commande make libyapi-aarch64.so dans le répertoire "Binaries":

ubuntu@ubuntu:~/cpp/Binaries$ make libyapi-aarch64.so compiling linux/aarch64/objs/yapi_dyn.o compiling linux/aarch64/objs/ystream_dyn.o compiling linux/aarch64/objs/yprog_dyn.o compiling linux/aarch64/objs/yfifo_dyn.o compiling linux/aarch64/objs/ykey_dyn.o compiling linux/aarch64/objs/yhash_dyn.o compiling linux/aarch64/objs/yjson_dyn.o compiling linux/aarch64/objs/ytcp_dyn.o compiling linux/aarch64/objs/ymemory_dyn.o compiling linux/aarch64/objs/ythread_dyn.o compiling linux/aarch64/objs/yjni_dyn.o compiling linux/aarch64/objs/ypkt_lin_dyn.o linking linux/aarch64/yapi/libyapi.so.1.0.1 cp linux/aarch64/yapi/libyapi.so.1.0.1 libyapi-aarch64.so



A la fin on se retrouve avec un fichier libyapi-aarch64.so qui est la librairie dynamique yapi pour l'architecture aarch64.

Copier la librairie libyapi-aarch64.so dans la librairie Python


L'étape finale est de copier le fichier libyapi-aarch64.so dans le sous-répertoire cdll des sources de la librairie Python.

Au final, on a l'arborescence suivante:

  • yocto_accelerometer.py
  • yocto_altitude.py
  • yocto_api.py
  • ...
  • cdll/

    • libyapi-aarch64.so
    • libyapi-amd64.so
    • libyapi-armel.so
    • libyapi-armhf.so
    • libyapi-i386.so
    • libyapi.dylib
    • yapi.dll
    • yapi64.dll



La librairie Python est désormais utilisable sous Linux aarch64:

ubuntu@ubuntu:~/python/Examples/Doc-Inventory$ python inventory.py Device list RELAYLO1-27EAB (Yocto-Relay) YPWMRX01-AE391 (Yocto-PWM-Rx) YBUTTON1-2072D (Yocto-Knob) YPWMTX01-B9625 (Yocto-PWM-Tx)



Attention, si vous avez obtenu notre librairie Python à l'aide de PyPI, il est possible que l'installeur pip soit perturbé par cette modification et qu'il refuse de mettre à jour la librairie dans le futur.

La librairie Java


La librairie Java est dans la même situation que la librairie Python, mais uniquement si vous utilisez des modules Yoctopuce branchés sur un port USB. En effet il n'est pas nécessaire de compiler la librairie dynamique yapi si vous utiliser un YoctoHub accessible par le réseau.

Pour pouvoir accéder aux modules USB, par contre, il faut impérativement compiler le fichier libyapi-aarch64.so comme nous l'avons vu plus haut pour Python.

Ce fichier doit être ensuite copié dans un répertoire listé dans la propriété java.library.path de la JVM. Cette propriété est une liste de répertoires dans lesquels la JVM recherche les librairies dynamiques. Sous Linux, cette propriété est initialisée avec le contenu de la variable d’environnement LD_LIBRARY_PATH, mais en cas de doute il est possible de d'obtenir la valeur exacte de cette propriété avec le code suivant:


public static void main(String[] args)
{
    String prop = System.getProperty("java.library.path");
    System.out.println("Install libyapi-aarch64.so in " + prop);
}
 



Conclusion


Comme nous venons de le voir, la procédure pour supporter Linux aarch64 n'est pas très compliquée. Cela permet aussi de mettre en évidence l'avantage d'avoir les sources d'une librairie de programmation: Il est toujours possible d'adapter la libraire à ses besoins.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.