Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Что вам осталось исследовать

Мы едва затронули поверхность! Вам предстоит исследовать ещё многое.

ПРИМЕЧАНИЕ: Если вы читаете это и хотите помочь добавить в книгу Discovery примеры или упражнения по любой из тем ниже или по другим важным темам встраиваемых систем, мы будем рады вашей помощи!

Если хотите помочь, но нужна помощь или наставничество в том, как внести это в книгу, пожалуйста, откройте issue, либо откройте Pull Request с добавлением материала!

Ещё о MB2

В ходе этой книги мы затронули большую часть аппаратного обеспечения MB2. Тем не менее несколько тем, связанных с MB2, остаются неисследованными.

Прямой доступ к памяти (DMA)

У некоторых периферийных устройств есть DMA — что-то вроде асинхронного memcpy, которое позволяет периферии перемещать данные в память и из неё без участия процессора.

Если вы работаете с micro:bit v2, то DMA вы уже использовали: HAL делает это за вас для периферий UARTE и TWIM. Периферия DMA может выполнять массовые передачи данных: из RAM в RAM, из периферии вроде UARTE в RAM или из RAM в периферию. Можно запланировать передачу DMA — например, «прочитать 256 байт из UARTE в этот буфер» — и оставить её работать в фоне. Позже можно проверить некоторый регистр, чтобы узнать, завершилась ли передача, или запросить прерывание по её завершении. Так что вы можете запланировать передачу DMA и заниматься другой работой, пока она выполняется.

Детали низкоуровневого DMA могут быть немного хитрыми. Надеемся в ближайшее время добавить главу, посвящённую этой теме.

Для работы с ШИМ (PWM) есть некоторые абстракции в модуле pwm embedded-hal, а реализации этих трейтов вы найдёте в nrf52833-hal.

Цифровые входы и выходы

Мы использовали выводы микроконтроллера как цифровые выходы для управления светодиодами. При создании игры «Змейка» мы также увидели, как эти выводы можно настроить как цифровые входы. Как цифровые входы они могут считывать двоичное состояние переключателей (вкл/выкл) или кнопок (нажата/не нажата).

Цифровые входы и выходы абстрагированы в модуле digital embedded-hal, а у [nrf52833-hal] для них есть реализация.

(спойлер: считывание двоичного состояния переключателей и кнопок — не так просто, как кажется ;-) )

Аналого-цифровые преобразователи (АЦП, ADC)

Цифровых датчиков существует очень много. Их можно читать по протоколам вроде I2C и SPI. Но есть и аналоговые датчики! Такие датчики просто выдают значение напряжения, которое они измеряют, на вход АЦП процессора.

Периферия АЦП позволяет измерить «аналоговый» уровень напряжения — например, 1,25 В — и получить «цифровое» число — например, 24824 — которое процессор может использовать в вычислениях.

Раньше в embedded-hal были обобщённые трейты для АЦП, но для embedded-hal 1.0 их убрали: см. issue #377. Крейт nrf52833-hal предоставляет удобный интерфейс к АЦП, встроенному в nRF52833.

Цифро-аналоговые преобразователи (ЦАП, DAC)

Как и следовало ожидать, ЦАП — это ровно обратное АЦП. Можно записать цифровое число в регистр, чтобы получить определённое напряжение на каком-нибудь аналоговом выходе. Если этот аналоговый выход подключён к подходящей электронике, а регистр быстро записывается правильными значениями, можно, например, воспроизводить звуки или музыку.

Ни у nRF52833, ни у платы MB2 нет отдельного ЦАП. Обычно эффект ЦАП получают, выводя ШИМ и используя немного электроники на выходе (RC-фильтр), чтобы «сгладить» форму ШИМ-сигнала.

Часы реального времени (RTC)

Периферия часов реального времени (Real-Time Clock) ведёт отсчёт времени от собственного питания, обычно в «человеческом формате»: секунды, минуты, часы, дни, месяцы и годы. Некоторые часы реального времени даже автоматически учитывают високосные годы и переход на летнее время.

Ни nRF52833, ни плата MB2 не содержат часов реального времени. В nRF52833 есть «Real-Time Counter» (RTC) — низкочастотный тактовый счётчик, который поддерживается nrf52833-hal. Этот счётчик можно использовать как синтезированные часы реального времени. Ключевое требование — конечно, поддерживать питание периферии RTC даже тогда, когда MB2 не используется. Встроенной батареи у MB2 нет, но RTC может работать очень долго (возможно, годами), если подключить батарею к батарейному разъёму MB2 (например, к аккумуляторному блоку из набора micro:bit Go).

Другие протоколы связи

  • SPI: «Serial Peripheral Interface» — высокоскоростной интерфейс связи, в чём-то похожий на I2C. SPI абстрагирован в модуле spi крейта embedded-hal и реализован в [nrf52-hal].
  • I2S: протокол «Inter-IC Sound» — вариант I2C, адаптированный для передачи звука. Сейчас I2S не абстрагирован в embedded-hal, но реализован в [nrf52-hal].
  • Ethernet: существует небольшой стек TCP/IP под названием smoltcp, который реализован для некоторых чипов. У MB2 нет периферии Ethernet.
  • USB: есть некоторые экспериментальные наработки, например с крейтом usb-device. У MB2 USB-порт обслуживается интерфейсным MCU, а не основным, поэтому делать собственные USB-устройства трудно.
  • Bluetooth: обёртка nrf-softdevice, которую предоставляет рантайм Embassy для MB2, вероятно, самый простой способ начать работать с Bluetooth на MB2. У Embassy также есть нативный для Rust BLE-хост-крейт TrouBLE.
  • CAN, SMBUS, IrDA и т. д.: в мире существуют всевозможные специализированные интерфейсы, и поддержка некоторых из них в Rust есть. Поинтересуйтесь текущим состоянием дел для нужного вам интерфейса.

Разные приложения используют разные протоколы связи. Пользовательские устройства обычно имеют USB-разъём, потому что USB повсеместен в ПК и смартфонах. А внутри автомобилей полно шин CAN. Некоторые цифровые датчики используют SPI, I2C или SMBUS.

Если вам интересно разрабатывать абстракции в embedded-hal или реализации периферии вообще, не стесняйтесь открывать issue в репозиториях HAL. Кроме того, можно присоединиться к чату Rust Embedded в Matrix и связаться с большинством людей, которые создали всё перечисленное выше.

Общие темы, важные для встраиваемых систем

Эти темы касаются не конкретно нашего устройства и не его аппаратуры, а полезных приёмов, которые можно применять во встраиваемых системах.

Большая часть оборудования, которое мы здесь обсудим, недоступна на MB2, но многое можно легко добавить, подключив недорогое устройство к краевому разъёму MB2 — либо управляя им напрямую, либо используя SPI или I2C.

Многозадачность

Большинство наших программ выполняли одну задачу. Как добиться многозадачности в системе без ОС, а значит, без потоков? Существует два основных подхода к многозадачности: вытесняющая многозадачность (preemptive) и кооперативная (cooperative).

При вытесняющей многозадачности выполняемая задача может в любой момент быть вытеснена (прервана) другой задачей. При вытеснении первая задача приостанавливается, а процессор выполняет вторую. Через некоторое время первая задача возобновляется. Микроконтроллеры поддерживают вытеснение на уровне железа в виде прерываний. С прерываниями мы познакомились, когда создавали игру «Змейка» в главе 16.

При кооперативной многозадачности выполняемая задача работает до тех пор, пока не дойдёт до точки приостановки. Достигнув такой точки, процессор прекращает текущую задачу и выполняет другую. Через некоторое время первая задача возобновляется. Главное отличие этих подходов в том, что при кооперативной многозадачности задача отдаёт управление в известных точках приостановки, а не принудительно вытесняется в произвольный момент своего выполнения.

Гироскопы

В задаче «Измеритель удара» мы использовали акселерометр, чтобы измерять изменения ускорения в трёх измерениях. Но есть и другие датчики движения, например гироскопы, которые позволяют измерять изменения «вращения» в трёх измерениях.

Это очень полезно при создании некоторых систем, например робота, который не должен опрокидываться. Кроме того, данные такого датчика, как гироскоп, можно объединять с данными акселерометра с помощью метода, который называется сенсорным слиянием (sensor fusion; подробнее см. ниже).

Сервоприводы и шаговые двигатели

Некоторые моторы используются в основном просто для вращения в ту или иную сторону, например чтобы ехать на радиоуправляемой машинке вперёд или назад. Но иногда полезно точнее измерять, как вращается мотор.

Микроконтроллер может управлять сервоприводами или шаговыми двигателями, которые позволяют точнее контролировать количество оборотов мотора или даже установить его в определённое положение — например, если нужно повернуть стрелки часов в нужное направление.

Сенсорное слияние (sensor fusion)

В micro:bit есть два датчика движения: акселерометр и магнитометр. По отдельности они измеряют (собственное) ускорение и (земное) магнитное поле. Но эти величины можно «слить» в нечто более полезное: «устойчивое» измерение ориентации платы с меньшей погрешностью, чем у любого отдельного датчика.

Идея получения более надёжных данных из разных источников известна как сенсорное слияние (sensor fusion).


Куда дальше?

Прежде всего присоединяйтесь к чату Rust Embedded в Matrix. Там собирается много людей, которые участвуют в разработке встраиваемого ПО, в том числе те, кто написал BSP microbit, крейт nrf52-hal, крейты embedded-hal и т. д. Мы будем рады помочь вам начать или продолжить программировать встраиваемые системы на Rust!

Есть и много других вариантов:

  • Можно посмотреть примеры в крейте поддержки платы microbit-v2. Все эти примеры работают на вашей плате micro:bit.
  • Если хотите общий обзор того, что сейчас есть в Rust Embedded, посмотрите список Awesome Rust Embedded.
  • Можно познакомиться с Embassy. Это современный эффективный фреймворк кооперативной многозадачности, который поддерживает конкурентное выполнение с помощью async/await в Rust.
  • Можно познакомиться с Real-Time Interrupt-driven Concurrency RTIC. RTIC — очень эффективный фреймворк вытесняющей многозадачности, который поддерживает приоритизацию задач и выполнение без взаимных блокировок (deadlock-free).
  • Можно изучить другие абстракции проекта embedded-hal и даже попробовать написать на его основе собственный драйвер, не зависящий от платформы.
  • Можно попробовать запустить Rust на другой отладочной плате. У популярных плат, таких как ESP-32, Raspberry Pi или Arduino, есть свои активные сообщества Rust-разработчиков.