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)
// 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; } }