Luxembourg - Drapeau Luxembourg

Incoterms :DDP
Tous les prix incluent les taxes et les droits de douane pour les modes d'expédition sélectionnés.

Confirmez votre choix de devise:

Euros
Livraison gratuite pour la plupart des commandes supérieures à 50 € (EUR)

Dollars US
Livraison gratuite pour la plupart des commandes supérieures à $60 (USD)

Bench Talk pour les ingénieurs concepteurs

Mouser Blog | France

rss

Le blog officiel de Mouser Electronics


Langage de programmation Rust pour les microcontrôleurs Mike Parks

(Source : mirsad/stock.adobe.com)

 

Les nouveaux langages de programmation sont généralement créés en réponse aux lacunes des langages existants, souvent liées aux performances, à la facilité d'utilisation ou à l'incapacité de prendre en charge l'émergence de nouveaux concepts en informatique. Dans le domaine de l'électronique embarquée, en particulier celle construite autour d'un microcontrôleur, le langage de programmation Rust a émergé principalement pour répondre aux nombreuses lacunes du langage C, qui a dominé le développement des systèmes embarqués pendant des décennies.

Le langage C, créé au début des années 70, est dépourvu de nombreuses caractéristiques modernes indispensables aux développeurs de logiciels actuels. La liste suivante met en évidence certaines de ses principales lacunes dans le développement de systèmes embarqués :

  • Gestion des paquets: Rust propose Cargo, un système de construction et de gestion de paquets, alors que le langage C ne possède pas de solution officielle. Cette gestion facilite la réutilisation du code, car les bibliothèques (appelées « crates » dans Cargo) s'intègrent facilement dans de nouveaux projets. L'utilisation de bibliothèques de codes fiables permet de réduire les risques de développement associés à l'écriture d'un code entièrement nouveau.
  • Meilleure gestion de la mémoire : Le système de propriété et d'emprunt de la mémoire de Rust élimine le risque de fuites de mémoire et d'autres erreurs liées à la mémoire auxquelles les langages dérivés de C sont souvent confrontés en raison de leur dépendance à des techniques de collecte des déchets moins fiables.
  • Concurrence : Le système de propriété et les structures de données de Rust permettent une concurrence plus sûre et plus efficace, ce qui est essentiel dans les systèmes embarqués.
  • Pas de déréférencement null : Rust supprime le déréférencement de pointeurs null, une source fréquente de bogues en C, en utilisant le type Option pour les valeurs susceptibles d'être null.
  • Structures de données modernes : Rust prend en charge des concepts de structures de données tels que les génériques et les traits, ce qui améliore la maintenabilité du code source.

Bien que C présente de nombreuses lacunes, il reste le langage dominant à l'heure actuelle. Ainsi, les concepteurs de Rust ont veillé à ce que leur langage émergent soit compatible avec le code C, ce qui permet aux développeurs de systèmes embarqués d'exploiter les bibliothèques C existantes dans des applications Rust.

Rust : Du Web aux microcontrôleurs

Rust est une idée originale de Graydon Hoare, qui a commencé à développer ce langage de programmation en 2006 en tant que projet personnel alors qu'il travaillait chez Mozilla. À l'époque, son objectif était d'améliorer les performances et la fiabilité des tâches complexes de calcul parallèle, qui posaient un problème important pour les navigateurs Web de cette période. Avançons jusqu'en 2022, lorsque Rust est devenu le troisième langage de programmation autorisé pour le développement du noyau Linux, après l'assembleur et C.

En 2018, le groupe d'utilisateurs de Rust a créé l'Embedded Rust Working Group pour superviser le développement d'une version allégée de Rust spécialement conçue pour les plateformes embarquées telles que Arm®Cortex®-M, MSP430 et RISC-V. Les outils de développement pour Embedded Rust sont disponibles pour Windows, macOS et de nombreuses distributions Linux. Plusieurs éditeurs de code modernes, tels que Visual Studio Code, Sublime, Atom, RustOver et Eclipse, offrent un support pour Rust. Avant d'aborder les aspects pratiques d'Embedded Rust, examinons quelques concepts uniques qui pourraient faciliter la transition des développeurs de logiciels traditionnels vers le développement de systèmes embarqués :

  • Peripheral Access Crate (PAC) : La PAC offre une interface directe aux périphériques d'une micropuce. Les utilisateurs n'interagiront pas souvent avec la PAC, sauf s'ils développent une couche d'abstraction matérielle pour un nouveau microcontrôleur ou si les couches supérieures ne répondent pas aux exigences de l'application.
  • Hardware Abstraction Layer (HAL) : La HAL s'appuie sur la PAC de la puce et fournit une abstraction qui ne nécessite pas de connaissance approfondie des comportements spécifiques de la puce. En général, elle regroupe des périphériques entiers en structures uniques (également appelées structs), comme une structure unifiée qui peut être utilisée pour envoyer et recevoir des données vers et depuis les périphériques sur puce.
  • Board Support Crate (BSC) : Connue dans d'autres environnements de développement embarqués sous le nom de board support package, la BSC abstrait l'ensemble d'une carte. Elle doit donc créer des abstractions pour le microcontrôleur de la carte ainsi que pour ses périphériques, tels que des capteurs et des LED. Dans la plupart des cas, les ingénieurs travailleront uniquement avec la HAL de la puce, puis construiront des pilotes pour les périphériques ou les rechercheront sur des sites d'agrégation de crates.

Exemple pratique pour une carte STMicroelectronics

L'élément clé de l'écosystème embarqué Rust est la bibliothèqueembedded-hal, qui propose une interface commune pour travailler avec les périphériques matériels sur différentes plateformes de microcontrôleurs. Son objectif est de rendre le code portable et réutilisable lors du développement de logiciels pour systèmes embarqués. Embedded-hal définit des traits et des abstractions pour les périphériques courants tels que les broches GPIO, SPI, I²C, UART, les timers, et bien plus encore. Ces traits fournissent une API standardisée pour interagir avec ces périphériques, facilitant ainsi l'écriture de code embarqué portable.

L'un des principaux avantages d'embedded-hal est sa nature agnostique en matière de plateforme. Vous pouvez écrire du code avec embedded-hal qui fonctionne sur diverses architectures de microcontrôleurs et cartes de développement sans nécessiter de modifications, à condition que la plateforme cible implémente les traits requis.

Bien que embedded-hal propose des abstractions communes, il permet aussi une certaine personnalisation. Si un microcontrôleur ou une plateforme spécifique possède des caractéristiques ou des fonctionnalités uniques, vous pouvez implémenter les traits embedded-hal pour ces fonctionnalités afin de fournir une interface cohérente.

Voici un exemple d'utilisation d'embedded-hal dans un code Rust :

use embedded_hal::digital::v2::{OutputPin, InputPin};

use stm32f4xx_hal::{gpio::gpioa::PA5, stm32};

 

fn main() {

 

 

   // Initialiser le microcontrôleur

let dp = stm32::Peripherals::take().unwrap();

let cp = cortex_m::peripheral::Peripherals::take().unwrap():

   let mut rcc = dp.RCC.constrain();

   let _clocks = rcc.cfgr.freeze();

 

   // Configurer une broche GPIO en utilisant embedded-hal

   let gpioa = dp.GPIOA.split();

   let mut led = gpioa.pa5.into_push_pull_output();

 

   // Faire clignoter la LED

   loop {

led.set_high().unwrap();

      cortex_m::asm::delay(1_000_000);

led.set_low().unwrap();

      cortex_m::asm::delay(1_000_000);

   }

}

 

Dans cet exemple, nous utilisons des traits embedded-hal comme OutputPin pour contrôler une LED connectée à une broche GPIO. Le code est écrit de manière à pouvoir être réutilisé sur un autre microcontrôleur STM32 en modifiant seulement la deuxième ligne de code avec la carte de votre choix. À noter que cela est valable tant qu'ils prennent en charge les traits embedded-hal pour les broches GPIO et disposent des périphériques requis.

Conclusion

Rust a été créé pour remédier aux lacunes du langage de programmation C, en particulier dans les systèmes embarqués. Avec des caractéristiques telles que la gestion des paquets, une meilleure gestion de la mémoire, une concurrence sécurisée et des structures de données modernes, Rust offre des améliorations significatives par rapport à C. L'interopérabilité de Rust avec C permet également aux développeurs de tirer parti des bibliothèques C existantes. La création de l'Embedded Rust Working Group et des outils tels que la bibliothèque embedded-hal témoignent de l'engagement de Rust à améliorer le développement des systèmes embarqués. Cette approche agnostique et personnalisable favorise la portabilité et la réutilisation du code sur diverses plateformes de microcontrôleurs.



« Retour


Michael Parks, P.E. is the co-founder of Green Michael Parks, P.E. est propriétaire de Green Shoe Garage, un studio de conception de solutions électroniques personnalisés et agence de conseil en technologies, situé dans le Maryland méridional. Il réalise le podcast S.T.E.A.M. Power pour sensibiliser le grand public aux questions techniques et scientifiques. Titulaire d'une maîtrise d'ingénierie des systèmes de l'université Johns Hopkins, Michael est également ingénieur professionnel agréé de l'État du Maryland.


Tous les auteurs

Voir plus Voir plus
Afficher les articles par date