Изучение на примерах очень важно для разработчика, с помощью примеров разработчик может прицениться к новому инструменту и понять, зачем ему этот инструмент. Какие преимущества даёт этот инструмент, почему нужно его использовать и т.д. Сегодня в статье у нас будет два примера для двух отладочных плат, один пример полностью на Rust, второй пример это композиция C и Rust.

Rust — это системный язык программирования, внимание которого сосредоточено на трёх задачах: безопасность, скорость и параллелизм. Он решает эти задачи без сборщика мусора, что делает его полезным в ряде случаев, когда использование других языков было бы нецелесообразно: при встраивании в другие языки, при написании программ с особыми пространственными и временными требованиями, при написании низкоуровневого кода, такого как драйверы устройств и операционные системы. Во время компиляции Rust делает ряд проверок безопасности. За счёт этого не возникает накладных расходов во время выполнения приложения и устраняются все гонки данных. Это даёт Rust преимущество над другими языками программирования, имеющими аналогичную направленность. Rust также направлен на достижение «абстракции с нулевой стоимостью». Хотя некоторые из этих абстракций и ведут себя как в языках высокого уровня, но даже тогда Rust по-прежнему обеспечивает точный контроль, как делал бы язык низкого уровня.

У Rust много плюсов:

  • Отличная статическая типизация;
  • Отсутствие сборщика мусора и возможность контролировать место размещения данных в памяти;
  • Отличный встроенный статический анализатор кода, который позволяет избегать ошибок, связанных с управлением памятью и многопоточностью;
  • Понятный синтаксис;
  • Компилятор от разработчиков Rust со встроенным менеджером и сборщиком пакетов, системой тестов и генератором документации;
  • Безопасная работа с памятью;
  • Возможность применять абстракции;
  • Для многих ошибок во время компиляции приводятся варианты исправления;
  • Указатели можно использовать только в небезопасном коде, в безопасном коде применяются исключительно ссылки на гарантированно существующие объекты.
  • Очень строгий компилятор кода;
  • Предсказуемое выделение и освобождение памяти;
  • Замыкания;
  • Сопоставление с образцом;
  • Алгебраические типы данных  и т.п.

Первый пример полностью на Rust (сетевая часть тоже на Rust, можно использовать вместо LwIP) для отладочной платы stm32f746g-disco.

git clone https://github.com/mcuby/stm32f7-discovery.git

Я не разработчик этого проекта, только форкнул его и адаптировал его для запуска в VS code, оригинальные исходники здесь.

Давайте посмотрим какие пакеты включены в этот проект:

Хочу отметить тут smoltcp — это автономный стек TCP/IP, управляемый событиями, который предназначен для систем реального времени с минимальным набором ресурсов. Цели его дизайна — простота и надежность. Его проектные антицелевые задачи включают сложные вычисления во время компиляции, такие как макросы или трюки типов, даже за счет снижения производительности. (Как раз его можно взять на замену дырявому LwIP, кто работает с LwIP, поймет меня, что проблем у LwIP много).

Кроме всего прочего проект для stm32f7-discovery содержит множество примеров для работы с периферией отладочной платы.

По умолчанию работает проект polling.rs, как раз это пример на картинке ниже.

Существует несколько областей, где многие языки программирования слабы в плане производительности выполнения программ. Часто компромисс заключается в том, чтобы использовать более медленный язык, который взамен способствует повышению производительности программиста. Чтобы решить эту проблему, часть кода системы можно написать на C, а затем вызвать этот код, написанный на C, как если бы он был написан на языке высокого уровня. Это называется «интерфейс внешних функций» (foreign function interface), часто сокращается до FFI.

Rust включает поддержку FFI в обоих направлениях: он легко может вызвать C код, и он так же легко, как и C код, может быть вызван извне. Rust сочетает в себе отсутствие сборщика мусора и низкие требования к среде исполнения, что делает Rust отличным кандидатом на роль вызываемого из других языков, когда нужны некоторые дополнительные возможности.

Узнать больше про FFI можно здесь.

Конечно Rust прекрасен, но еще не все есть у Rust чтобы полностью отказаться в embedded от С/С++ (FatFS, EmWin, иные микроконтроллеры не stm32 и другие вещи), но написание асинхронных приложений (многопоточность) можно делать на Rust, писать бизнес логику тоже можно Rust. Мой совет, начинайте применять Rust сегодня, за ним будущее в embedded и во всем системном программировании.

Хочу отметить проект rust-anywhere для отладочной платы stm32f429i-disco. К сожалению данный проект у меня не запустился с коробки, я его немного изменил.

git clone https://github.com/mcuby/rust-anywhere.git

Убрал в lv_misc/lv_area.h включение файла string.h (нету этого изменения в моем коммите, поправьте руками данный файл).
Перешел на nightly-2019-04-26 в rust-toolchain
Изменил файлы buld.rs для своего gcc, выглядит это так:

Всё, что нужно сделать, это запустить make из каталога rust-anywhere/device. В каталоге rust-anywhere/device/build/bin будет находиться необходимый нам elf файл rust-anywhere.elf, его можно преобразовать в bin файл с помощью команды arm-none-eabi-objcopy -O binary rust-anywhere.elf rust-anywhere.bin и после прошить с помощью команды openocd -f interface/stlink.cfg -f target/stm32f4x.cfg -c «init» -c «reset init» -c «program rust-anywhere.bin exit 0x08000000». Итог нашей работы будет, как на фото ниже.

В этом проекте композиция Rust и С, в проекте используется FFI. Сборочная система make. Процесс получения исполняемого файла выглядит следующим образом.

Rust составляющая проекта расположена в rust-anywhere/crates/ имеем следующую структуру файлов:

 

Отправить ответ

avatar

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

  Subscribe  
Уведомлять о