Retour aux articles
Embedded8 min de lecture

Rust pour l'embarqué : retour d'expérience

Migration d'un firmware C vers Rust sur STM32. Performance, sécurité mémoire et écosystème.

Forge Labs

15 avril 2026

Contexte

Après plusieurs années de développement firmware en C sur microcontrôleurs STM32, j'ai décidé de migrer progressivement vers Rust. Cette décision n'a pas été prise à la légère — le C reste le standard de facto dans l'embarqué, avec un écosystème mature et une documentation exhaustive.

Mais les problèmes récurrents liés à la gestion mémoire, les undefined behaviors subtils, et la difficulté à maintenir une base de code C propre sur le long terme m'ont poussé à explorer des alternatives.

Pourquoi Rust ?

Rust apporte plusieurs avantages fondamentaux pour les systèmes embarqués :

Sécurité mémoire à la compilation. Le borrow checker élimine une classe entière de bugs — use-after-free, double free, data races — qui sont particulièrement difficiles à débugger sur du hardware sans OS. Zero-cost abstractions. Les abstractions de haut niveau (iterators, pattern matching, traits) compilent vers du code aussi efficace que du C équivalent écrit à la main. Écosystème moderne. Cargo, le gestionnaire de paquets, simplifie considérablement la gestion des dépendances et la configuration des builds — un point faible historique du développement embarqué.

Migration progressive

La stratégie adoptée : migrer module par module, en commençant par les composants les plus critiques. Le driver SPI, responsable de la communication avec les périphériques externes, était un candidat idéal.

#[embassy_executor::task]

async fn spi_task(mut spi: Spi<'static, SPI1, DMA1_CH3, DMA1_CH2>) {

let mut buf = [0u8; 256];

loop {

spi.transfer(&mut buf).await.unwrap();

// Process data...

}

}

L'utilisation d'Embassy, un framework async pour l'embarqué, permet d'écrire du code concurrent sans les complexités d'un RTOS traditionnel.

Résultats

Après six mois de migration :

  • -40% de bugs liés à la mémoire en production
  • Temps de compilation acceptable (~30s pour un build complet)
  • Taille du binaire comparable au C (-5% en moyenne)
  • Productivité en hausse une fois la courbe d'apprentissage passée

Conclusion

Rust n'est pas encore prêt à remplacer le C partout dans l'embarqué. Le support HAL varie selon les familles de microcontrôleurs, et certains périphériques exotiques nécessitent encore des bindings C.

Mais pour les nouveaux projets sur des plateformes bien supportées (STM32, nRF, RP2040), Rust devient une option sérieuse — voire préférable — pour qui valorise la fiabilité et la maintenabilité à long terme.