Rust
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.
Örnek çözümü göster
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);
}
Kendini test et
-
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
- Daha hızlıdır
- Daha az bellek
- Yararı yok
Cevabı göster
Aynı sürücü her uyumlu donanımda ve masaüstü testlerinde çalışır — Generic olduğu için çalışma anı maliyeti yoktur; derleyici her çip için özel kod üretir.
-
Başarısız olmaz
impl OutputPin for SahtePin {
type Error = core::convert::____;
..
}
Cevabı göster
impl OutputPin for SahtePin {
type Error = core::convert::Infallible;
..
}
-
Katman ve görevi
- PAC
- Yazmaç tanımları
- HAL
- Çip soyutlaması
- embedded-hal
- Ortak trait'ler
- Sürücü
- Trait'e karşı yazılır
Sıradaki ders: WebAssembly