Рассказывайте трогательные истории и пишите код, который понимает людей.
Когда «Интегральная» разрабатывает «Сяобай» (оба случая, когда «Интегрированная» разрабатывает «Сяобай»,Еще один новичок в программировании)читайте нижеизОсновные концепции встроенной разработки BSP, HAL и PACиз При описании,Я часто чувствую растерянность.
Пакет поддержки Совета директоров (Board Support Crate, BSP, в Африке Rust Часто в среде называется Board Support Пакет поддержки плат, отсюда и аббревиатура) BSP Ответственность лежит на всем совете разработчиков (например, micro:bit) для унифицированной абстракции. Он должен обеспечить доступ к микроконтроллеру, а также к датчикам и светодиодам на плате. Абстрактный интерфейс для других устройств. Для заказных плат разработки обычно не существует готовых решений. BSP Доступный. В этом случае вам нужно использовать чип HAL и разрабатывайте драйверы датчиков самостоятельно или в crates.io Найдите дальше. Но удача,micro:bit Уже есть готовый microbit-v2. BSP,Итак, мы можем перейти непосредственно к HAL.
Уровень абстракции оборудования (Аппаратное обеспечение Abstraction Layer, HAL)HAL построенный на чипе PAC Кроме того, он предоставляет простые в использовании абстрактные интерфейсы для разработчиков, не знакомых с функциями чипов. ХАЛ Каждое периферийное устройство обычно выделяется в независимую структуру, что позволяет разработчикам легко выполнять такие операции, как передача данных. Если вы разрабатываете micro:bit v2 встроенная программа для разработки платы, мы будем использовать nRF52-hal。
Далее мы обсудим Rust Встроенныйв миреизосновной программный компонент:
embedded-hal
。как следует из названия,оно учится у насиз Второй уровень абстракции HAL слои тесно связаны。embedded-hal
предоставляет набор функций(traits),используется для описания всех HAL Общее поведение конкретных периферийных устройств в реализации. Например, он определяет базовую функцию управления выключателем питания, что позволяет нам управлять LED лампа или другое устройство。embedded-hal
что позволяет нам разрабатывать универсальныеиздрайвер оборудования(Например, драйвер датчика температуры),Эти драйверы могут быть реализованы в любомembedded-hal
особенностьизработать на чипе。Этот вид общенияиспользоватьсексдапроходитьзависит только отembedded-hal
особенность Приходитьвыполнитьиз。Напишите вот такиз Водитель называетсяНезависимый от платформы。Достойно благодарностиизда,crates.io
начальствоиз Большинство водителей используют это Независимый от платформыдизайн。Пакет периферийного доступа (Периферийное Access Crate, PAC)PAC Обеспечивает относительно безопасный интерфейс прямого доступа к периферийным устройствам чипа, позволяя разработчикам точно контролировать каждый бит регистра (хотя, конечно, возможна неправильная конфигурация). Обычно только тогда, когда абстракции более высокого уровня не могут удовлетворить потребности или при разработке кода более высокого уровня вам необходимо использовать его напрямую. ПАК. Если вы разрабатываете micro:bit Встроенная программа платы разработки v2, в основном мы будем использовать ее неявно. nRF52 из PAC。
Сейчас,Сяову предложит вам проанализировать простойизпример:использоватьКод ржавчинызажечьсяmicro:bit макетная плата v2 со светодиодной подсветкой (например, Рисунок 1). В этом примере мы получим более глубокое понимание того, что означают понятия BSP, HAL и Embedded-halиPAC.
Рисунок 1 Оживите micro:bit с помощью кода Плата разработки Rust v2 со светодиодной подсветкой
Прежде чем мы углубимся в это, давайте взглянем на код.
Эта статьяиз Полный код доступен по адресуgithubизwubin28 accountizlearn-rust-by-games кодовая базаизch01/lu1lНашел в каталоге。Если вы хотите запустить этот код,Вам нужно всего лишь купить плату разработки micro:bit v2 по цене двух-трех чашек кофе.,тогда следуйГлава 1 книги «Сяобай изучает Rust: от подсветки светодиодов до удовольствия от программирования» (минималистская версия)из Просто следуйте инструкциям。Ниже перечислены Эта статья Связанныйиз Два файла исходного кода。
Файл исходного кода Rust src/main.rs показан в листинге 1:
Листинг кода 1: ch01/lu1l/src/main.rs
// Отключить небезопасный код
#![deny(unsafe_code)]
// Заявить, что это автономная программа и не использует стандартные точки входа.
#![no_main]
// Не использовать стандартную библиотеку, которая встроена система Общие практики
#![no_std]
// Импортируйте необходимую из Встроенную библиотеку разработки.
// Укажите начальную точку программы
use cortex_m_rt::entry;
// Рабочий аппаратный интерфейс
use embedded_hal::digital::OutputPin;
// Совет по развитию управления
use microbit::board::Board;
// импортировать panic Обработчик ошибок во время выполнения
use panic_halt as _;
// точка входа в программу
#[entry]
fn main() -> ! { // возвращаться ! означает этода Никто не делаетвозвращатьсяизфункция
// получать microbit Совет управления
let mut board = Board::take().unwrap();
// Зажгите 4-ю строку и 4-й столбец светодиодной матрицы изLED,
// То есть, установив для 4-го столбца низкий уровень, установите для 4-й строки высокий уровень.
board.display_pins.col4.set_low().unwrap();
board.display_pins.row4.set_high().unwrap();
// Бесконечный цикл поддерживает работу программы
loop {}
}
Общий файл управления пакетами проекта Rust Cargo.toml показан в листинге 2:
Листинг кода 2 ch01/lu1l/Cargo.toml
[package]
# Название проекта
name = "lu1l"
# Номер версии проекта
version = "0.1.0"
# Требования к версии Rust (версия 2021 г.)
edition = "2021"
# Зависимые пакеты и их номера версий
[dependencies]
# Поддержка среды запуска Cortex-M
cortex-m-rt = "0.7.3"
# Обеспечивает механизм обработки паники, позволяющий остановить запуск программы в случае ее сбоя.
panic-halt = "0.2.0"
# BBC micro:bit пакет поддержки платы разработки v2
microbit-v2 = "0.15.0"
# Встроенный интерфейс уровня абстракции оборудования
embedded-hal = "1.0.0"
Cargo.toml — это основной файл конфигурации проекта Rust.,В нем фиксируется основная информация о проекте.,нравиться Название проекта、Номер версии и необходимые пакеты зависимостей.
🧠зачем нам это нужноCargo.tomlиз[dependencies]
Эти пакеты зависимостей перечислены ниже.?нравиться Удалитьэточто с нами будет?Вы можете узнать, чему соответствуют эти пакеты зависимостейmain.rsсерединаиз Какие коды??
💡Давайте поговорим о том, почему нам нужно перечислить эти пакеты зависимостей в Cargo.toml.,а такжеэтоихнравиться Хэ Юmain.rsсерединаиз Коды работают вместе。первыйдаcortex-m-rt
Сумка,это как лаунчер,Отвечает за инициализацию процессора Cortex-M и обработку процесса запуска программы. в коде,наспроходитьuse cortex_m_rt::entry
и#[entry]
标注Приходитьделатьиспользоватьэто。нравиться Если бы не это Сумка,Программа не может быть запущена,Потому что точку входа невозможно найти.
затемдаpanic-halt
Сумка。этоизделатьиспользоватьдасуществовать Произошла серьезная программная ошибкачас,Поместите систему в сейфиз Остановленное состояние。кодсерединаизuse panic_halt as _
Сразудасуществоватьделатьиспользоватьэто。существовать Встроенныйсредасередина,У нас должен быть такой механизм обработки ошибок,В противном случае компилятор напомнит нам об отсутствии необходимых гарантий безопасности.
microbit-v2
Сумканоданасизглавный герой,этопоставлятьс советом по развитиювзаимодействиеиз Все функции。когданассуществоватькодсередина Писатьuse microbit::board::Board
час,Он вызывает этот пакет, чтобы предоставить функцию из. без этого,нас Сразу无法Совет по развитию управленияначальствоизлюбой компонент。
наконецдаembedded-hal
Сумка,Это как универсальный переводчик,Определяет стандартный интерфейс аппаратного обеспечения управления. в коде,насиспользоватьuse embedded_hal::digital::OutputPin
управлять штифтами。этот Сумкапозволятьнас Можетиспользоватьединыйизразные способы контроляиз Аппаратное оборудование。
Если какой-либо из этих пакетов зависимостей будет удален, наш код не будет работать как машина без частей. Это потому, что:
🧠для什么仅делатьиспользоватьCargo.tomlсерединаизmicrobit-v2
полагаться Сумканедостаточно,Все еще нужноembedded-hal
полагаться Сумка ПриходитьзажечьсяLEDлампа?этот两个полагаться Сумкаданравиться何Сотрудничать工делатьиз?
💡нас聊一下для什么仅делатьиспользоватьmicrobit-v2
полагаться Сумканедостаточно,Все еще нужноembedded-hal
полагаться Сумка ПриходитьзажечьсяLEDлампа。этот问题涉及приезжатьполагаться Сумкамеждуиз Механизм сотрудничества。
первый,microbit-v2
делатьдляодин Поддержка на уровне совета директоров Сумка,как домработница,Отвечает за управление всей командой разработчиков. Но экономке нужен набор стандартных и платформонезависимых правил для работы с различными устройствами.,Включает светодиодные фонари. Таким образом, стандартные правила могут сделать один и тот же метод работы применимым к различным аппаратным платформам (таким как платформа micro:bit v2, Arduino, STM32, платформа ESP32, обсуждаемая в этой статье).
В это время,embedded-hal
Сразу像一本Проходитьиспользоватьиз Руководство по эксплуатации,этоопределениестандартный интерфейс(нравитьсяOutputPin
черты). Он сообщает менеджеру: «Чтобы включить или выключить устройство, необходимо следовать этим правилам». Это позволяет различным менеджерам оборудования работать единообразно.
этоихиз Сотрудничатьдатакиз:microbit-v2
Этот профессионализэкономка,проходитьembedded-hal
поставлятьиз Стандартные методы управления оборудованием。когданасдумать Чтобы зажечь светодиодчас,экономка Сразу会делатьиспользоватьembedded-hal
определениеизOutputPin
черты характера, необходимые для выполнения работы.
Чтобы зажечь светодиод,В дополнение к экономке и стандартному руководству по эксплуатации.,Все еще нужно具体执行工делатьизкоманда:выполнитьembedded-hal
изпротивnRF52833платформаиз"руководитель проекта"nrf52833-hal
,а такжеруководитель проекта所полагатьсяиз"Профессиональные механики"nrf52833-pac
。
Давайте сначала посмотрим на обязанности каждого члена этой команды:
main()
функцияmicrobit-v2
взаимодействиеmicrobit-v2
(Board Support Ящик, также известный как Доска Support Package,BSP)Поддержка на уровне совета директоров Сумкаembedded-hal
иnrf52833-hal
выполнять определенные действияembedded-hal
(Hardware Abstraction Layer,HAL)Независимый от платформыуровень аппаратной абстракцииOutputPin
дождаться сообщенияиспользоватьинтерфейсnrf52833-hal
(Hardware Abstraction Layer,HAL)противnRF52833платформаизуровень аппаратной абстракцииembedded-hal
из Стандартные характеристикиnrf52833-pac
(Peripheral Access Crate,PAC)противnRF52833платформаиз Периферийный доступ СумкаОтношения между этими компонентами,Это может быть представлено следующей диаграммой классов UML.,нравиться Рисунок 2:
Рисунок 2 Связь между BSP, Embedded-Hal и HALиPAC
Давайте посмотрим на это подробно UML Диаграмма классов проектирования архитектуры. Это типичная извстроенная многоуровневая архитектура, переходящая от уровня приложений к уровню доступа к оборудованию.
Начиная сверху:
microbit-v2
,Как домработница) как адаптационный слой,Будет ли совет по развитиюизконкретное оборудование(нравиться LED Матрица (выводы строк и столбцов) упакованы в простой в использовании интерфейс. это зависит от embedded-hal
интерфейс для работы GPIO, эта конструкция позволяет пакету поддержки платы адаптироваться к любой реализации. embedded-hal
Интерфейс аппаратной платформы.embedded-hal
,нравитьсяплатформане имеющий отношения Руководство по эксплуатации)определениестандартыиз Интерфейс работы оборудования(нравиться OutputPin
)。этотдавыполнитьчерезплатформасовместимыйизключ,этозаявил set_high()
и set_low()
Подождите базового GPIO действовать.nrf52833-hal
,нравитьсяnRF52833 Фишка из менеджера проекта) для nRF52833 Чип реализован. embedded-hal
интерфейс. Он отвечает за преобразование абстрактного GPIO Операция преобразуется в соответствующую операцию регистрации, и обеспечивается механизм безопасного доступа.nrf52833-pac
,Например, чип nRF52833 (профессиональный техник) обеспечивает функцию доступа к регистру самого низкого уровня.,Взаимодействуйте напрямую с оборудованием. Он инкапсулирует операции чтения и записи аппаратных регистров.,Но обычно не рекомендуется использовать непосредственно верхний слой.Преимущества многоуровневой конструкции:
embedded-hal
Интерфейсы реализуют аппаратную абстракцию, поэтому код приложения можно легко переносить на другие платформы.Отношения зависимости на рисунке ясно показывают взаимодействие между каждым уровнем: сплошная стрелка представляет отношение «использования».,Полая пунктирная стрелка представляет отношения «реализации». Эта конструкция обеспечивает хорошую развязку,И может в полной мере использовать возможности оборудования.
🧠Что такое GPIO?
💡этотдавстроенная системасерединаиз базового аппаратного интерфейса, полное имя — General. Purpose Ввод/вывод (универсальный интерфейс ввода/вывода) в основном используется для реализации ввода и вывода цифрового сигнала.
Его основные особенности и функции заключаются в следующем:
В нашей диаграмме изUML,Вы можете увидеть, как плата разработки micro:bit v2 умело использует GPIO. Каждый светодиод похож на маленькую лампочку.,Совместно используйте контакты строк и столбцов для управления. необходимо соответствующим образом отрегулировать уровни этих контактов GPIO.,можно добиться точного управления конкретными светодиодами,Пусть он загорится или погаснет по нашей команде.
🧠Как быстро проверить связь зависимости между BSP, Embedded-Hal и HALиPAC?
💡Зависимости на этой UML-диаграмме,Можетпроходитьбегатьcargo tree
(Показать текущий проектиздерево зависимостей)команда для проверки:
% cargo tree
lu1l v0.1.0 (/Users/<your-username>/learn-rust-by-games/ch01/lu1l)
# основное использование cortex-m-rt
├── cortex-m-rt v0.7.5
(Другие стратегии)
# основное использование встроенного-hal
├── embedded-hal v1.0.0
# основной использует microbit-v2
├── microbit-v2 v0.15.1
│ └── microbit-common v0.15.1
# microbit-v2 использует интерфейс Embedded-Hal
│ ├── embedded-hal v1.0.0
# Интерфейс microbit-v2проходитьembedded-hal использует инъекцию изnrf52833-hal
│ ├── nrf52833-hal v0.18.0
│ │ ├── nrf-hal-common v0.18.0
(Другие стратегии)
# nrf52833-hal реализует встроенный интерфейс-hal
│ │ │ ├── embedded-hal v1.0.0
(Другие стратегии)
# nrf52833-hal использует nrf52833-pac
│ │ └── nrf52833-pac v0.12.2 (*)
│ └── tiny-led-matrix v1.0.2
# основное использование паники-остановки
└── panic-halt v0.2.0
Поймите приведенные выше концепции,Сейчас Можетчат Код ржавчины — это чудесное путешествие о том, как материал работает слой за слоем, чтобы зажечь светодиодные фонари. Это путешествие открытий сверху вниз.
Все начинается с основной функции верхнего уровня. здесь,нассталкиватьсяприезжатьпервая важная роль:Board
объект。проходить Одна строка краткоизкод:
let mut board = Board::take().unwrap();
Мы создали этот базовый интерфейс для взаимодействия с оборудованием, который является дверью в мир оборудования.
затем,нас Приходитьприезжатьmicrobit-v2
Этот слой。этот里дадляmicro:bit v2Тщательно созданныйизконтрольсередина Сердце,Сумка СодержитсяBoard
Основная консоль、DisplayPins
Показать панель управления,и аккуратно оформленоизrow0
приезжатьrow4
иcol0
приезжатьcol4
контактный переключатель。существоватьэтот里,Мы можем сделать следующее:
board.display_pins.col4.set_low().unwrap();
board.display_pins.row4.set_high().unwrap();
дальше вниз,нас Приходитьприезжатьembedded-hal
интерфейсный уровень。этотдаодинключизслой абстракции,этоопределениестандартыиз Интерфейс работы оборудования。проходитьопределениеOutputPin
trait,этопредусматривает, что все выходные контакты должнывыполнитьset_high()
иset_low()
Подождите базовый метод. Этот унифицированный дизайн интерфейса обеспечивает переносимость кода.
nrf52833-hal
层но负责выполнитьэтот些интерфейс。этопроходитьgpio(Проходитьиспользовать输入输出контроль)、Pin(булавочная абстракция)иLevel(Контроль уровня)и другие компоненты,Воляembedded-hal
определениеиз Преобразование абстрактного интерфейса в конкретныйизаппаратное обеспечениедействовать.когданаснастраиватьиспользоватьset_high()
илиset_low()
час,Именно этот уровень обрабатывает конкретные детали реализации.
наконец Приходитьприезжатьсамый низкий уровеньизnrf52833-pac
。этот里непосредственно саппаратное обеспечениедиалог,Оснащен оператором регистра GPIO, физическим контроллером контактов и инструментами доступа к регистрам низкого уровня.
Весь процесс включения светодиода похож на точную эстафету: начиная с создания экземпляра Board,пройтиdisplay_pins
точное позиционирование,проходитьOutputPin
Интерфейс выдает команды,Преобразовано из hal-слоя в конкретные операции.,Наконец, он записывается в аппаратный регистр через уровень pac. вот и все,Загорается небольшой индикатор в месте расположения светодиодной матрицы (4,4). Эта послойная конструкция похожа на прецизионную машину.,Каждая часть играет уникальную и важную роль.,Давайте вместе выполним эту, казалось бы, простую задачу по зажиганию лампочек.
Если вам понравилась эта статья,Не забудьте оценить статьюНажмите «Нравится»,Это действительно воодушевляет меня продолжать писать~😃