Torna al blog

Introduzione a Rust per embedded

Perché Rust per embedded?

Rust sta guadagnando terreno nello sviluppo embedded grazie alla sua sicurezza e performance. In questo articolo vedremo come configurare l'ambiente di sviluppo e scrivere il primo programma per Arduino.

Il sistema di ownership di Rust previene errori di memoria a compile-time, rendendo il codice più robusto fin dall'inizio. Niente più buffer overflow o use-after-free!

Setup dell'ambiente

Per iniziare avremo bisogno di:

  • Rust installato (via rustup)
  • Toolchain nightly per embedded
  • cargo-generate per usare template
  • Una scheda Arduino, STM32 o ESP32

Installiamo i componenti necessari:

rustup target add thumbv7em-none-eabihf
cargo install cargo-generate

Il primo progetto

Usiamo un template già pronto per STM32:

cargo generate --git https://github.com/rust-embedded/cortex-m-quickstart
cd my-project
cargo build --target thumbv7em-none-eabihf

Ecco un esempio di blink classico:

#![no_std]
#![no_main]

use cortex_m_rt::entry;
use stm32f1xx_hal::{pac, prelude::*};

#[entry]
fn main() -> ! {
    let dp = pac::Peripherals::take().unwrap();
    let mut rcc = dp.RCC.constrain();
    let mut gpioc = dp.GPIOC.split(&mut rcc.apb2);
    
    let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh);
    
    loop {
        led.set_high();
        cortex_m::asm::delay(8_000_000);
        led.set_low();
        cortex_m::asm::delay(8_000_000);
    }
}

Come vedi, il codice è pulito e leggibile, con zero overhead rispetto al C.

Vantaggi concreti

Usando Rust per embedded ottieni:

  • ✅ Gestione della memoria sicura senza garbage collector
  • ✅ Zero-cost abstractions
  • ✅ Pattern matching potente
  • ✅ Ecosistema in crescita (crates come embedded-hal)

Nel prossimo articolo vedremo come gestire interrupt e DMA. Resta sintonizzato! 🦀