Blog

Développement de systèmes et périphériques embarqués : une vue d'ensemble

August 11, 2021
Secure Code Warrior
Gros plan sur une carte électronique verte avec dissipateur thermique en métal, puces et connecteurs.

Chez Secure Code Warrior, nous cherchons constamment à élargir notre offre de formation. Afin d'aider les développeurs embarqués et les responsables de la sécurité à concevoir des systèmes embarqués sécurisés, nous explorons le domaine de la sécurité des systèmes embarqués. Dans cet article, nous partagerons les points essentiels que les développeurs et les architectes doivent connaître pour construire des systèmes embarqués sécurisés.

Un appareil embarqué est une unité informatique autonome, dotée de son propre matériel et logiciel basés sur un microprocesseur. Ils sont généralement utilisés pour effectuer des fonctions dédiées, soit de manière indépendante, soit en tant que parties de systèmes plus vastes.

Qu'est-ce qu'un appareil et un système embarqué ?

Les appareils embarqués sont des systèmes informatiques conçus à des fins spécifiques, dotés d'un matériel et d'un logiciel minimalistes, programmés pour remplir des fonctions précises. Selon leur usage, la complexité des appareils embarqués peut varier.

Si un système embarqué doit effectuer des opérations complexes et gourmandes en ressources, son matériel peut comprendre plusieurs processeurs avec divers périphériques interconnectés. Si, en revanche, il est conçu pour une tâche simple, il peut ne contenir qu'un seul microcontrôleur.

Certains systèmes embarqués sont des boîtes noires sans interface utilisateur, tandis que d'autres peuvent disposer d'interfaces graphiques détaillées.

Exemples d'appareils embarqués

Les appareils embarqués trouvent des applications dans de multiples secteurs, de l'aérospatiale à l'informatique, et des appareils électroménagers à la santé. Voici quelques exemples :

  • Un thermostat dans un climatiseur.
  • Un tracker d'activité, équipé de petits composants électriques faisant fonctionner un système d'exploitation minimaliste, capable uniquement d'enregistrer et de synchroniser vos données de santé.
  • Systèmes de climatisation numériques.
  • Systèmes de navigation dans un avion.
  • Montres numériques.
  • Appareils GPS.
  • Composants Wi-Fi dans les fours à micro-ondes et autres appareils électroniques grand public.
  • Tensiomètres et moniteurs de fréquence cardiaque.
  • Composant réseau dans une machine IRM qui envoie des données vers le cloud.

Un ordinateur portable est-il un appareil embarqué ?

Réponse courte : Non. Réponse longue :

Par définition, un appareil embarqué encapsule tout le logiciel et le matériel nécessaires à l'exécution de ses fonctions. Un ordinateur portable regroupe effectivement divers composants matériels dans un boîtier métallique et englobe tous les logiciels nécessaires pour offrir ses fonctionnalités.

Cependant, contrairement aux systèmes embarqués classiques qui possèdent un ensemble de fonctionnalités minimal et prédéfini, un ordinateur portable est plus polyvalent et peut être utilisé pour une vaste gamme d'activités.

Les appareils embarqués dans l'Internet des objets

Les systèmes embarqués sont au cœur de l'IoT. Votre réfrigérateur intelligent peut être contrôlé via votre appareil mobile grâce à un système embarqué. C'est un appareil embarqué dans votre système de sécurité qui vous permet de visualiser les images de vidéosurveillance à des milliers de kilomètres. Et lorsque vous appuyez sur un bouton pour activer le pilotage automatique de votre voiture, c'est, en coulisses, un appareil embarqué qui opère toute la magie.

Cycle de vie du développement logiciel embarqué

Voici les étapes typiques du cycle de vie du développement logiciel pour un appareil embarqué :

Étape 1 : Objectif et exigences

Un appareil embarqué possède un ensemble de fonctionnalités distinctes et précises. C'est pourquoi il est essentiel de définir explicitement son objectif et ses exigences avant de commencer le développement. Il est recommandé de créer un document de conception détaillé pour le système. Répondez à des questions telles que :

  • Quelles fonctions l'appareil devra-t-il remplir ?
  • Fera-t-il partie d'une autre machine ou fonctionnera-t-il de manière autonome ?
  • L'appareil doit-il disposer d'une interface utilisateur ? Si oui, une ligne de commande suffit-elle ou une interface graphique est-elle nécessaire ?
  • Quelles sont les contraintes de taille, de coût ou de consommation d'énergie à respecter ?
  • Existe-t-il des critères de performance ? Par exemple, l'appareil doit-il répondre en temps réel ou dans des délais précis ?

Étape 2 : Architecture système

Une fois les exigences système identifiées, nous sommes prêts à concevoir l'architecture. Répondez à des questions telles que :

  • Quels composants matériels seront nécessaires pour développer l'appareil ? Cela inclut l'identification des circuits, des puces de processeur et des microcontrôleurs, ainsi que de tous les périphériques internes et externes requis.
  • Quelle sera la consommation électrique des composants ?
  • L'appareil sera-t-il connecté à Internet ?
  • Quelles interfaces doivent être ajoutées ou développées pour permettre à l'appareil de se connecter à d'autres équipements ou à la machine principale ?
  • Comment mettrez-vous en œuvre le chiffrement ? (pensez aux algorithmes, au stockage des clés, etc.)
  • Comment identifierez-vous et éviterez-vous les vulnérabilités, exploits et logiciels malveillants potentiels ?

Étape 3 : Sélection du système d'exploitation

Le choix du système d'exploitation détermine souvent l'efficacité de vos applications embarquées, choisissez donc avec soin. Windows for IoT peut être performant en matière de graphismes, mais manque de support matériel. Embedded Linux et Android sont gratuits, tandis que VxWorks et Windows for IoT impliquent des coûts de licence.

Avec des systèmes open source comme Linux et Android, vos développeurs ont un meilleur contrôle sur le noyau ; en revanche, avec les systèmes propriétaires, vous êtes limité aux fonctionnalités par défaut du noyau.

Il est également important de prendre en compte les implications en matière de sécurité lors du choix d'un système d'exploitation. Les correctifs de sécurité sont-ils publiés rapidement en cas de découverte de vulnérabilités ? Existe-t-il une protection intégrée contre les cyberattaques les plus courantes ?

Étape 4 : Les outils de développement

Différents langages de programmation et frameworks présentent des avantages et des inconvénients variés. Selon vos besoins en termes de fonctionnalités, de vitesse et de fiabilité, vous pourriez privilégier un langage ou un framework plutôt qu'un autre.

Si votre application est basée sur le Web et que vous recherchez de hautes performances, optez pour Java.
Cependant, si vous visez le débit le plus rapide, choisissez le C/C++. Si vous souhaitez bénéficier du meilleur support de bibliothèques tierces, tournez-vous vers Python.

Étape 5 : Coder, refactoriser, tester, et recommencer

Une fois la plateforme de développement choisie, vous êtes prêt à coder. N'oubliez pas que les systèmes embarqués sont des appareils sensibles dotés de ressources matérielles et logicielles limitées. Il est donc crucial de garder à l'esprit les meilleures pratiques en matière de sécurité et de performance des applications.

Les revues de code aident à optimiser le développement et à identifier les bugs potentiels. Vous devez également tester de manière aussi rigoureuse que possible. Assurez-vous de compiler une liste exhaustive de tous les cas de test que l'appareil pourrait rencontrer en production.

Étape 6 : Maintenance et support

Comme pour toute autre application ou appareil, le cycle de vie ne s'arrête pas une fois l'appareil embarqué expédié et installé. À mesure que l'appareil est utilisé en production, de nouveaux cas d'usage sont identifiés, nécessitant l'ajout de nouvelles fonctionnalités. Les bugs signalés peuvent également nécessiter la publication de mises à jour du firmware.

Principaux langages de programmation embarquée

De nombreuses organisations réputées, comme l'IEEE et TIOBE, classent les langages de programmation selon leur popularité et leur utilisation. Cependant, que vous consultiez l'index TIOBE ou l'IEEE Spectrum, vous remarquerez une tendance commune.

Les trois langages les plus utilisés sont toujours le C, Python et Java. L'index TIOBE de juillet 2021 place le C en première position, Java en deuxième et Python en troisième. Selon le classement de l'IEEE Spectrum pour les langages de programmation embarquée, l'ordre est le suivant : Python, Java, puis C.

Quelles sont les différences entre un firmware écrit en Java, en C ou en Python ?

Chaque langage gère la mémoire, les interactions avec le système d'exploitation et l'exécution différemment. Par exemple, les applications Java s'exécutent dans un environnement spécialisé appelé machine virtuelle Java, ou JVM.

La gestion de la mémoire en C/C++ est manuelle, alors qu'en Java ou en Python, vous n'avez pas à vous en soucier ; le langage s'en charge pour vous. De plus, en C, vous devez gérer vous-même le ramasse-miettes (garbage collection) : si vous allouez dynamiquement un espace mémoire, vous devez explicitement le libérer. Si vous ne le faites pas, cela entraînera une fuite de mémoire. En Java ou en Python, cette opération est automatique. Cependant, le C est intrinsèquement beaucoup plus rapide que Java ou Python.

Un point sur lequel le C et Java (mais surtout le C) sont en retrait par rapport à Python est la disponibilité des bibliothèques tierces. Python dispose d'une base de données de bibliothèques plus riche, ce qui facilite grandement l'ajout de fonctionnalités pour les développeurs.

En résumé, choisissez le C si :

  • Vous souhaitez une interface de bas niveau avec le système d'exploitation et le matériel.
  • Vous recherchez les meilleures performances possibles.
  • Vos développeurs maîtrisent le C/C++.
  • Vous n'avez pas besoin d'un support externe ou tiers important.

Optez pour Python si :

  • Vous souhaitez implémenter des algorithmes de science des données ou d'apprentissage automatique.
  • Vous avez besoin d'un riche support de bibliothèques tierces.
  • Vous acceptez de sacrifier la vitesse au profit de la facilité d'utilisation.
  • Vous avez une expérience limitée en développement embarqué.
  • Vous n'avez pas besoin d'une interface de bas niveau avec le système d'exploitation ou le matériel.

Choisissez Java si :

  • Vous développez des applications web.
  • Vous recherchez une facilité de développement supérieure au C, tout en conservant de meilleures performances que Python.
  • Vous n'avez pas besoin d'un support externe ou tiers important.

Le C cessera-t-il progressivement d'être un choix de premier plan pour le développement embarqué ?

Les langages de haut niveau facilitent le codage en faisant abstraction des complexités inévitables en C. Cependant, depuis des décennies, malgré l'apparition de langages et de frameworks plus sophistiqués, le C reste un choix incontournable dans le développement embarqué.

Cela s'explique par la vitesse, les performances et la fiabilité inégalées qu'il offre. Le fait que Python et une grande partie de l'écosystème Java (y compris le runtime, le langage et le compilateur) soient écrits en C en dit long sur l'efficacité et la pérennité de ce langage.

Cela dit, le C est indéniablement plus difficile à apprendre pour les nouveaux développeurs, qui préfèrent la simplicité de langages comme Python. Cela entraîne un déclin notable de la communauté des développeurs C. L'essor du développement d'applications d'IA et de ML pousse également les utilisateurs à privilégier Python au détriment du C, simplement en raison de son meilleur support en bibliothèques.

Il est important de rappeler que Python n'est entré que récemment dans le débat sur les meilleurs langages de programmation embarquée. Certes, son adoption pourrait continuer à croître dans les années à venir, mais nous ne pensons pas que le C cessera un jour d'être un choix de premier plan pour le développement embarqué.

Pourquoi le codage sécurisé est crucial en C/C++

Beaucoup de choses peuvent mal tourner lors de l'écriture de code en C/C++. Accéder à une adresse mémoire qui ne pointe plus vers des données valides ou partager incorrectement des données entre des threads peut provoquer le plantage complet de votre application.

Pour les appareils embarqués, ces conséquences sont bien plus graves, car une défaillance peut entraîner l'arrêt d'une machine beaucoup plus grande. Par exemple, si le module de pilotage automatique d'une voiture s'arrête, le véhicule ne sera plus en mesure d'éviter les obstacles.

Voici d'autres raisons pour lesquelles le codage sécurisé des applications C/C++ est si important :

  • Une gestion non sécurisée de la mémoire (pointeurs nuls, corruption mémoire, dépassements de pile, dépassements de tampon et de tas) entraîne le plantage complet de l'application.
  • Les pointeurs font partie intégrante du C et du C++. Leur manipulation exige la plus grande prudence et une connaissance approfondie des concepts sous-jacents.
  • Le ramasse-miettes est manuel. Les programmeurs doivent donc explicitement libérer toute mémoire allouée dynamiquement. Une mémoire non libérée ou mal libérée peut provoquer des fuites ou une corruption.
  • L'absence d'API standardisées pour les structures de données avancées (ex. tables de hachage, ensembles, etc.) contraint les développeurs à réinventer la roue.

Il est absolument crucial que les développeurs soient formés au codage sécurisé pour les applications C/C++. Secure Code Warrior propose une plateforme d'apprentissage personnalisée avec des défis interactifs, des cours et des évaluations pour permettre aux développeurs d'écrire du code C/C++ sécurisé. Nous parlons ici de contenu spécifique au langage et au framework, et non d'une simple adaptation d'une formation conceptuelle générale.

Découvrez comment nous aidons les secteurs de l'automobile et du transport. Ou essayez un défi de codage axé sur l'embarqué dès aujourd'hui pour voir comment nous aidons les développeurs à écrire des applications embarquées sécurisées !‍

Slogan

Gouvernez le développement assisté par IA avant la mise en production

Évaluez les risques liés à l'IA, appliquez des politiques de codage sécurisé dès le commit et accélérez la livraison sécurisée tout au long de votre cycle de développement.

Réserver une démo
Bibliothèque de ressources

Explorer plus d'articles

Accédez à du contenu expert sur le codage sécurisé, la gouvernance de l'IA et la gestion des risques logiciels.

tout parcourir
Étude de cas
Libellé du filtre
Ceci est un texte à l'intérieur d'un bloc div.

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

En savoir plus
Étude de cas
Libellé du filtre
Ceci est un texte à l'intérieur d'un bloc div.

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

En savoir plus
Étude de cas
Libellé du filtre
Ceci est un texte à l'intérieur d'un bloc div.

Une culture de la sécurité : comment Sage a bâti son programme de champions

Découvrez comment Sage a renforcé sa sécurité grâce à une approche flexible axée sur les relations humaines, formant plus de 200 champions de la sécurité et obtenant une réduction mesurable des risques.

En savoir plus
Blog
Libellé du filtre
Ceci est un texte à l'intérieur d'un bloc div.

Mois de la sensibilisation à la cybersécurité 2026 : comprendre la sécurité de l'IA est essentiel à la défense de l'entreprise

Nous avons atteint un point où la plupart des grandes entreprises d'IA ont publiquement appelé à un ralentissement mondial du développement de l'IA afin de permettre aux garde-fous de sécurité de rattraper leur retard. Pourtant, la réalité est que de graves problèmes de sécurité se sont déjà concrétisés. Cela place d'innombrables responsables de la sécurité et équipes de direction dans une situation d'urgence, alors que les coûts financiers et les risques liés à la mise en œuvre de l'IA ne cessent de s'accumuler.

En savoir plus
Blog
Libellé du filtre
Ceci est un texte à l'intérieur d'un bloc div.

Levier 8 : Valoriser votre programme

Un programme de codage sécurisé a besoin de plus qu'un contenu de qualité pour réussir. Le levier 8 montre comment l'image de marque transforme la participation en une expérience convoitée, axée sur le statut.

En savoir plus
Blog
Libellé du filtre
Ceci est un texte à l'intérieur d'un bloc div.

Chaque employé est désormais en première ligne de la cybersécurité IA

Le paysage technologique des entreprises évolue à une vitesse que peu avaient anticipée avant qu'il ne soit trop tard. Nous avons officiellement franchi le cap du code écrit par l'humain et de l'assistance basique par copilote pour entrer dans l'ère du cycle de vie de développement agentique (ADLC). Si les agents IA autonomes promettent une efficacité sans précédent dans de multiples fonctions, ils apportent également une toute nouvelle catégorie de risques en matière de sécurité et de réglementation.

En savoir plus

Sécurisez le développement piloté par l'IA avant le déploiement

Identifiez les risques de développement, appliquez vos politiques et prévenez les vulnérabilités tout au long du cycle de vie de vos logiciels.

Réserver une démo
trust score
Aucun élément trouvé.