Comments 17
Хм, но ведь на Rust в embedded обычно не используют тот способ, которым пользовался автор. Это низкоуровневый вариант. Есть высокоуровневый (embedded-hal), он намного проще. Оверхед нулевой.
В Issues у них 1600 открытых тикетов!
Попытался найти простой пример как запустить zig на stm32 и ничего толкового не нашел.
Это еще очень сырой язык.
описывается, по сути, всего одной страницей документации
Никто не мешает скомпилировать документацию к любому ЯП в одностраничный HTML, но это не делает такую документацию короткой.
Lua, к примеру, тоже вполне себе может позволить мануал на одну страницу, но это не на 10 минут чтиво.
Хотя нет, ОБ конечно перевешивает, но цена…
Даже не безопасность сама по себе, а простота поддержки кода. Чтобы пришедший в проект новый человек (или ты сам после года на других задачах) мог поправить код без непредсказуемых последствий.
Ну вот зачем так писать:
fn read_keys() -> Packet {
let device = unsafe { hw::Peripherals::steal() };
#[cfg(any(feature = "keytron", feature = "keytron-dk"))]
let u = {
let p0 = device.P0.in_.read().bits();
let p1 = device.P1.in_.read().bits();
//invert because keys are active low
gpio::P0::pack(!p0) | gpio::P1::pack(!p1)
};
#[cfg(feature = "splitapple")]
let u = gpio::splitapple::read_keys();
Packet(u)
}
И как автор решил эту проблему в Zig:
Для условной компиляции я переместил специфические для аппаратного обеспечения детали в отдельные файлы.
Что помешало и в Rust разместить специфические реализации в разных модулях?
Это не взлетит, потому что теперь кортежи имеют разные типы — (P0, usize) и (P1, usize) — и поэтому они не могут висеть вместе в одной коллекции.
Вот решение, которое я придумал:
[...]
А ведь всего-то нужно было использовать не типы из pac, а более удобные типы из gpio. Там у каждого пина есть метод degrade, который превратит какой-нибудь P0_10 в простой Pin, и позволит положить этот пин в массив.
Существует изящный встроенный фреймворк, RTIC, основной точкой входа которого является аннотация app, которая принимает крейт устройства в качестве, хм, аргумента:
[...]
Как условно менять этот аргумент во время компиляции? Понятия не имею.
А очень просто, как оказалось. Но в документации да, написать забыли.
mod my_device {
#[cfg(feature = "nrf52833")]
pub use nrf52833::*;
}
#[app(device = crate::my_device)]
Почему я переписал прошивку для клавиатуры с Rust на Zig: слаженность, мастерство и развлечение