цифровая электроника
вычислительная техника
встраиваемые системы

 
» » Язык программирования Rust для микроконтроллеров



Язык программирования Rust для микроконтроллеров

Автор: Mike(admin) от 15-07-2024, 03:55

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


Язык программирования Rust для микроконтроллеров

В языке C, созданном в начале 1970-х годов, отсутствуют многие современные функции, на которые полагаются сегодняшние разработчики программного обеспечения. В следующем списке выделены некоторые ключевые недостатки C при разработке встроенных систем:


  • Управление пакетами: Rust предлагает систему сборки Cargo и менеджер пакетов, тогда как в C отсутствует официальное решение для управления пакетами. Управление пакетами поощряет повторное использование кода, поскольку библиотеки (называемые «ячейками» в Cargo) можно легко интегрировать в новый проект. Использование существующих, проверенных библиотек кода снижает риски разработки по сравнению с написанием кода с нуля
  • Лучшее управление памятью: система владения и заимствования памяти в Rust устраняет риск утечек памяти и других ошибок, связанных с памятью, которым подвержены языки на основе C из-за их использования менее надежных методов сборки мусора
  • Параллелизм: система владения и структуры данных Rust обеспечивают более безопасный и эффективный параллелизм, что имеет решающее значение для встроенных систем
  • Отсутствие нулевого разыменования: Rust устраняет разыменование нулевого указателя, распространенный источник ошибок в C, за счет использования типа Option для значений, которые могут быть нулевыми
  • Современные структуры данных: Rust поддерживает такие концепции структур данных, как дженерики и черты, улучшая удобство сопровождения исходного кода

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


Rust – детище Грейдона Хоара, который начал создавать язык программирования в 2006 году как личный проект, работая в Mozilla. В то время его заботой было повышение производительности и надежности сложных параллельных вычислительных задач, которые становились серьезной проблемой для веб-браузеров того времени. Перенесемся в 2022 год, когда Rust стал лишь третьим языком программирования, разрешенным для использования при разработке ядра Linux, после ассемблера и C.


В 2018 году группа пользователей Rust создала рабочую группу по внедрению Rust для наблюдения за разработкой облегченной версии Rust, созданной специально для встраиваемых платформ, таких как Arm® Cortex®-M, MSP430 и RISC-V. Встроенные инструменты разработки Rust доступны для Windows, macOS и многочисленных дистрибутивов Linux, а многие современные редакторы кода, такие как Visual Studio Code, Sublime, Atom, RustOver и Eclipse, предлагают поддержку Rust. Прежде чем рассматривать практические аспекты Embedded Rust, давайте рассмотрим некоторые уникальные концепции, которые могут помочь традиционным разработчикам программного обеспечения перейти к разработке встраиваемых систем.


  • Контейнер периферийного доступа (PAC): PAC обеспечивает прямой интерфейс с периферийными устройствами микрочипа. Пользователи не будут часто взаимодействовать с PAC, если только они не разрабатывают уровень аппаратной абстракции для нового микроконтроллера или если более высокие уровни не отвечают потребностям приложения
  • Уровень аппаратной абстракции (HAL): HAL основан на PAC чипа и обеспечивает абстракцию, не требующую глубоких знаний уникального поведения чипа. Обычно они абстрагируют все периферийные устройства в отдельные структуры, например, унифицированную структуру, которую можно использовать для отправки данных на встроенные периферийные устройства и обратно
  • Board Support Crate (BSC): известный в других средах разработки встроенных систем как пакет поддержки платы, BSC абстрагирует всю плату. В результате необходимо создать абстракции для микроконтроллера платы, а также любых периферийных устройств, таких как датчики и светодиоды. В большинстве случаев инженеры будут работать только с HAL чипа, а затем либо создавать драйверы для периферийных устройств, либо искать их на сайтах-агрегаторах

Наиболее важной частью экосистемы Rust является встроенная библиотека Rust, которая обеспечивает общий интерфейс для работы с аппаратными периферийными устройствами на различных платформах микроконтроллеров. Цель Embedded-Hal – обеспечить переносимость и возможность повторного использования кода при разработке программного обеспечения для встраиваемых систем. Embedded-hal определяет характеристики и абстракции для распространенных встроенных периферийных устройств, таких как контакты GPIO, SPI, I²C, UART, таймеры и многое другое. Эти особенности обеспечивают стандартизированный API для взаимодействия с этими периферийными устройствами, что упрощает написание переносимого встроенного кода.


Одним из основных преимуществ Embedded-hal является его независимость от платформы. Вы можете писать код с использованием Embedded-Hal, который работает на различных архитектурах микроконтроллеров и платах разработки без изменений, если целевая платформа реализует необходимые функции. Хотя Embedded-Hal предоставляет общие абстракции, он также допускает настройку. Если конкретный микроконтроллер или платформа обладает уникальными функциями или возможностями, вы можете реализовать свойства Embedded-Hal для этих функций, чтобы обеспечить согласованный интерфейс. Вот пример того, как вы можете использовать Embedded-Hal в коде Rust.



use embedded_hal::digital::v2::{OutputPin, InputPin};
use stm32f4xx_hal::{gpio::gpioa::PA5, stm32};

fn main() {
   // Инициализация микроконтроллераr
   let dp = stm32::Peripherals::take().unwrap();
   let cp = cortex_m::peripheral::Peripherals::take().unwrap():
   let mut rcc = dp.RCC.constrain();
   let _clocks = rcc.cfgr.freeze();

   // Конфигурация GPIO используя embedded_hal
   let gpioa = dp.GPIOA.split();
   let mut led = gpioa.pa5.into_push_pull_output();

   // Мигание светодиодом
   loop {
      led.set_high().unwrap();
      cortex_m::asm::delay(1_000_000);
      led.set_low().unwrap();
      cortex_m::asm::delay(1_000_000);
   }
}

В этом примере мы используем свойства Embedded-hal, такие как OutputPin, для управления светодиодом, подключенным к выводу GPIO. Код написан таким образом, чтобы его можно было повторно использовать на другом микроконтроллере STM32, изменив только вторую строку кода на любой желаемой плате. Обратите внимание, что это верно при условии, что они поддерживают функции встроенного hal для контактов GPIO и имеют необходимые периферийные устройства.


Rust был создан для устранения недостатков языка программирования C, особенно во встраиваемых системах. Благодаря таким функциям, как управление пакетами, лучшее управление памятью, безопасный параллелизм и современные структуры данных, Rust предлагает значительные улучшения по сравнению с C. Взаимодействие Rust с C также позволяет разработчикам использовать существующие библиотеки C. Создание рабочей группы Embedded Rust и таких инструментов, как библиотека Embedded-Hal, подчеркивает стремление Rust улучшить разработку встраиваемых систем, предлагая независимый от платформы и настраиваемый подход, который способствует переносимости и повторному использованию кода на различных платформах микроконтроллеров.




© digitrode.ru


Теги: Rust




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий