📚

Moderni Vodič za Embedded Rust

Ovaj interaktivni tutorijal je dizajniran kao moderna zamjena za PDF dokument. Naučite kako da koristite Rust programski jezik na Raspberry Pi Pico (RP2040) mikrokontroleru koristeći Embassy framework, fokusirajući se na asinhrono izvršavanje, nultu alokaciju i maksimalnu efikasnost.

1. Upoznavanje sa Hardverom (RP2040)

Prije pisanja koda, moramo razumjeti okruženje u kojem se izvršava (eng. bare-metal). RP2040 je dizajniran od strane Raspberry Pi fondacije. Karakteriše ga nedostatak operativnog sistema (no_std okruženje) i specifična memorijska arhitektura (XIP - eXecute In Place).

Ključne Specifikacije (Iz Datasheet-a)

  • ⚙️
    Procesor (CPU) Dual-core ARM Cortex-M0+ na 133 MHz. Nema keš memorije za podatke, što vrijeme izvršavanja čini predvidljivim.
  • 💾
    Memorija 264KB on-chip SRAM-a podijeljenog u 6 banaka. Podržava do 16MB eksterne QSPI Flash memorije preko XIP interfejsa.
  • 🔌
    I/O i Periferije 30 GPIO pinova. Podržava UART, SPI, I2C, PWM i USB 1.1 Host/Device.
  • 🧩
    PIO (Programmable I/O) 8 posebnih state mašina koje mogu hardverski simulirati bilo koji protokol bez opterećenja glavnog CPU-a.

Memorijska Arhitektura Pico Ploče

Pico ne posjeduje interni flash za kod. Kod se izvršava direktno sa eksternog flash-a (XIP) brzinom RAM-a zahvaljujući 16KB XIP kešu.

2. Arhitektura Embedded Rust-a

Rust koristi slojevitu arhitekturu bez kompromisa u performansama ("zero-cost abstractions"). Kliknite na slojeve ispod da biste razumjeli kako se vaš kod prevodi do hardvera, bez potrebe za C/C++ pokazivačima.

⬇️
⬇️
⬇️
⬇️
👆

Odaberite sloj sa lijeve strane za detaljno objašnjenje.

3. Zašto Embassy? (Async u Embedded)

Tradicionalno, višetaskovne aplikacije na mikrokontrolerima zahtijevaju RTOS (Real-Time Operating System). Međutim, Rust nudi async/await koncepte koji se u Embassy framework-u transformišu u statičke "state mašine" za vrijeme kompajliranja.

Ključne prednosti Embassy-ja:

  • Nema RTOS kernela: Kod je brži i lakši. Nema skupih prebacivanja konteksta (context switching).
  • Nulta alokacija: Memorija za taskove se alocira statički. Ne koristi se heap (dinamička memorija), što sprečava fragmentaciju.
  • Ušteda energije: Kada ni jedan task nema posla, Embassy automatski šalje CPU u "sleep" mod dok ga ne probudi hardverski interapt.
  • Sigurnost mjerenja vremena (Timers): Ugrađen globalni tajmer koji nikada ne preliva (never overflows).

Sinhrono (Blocking) vs Asinhrono

U klasičnom Arduino stilu (C++), `delay(1000)` blokira cijeli procesor. U Embassy Rust-u, `Timer::after(Duration::from_millis(1000)).await` samo pauzira trenutni task, dozvoljavajući drugim zadacima (npr. obradi senzora) da se izvršavaju.

Potrošnja RAM-a po Tasku (Procjena)

Kod klasičnog RTOS-a morate ručno podesiti veličinu stack-a za svaki thread. Embassy kompajler automatski izračunava tačnu minimalnu veličinu potrebnu za stanje (state machine).

4. Postavka Okruženja i Prvi Kod

Slijedite ove korake kako biste postavili svoj računar za razvoj. Provjerite kvadratiće dok napredujete.

Alati (Toolchain)

Progres postavljanja 0%
src/main.rs (Blinky Primjer)
// Okruženje bez standardne biblioteke (no_std)
#![no_std]
#![no_main]

use defmt_rtt as _; // Logovanje preko proba
use panic_probe as _; // Hvatanje grešaka (panic)

use embassy_executor::Spawner;
use embassy_rp::gpio::{Level, Output};
use embassy_time::Timer;

// Definišemo glavni asinhroni ulaz (main)
#[embassy_executor::main]
async fn main(_spawner: Spawner) {
    // 1. Inicijalizacija hardvera (PAC/HAL)
    let p = embassy_rp::init(Default::default());
    
    // 2. Konfiguracija PIN-a 25 (LED na Pico)
    let mut led = Output::new(p.PIN_25, Level::Low);

    // 3. Beskonačna asinhrona petlja
    loop {
        defmt::info!("LED ON");
        led.set_high();
        // Asinhrono čekanje (ne blokira CPU!)
        Timer::after_millis(500).await; 

        defmt::info!("LED OFF");
        led.set_low();
        Timer::after_millis(500).await;
    }
}