CodeBlanks Logo Icon CodeBlanks

Embedded

embedded-hal ile mikrodenetleyici programlamayı öğrenirsin.

Embedded

Gömülü Rust'ta donanım erişimi katmanlıdır: üretici yazmaç tanımları (PAC), çip HAL'i ve bunların üstünde embedded-hal trait'leri. Sürücüler (sensör, ekran) bu trait'lere karşı yazılır; böylece aynı sürücü farklı mikrodenetleyicilerde çalışır:

// embedded-hal
pub trait OutputPin {
    type Error;
    fn set_high(&mut self) -> Result<(), Self::Error>;
    fn set_low(&mut self) -> Result<(), Self::Error>;
}

fn yak_sondur<P: OutputPin>(led: &mut P) -> Result<(), P::Error> {
    led.set_high()?;
    led.set_low()
}

Masaüstünde test için aynı trait'i uygulayan sahte (mock) bir pin yazılır.

Sahte pin

Durum değişikliklerini kaydeden bir sahte pin, gerçek donanım olmadan sürücü mantığını doğrular:

struct SahtePin {
    kayit: String,
}

impl OutputPin for SahtePin {
    type Error = core::convert::Infallible;
    fn set_high(&mut self) -> Result<(), Self::Error> {
        self.kayit.push('H');
        Ok(())
    }
    fn set_low(&mut self) -> Result<(), Self::Error> {
        self.kayit.push('L');
        Ok(())
    }
}

Infallible, "bu işlem hiç başarısız olmaz" diyen boş bir hata türüdür.

Uygulama LED yak söndür

Yukarıdaki OutputPin trait'ini ve SahtePin türünü yaz. fn yak_sondur<P: OutputPin>(led: &mut P) ile sahte pini üç kez yakıp söndür ve kaydı yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
pub trait OutputPin {
    type Error;
    fn set_high(&mut self) -> Result<(), Self::Error>;
    fn set_low(&mut self) -> Result<(), Self::Error>;
}

struct SahtePin {
    kayit: String,
}

impl OutputPin for SahtePin {
    type Error = core::convert::Infallible;
    fn set_high(&mut self) -> Result<(), Self::Error> {
        self.kayit.push('H');
        Ok(())
    }
    fn set_low(&mut self) -> Result<(), Self::Error> {
        self.kayit.push('L');
        Ok(())
    }
}

fn yak_sondur<P: OutputPin>(led: &mut P) -> Result<(), P::Error> {
    led.set_high()?;
    led.set_low()
}

fn main() {
    let mut pin = SahtePin { kayit: String::new() };
    for _ in 0..3 {
        yak_sondur(&mut pin).unwrap();
    }
    println!("{}", pin.kayit);
}

Beklenen çıktı

HLHLHL

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir sürücüyü somut çip türü yerine trait'e karşı yazmanın yararı nedir?

  • Aynı sürücü her uyumlu donanımda ve masaüstü testlerinde çalışır Doğru cevap
  • Daha hızlıdır
  • Daha az bellek
  • Yararı yok

Açıklama: Generic olduğu için çalışma anı maliyeti yoktur; derleyici her çip için özel kod üretir.

2 Başarısız olmaz

Soru
impl OutputPin for SahtePin {
    type Error = core::convert::____;
    ..
}
Cevap
impl OutputPin for SahtePin {
    type Error = core::convert::Infallible;
    ..
}

Açıklama: Infallible hiçbir değeri olmayan, başarısızlığın imkânsız olduğunu söyleyen türdür.

3 Katman ve görevi

Kavram Anlamı
PAC Yazmaç tanımları
HAL Çip soyutlaması
embedded-hal Ortak trait'ler
Sürücü Trait'e karşı yazılır

Uzman bölümündeki tüm dersler