Embedded
- Rust kursu
- Uzman
- Ders 33/46
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
impl OutputPin for SahtePin {
type Error = core::convert::____;
..
}
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 |