• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 23/12/2019

Découvrez la cross-compilation pour l’embarqué

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Présentation de l’environnement utilisé pour ce cours

Dans cette partie, vous allez installer et découvrir l’environnement de développement pour plateforme ARM sous GNU/Linux, afin de compiler et tester votre premier programme. Mais commençons tout d'abord avec une présentation rapide de l'environnement dans lequel vous allez évoluer.

Découvrez la Raspberry PI

La Raspberry PI est un "petit" ordinateur "tout-en-un" équipé d'un processeur ARM, conçu à l'origine à des fins pédagogiques par l'université de Cambridge. Il regroupe sur une seule carte l'essentiel des composants permettant de concevoir un nano-ordinateur ou un système embarqué connecté. Du fait de son faible coût et de sa conception "tout-en-un", cette carte est maintenant utilisée dans de nombreux projets liés à l'informatique embarquée ou au prototypage.

La famille Raspberry est composée de plusieurs cartes, ayant des tailles et des performances différentes, avec un prix allant de 10 € à 35 €. L'avantage de ces cartes est de posséder, en plus de la connectique classique USB, des ports d'entrée/sortie appelés GPIO. Ces ports permettent l'interfaçage avec d'autres circuits pour la réalisation de projets électroniques, robotiques...

Le modèle classique, dit B, est actuellement à la version 3B+ faisant suite aux versions 1B, 1B+, 2B, 3B. Dans sa dernière version, cette carte possède un processeur quadricoeur, 1 Go de RAM, 4 ports USB2, 1 port RJ45, 1 sortie HDMI, 1 sortie audio jack, le wi-fi et le Bluetooth.

Raspberry PI 3 b+
Raspberry PI 3B+

Le modèle A est actuellement dans sa version 3A+, suite aux modèles 1A et 1A+. Il est un peu moins coûteux que le modèle B et possède donc des caractéristiques allégées. Ainsi, la dernière version ne propose que 512 Mo de RAM, 1 seul port USB2 et il ne dispose pas de connecteur RJ45.

Raspberry PI 3 A+
Raspberry PI 3A+

Le modèle Zero est une version plus compacte que les modèles précédents et propose une connectique minimale. Son prix de lancement était de 5 $ (modèle Zero de base) ; on le retrouve actuellement avec un prix autour de 15 € pour le modèle Zero WH qui dispose du wi-fi et du Bluetooth. La version WH dispose d'un processeur monocœur, 512 Mo de RAM, 1 micro-USB et 1 mini-HDMI.

Raspberry PI zero W
Raspberry PI zero W

Le système d'exploitation de prédilection est GNU/Linux et c'est celui-ci que nous allons utiliser. Mais cette carte est aussi compatible avec Microsoft Windows 10 IoT Core et certaines versions de Google Android.

Vous utiliserez dans ce cours une Raspberry PI 3b ; voici ses principales caractéristiques :

  • SoC Broadcom BCM2837 ;

  • processeur : ARM Cortex-A53 à 1,2 GHz quadri-cœur ;

  • GPU : VideoCore IV 400 MHz ;

  • 4 ports USB2 ;

  • sortie vidéo HDMI et composite (via prise jack) ;

  • sortie audio stéréo jack ;

  • lecteur MicroSD ;

  • Ethernet 10/100 RJ45, wi-fi 802.11N, Bluetooth 4.1 ;

  • connecteur pour : 17 GPIO, UART, I2C, SPI, I2S, audio.

Vous pouvez vous en douter, la Raspberry PI offre beaucoup de possibilités à petit prix. Vous la retrouverez ainsi dans de nombreux projets, tels que les serveurs NAS ou pare-feu "maison", les bornes d'arcade, les lecteurs vidéo, les systèmes de contrôle robotique ou, comme dans ce cours, les box de gestion domotique.

Différence architecture x86/ARM

L'architecture x86 équipe généralement les ordinateurs/serveurs, alors que l'on retrouve plutôt l'architecture ARM dans les systèmes embarqués. Mais pourquoi deux architectures différentes ?

Le x86 est une architecture CISC (Complex Instruction Set Computer), alors que l'ARM est une architecture RISC (Reduced Instruction Set Computer). Ainsi, un processeur ARM ne supporte que des instructions simples et de taille fixe s'exécutant en un nombre constant de cycles ; alors que les processeurs x86 proposent des instructions nécessitant plus de cycles que d'autres pour réaliser certaines tâches complexes.

Ainsi, un processeur basé sur l'architecture RISC est moins complexe et nécessite moins de transistors. Ce qui permet de réduire les coûts de production, obtenir une meilleure efficacité thermique et une consommation énergétique plus faible. L'un des avantages de l'architecture CISC est de fournir des instructions spécialisées permettant d'exécuter certaines tâches plus rapidement.

Par exemple, une opération de traitement multimédia sera traduite en un ensemble d'instructions simples sur RISC et une seule instruction sur CISC. Ces instructions complexes permettent, au final, d'économiser des cycles et d'obtenir de meilleures performances pour certains traitements. Un processeur CISC est donc composé de plus de transistors, a besoin de plus d'énergie pour fonctionner, et est donc très peu utilisé dans le monde de l'embarqué.

Pourquoi utiliser la cross-compilation ?

Au cœur de votre machine, PC ou Raspberry PI, vous retrouvez un ou plusieurs processeurs. Le principal rôle de ce processeur est d'exécuter les différentes instructions contenues dans un exécutable. Lorsque vous écrivez un programme, en C par exemple, vous devez ensuite le compiler pour obtenir une suite d'instructions compréhensibles par votre processeur.

Après avoir installé un GNU/Linux et la chaîne de compilation GCC sur votre système, vous pouvez compiler un programme C sur une Raspberry PI et obtenir un exécutable compatible avec son architecture, ou compiler ce programme sur PC. Si vous copiez l'exécutable compilé sur Raspberry PI sur votre PC, il ne fonctionnera pas. Vous aurez le même effet si vous testez l'exécutable compilé pour votre PC sur votre Raspberry PI.

Bien que puissante par rapport à d'autres systèmes embarqués, la Raspberry PI n'en reste pas moins un système léger comparé aux ordinateurs de bureau. Compiler une application, ou un système complet, directement sur une Raspberry PI peut prendre 10 à 100 fois plus de temps que sur un PC équipé d'un processeur plus rapide et de beaucoup plus de mémoire vive. Sans compter les effets liés à la monopolisation du processeur durant la compilateur : par exemple, des ralentissements de la réactivité du système, des blocages de l'interface graphique, etc.

De plus, Il n'y a pas plus frustrant qu'une compilation de plusieurs heures qui se termine pas une erreur due au manque de mémoire vive. Finalement, dans d'autres cas, il est difficile, voire impossible, de compiler directement l'application voulue sur le système. Notamment lorsque les ressources disponibles ne sont pas disponibles, i.e. espace disque réduit, mémoire vive très limitée, aucune connexion Internet disponible, pas de possibilité de se connecter au système...

Pour pallier ces problèmes de ressource/limitation/performance/temps de compilation, on fait appel à la cross-compilation. La cross-compilation permet de générer sur une architecture X un exécutable qui sera compatible avec une architecture Y. Dans notre cas, nous allons compiler depuis un PC (architecture x86-64) ayant de bonnes performances pour générer des exécutables compatibles avec la Raspberry PI (architecture ARM).

Pourquoi émuler un processeur ARM sur x86

L'objectif principal est d'économiser du temps lors de la phase de développement/création d'un système ou d'une application pour l'embarqué. Par exemple, pour tester un système sur une Raspberry PI, il est nécessaire de recopier le système sur une carte SD ou une clé USB — ce qui peut prendre quelques dizaines de minutes — puis insérer la clé dans la Raspberry PI, penser à brancher un écran pour vérifier que le système démarre correctement, et ensuite tester. Cette procédure fastidieuse est à répéter à chaque modification du système.

Contrairement à la virtualisation, qui permet de faire fonctionner plusieurs systèmes d'exploitation de la même architecture sur un ordinateur, l'émulation permet d'exécuter une architecture différente. Il est ainsi possible d'émuler une architecture RISC, ou un système embarqué complet tel qu'une Raspberry PI, sur un ordinateur classique. Cette phase d'émulation peut avoir un impact sur les performances, car l'émulateur doit convertir les instructions RISC en instructions CISC et simuler le matériel, mais elle permet de gagner du temps lors de la phase de test. Vous pouvez ainsi directement démarrer le système ou l'application sans passer par la case carte SD.

Exemple de certificat de réussite
Exemple de certificat de réussite