Pull to refresh

Comments 17

Хм, но ведь на Rust в embedded обычно не используют тот способ, которым пользовался автор. Это низкоуровневый вариант. Есть высокоуровневый (embedded-hal), он намного проще. Оверхед нулевой.

Багрепорт, о котором пишет автор, был открыт в середине 2019 года и до сих пор открыт.
В Issues у них 1600 открытых тикетов!
Попытался найти простой пример как запустить zig на stm32 и ничего толкового не нашел.
Это еще очень сырой язык.
Попытался найти простой пример как запустить zig на stm32 и ничего толкового не нашел.

Автор-то нашел. Можно у него спросить
описывается, по сути, всего одной страницей документации

Никто не мешает скомпилировать документацию к любому ЯП в одностраничный HTML, но это не делает такую документацию короткой.
Lua, к примеру, тоже вполне себе может позволить мануал на одну страницу, но это не на 10 минут чтиво.

Нужно еще строчки посчитать. И функционал сравнить.

Луа, впрочем тоже считается простым языком.
Спецификация си тоже весьма проста)
У языка банально не очень много конструкций и ключевых слов, можно выучить за день.
В Си принципиально меньше функционала. Возраст.
Автору статьи просто не нужно то, что ставили во главу угла разработчики Rust — безопасность. Ему простоту написания кода подавай. С такой точки зрения очень много языков лучше Rust. Только потом пусть не удивляется ошибкам в прошивках своих клавиатур.
Так-то во главе угла Zig тоже надежность. Тут фифти-фифти.

Хотя нет, ОБ конечно перевешивает, но цена…

Даже не безопасность сама по себе, а простота поддержки кода. Чтобы пришедший в проект новый человек (или ты сам после года на других задачах) мог поправить код без непредсказуемых последствий.

Он показал свой код. От какой именно ошибки его спасёт руст в однопоточном конечном автомате без выделения памяти?
теперь ждем статью почему я переписал свой проект бла-бла с zig на nim и какой он ачешуенный

Ну вот зачем так писать:


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 разместить специфические реализации в разных модулях?

Так и сделано — hw импортируется из разных крейтов
Это не взлетит, потому что теперь кортежи имеют разные типы — (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)]
Sign up to leave a comment.

Articles