Сегодня речь про gpio и rust. Gpio основной интерфейс для старта.  Сегодня мы поморгаем светодиодами на отладочной плате stm32f429i-disco и сделаем это двумя способами.

Интерфейс ввода/вывода общего назначения (англ. general-purpose input/output, GPIO) — интерфейс для связи между компонентами компьютерной системы, к примеру микропроцессором и различными периферийными устройствами. Контакты GPIO могут выступать как в роли входа, так и в роли выхода — это, как правило, конфигурируется. GPIO контакты часто группируются в порты.

На микроконтроллерах серии STM32 порты общего назначения обозначаются как: GPIOA, GPIOB и т.д. На схеме микроконтроллера соответствующие портам выводы обозначаются PA0-PA15, PB0-PB15 и т.д. Порты 16- разрядные, у каждого порта 16 выводов. Режим и состояние каждого вывода могут быть установлены отдельно, независимо от других выводов. Каждый вывод может использоваться в режиме:

    • Input floating – вход без подтягивающего резистора, порт никуда не подключен;
    • Input pull-up – вход с подтягивающим резистором, порт подключен к питанию микроконтроллера;
    • Input pull-down — вход с подтягивающим резистором, подключенным к общему сигналу (GND);
    • Analog – аналоговый вход;
    • Output open-drain – выход с открытым стоком. Выход или подключен к «0» или в воздухе болтается (например, для внешней подтяжки вверх);
    • Output push-pull – обычный активный выход. При низком логическом уровне напряжение на выводе равно 0, при высоком – напряжение близко к напряжению питания микроконтроллера, обычно + 3 В;
    • Alternate function push-pull – альтернативная функция вывода в обычном (активном) режиме;
    • Alternate function open-drain – альтернативная функция вывода в режиме открытый сток;

Первый пример. Простое baremetal firmware. Baremetal — это небольшой код, инициализирующий ядро/ядра, и передающий управление пользовательской программе, которую по какой-то причине требуется запустить без нормальной ОС и без ОСРВ. На отладочной плате у нас присутствуют два пользовательских светодиода LD3 и LD2, и им соответствующие пины микроконтроллера PG13 и PG14.

Второй пример по функционалу полностью как первый пример, только мы воспользуемся фреймворком RTMF. RTMF — это среда параллелизма для построения систем реального времени.

Возможности RTFM:

  • Задачи — единица конкуренции. Задачи могут запускаться по событию (в ответ на асинхронный стимул) или вызываться программно по желанию.
  • Передача сообщений между задачами. А именно, сообщения можно передавать программным задачам в момент вызова.
  • Очередь таймера. Программные задачи можно планировать на запуск в определенный момент в будущем. Это свойство можно использовать, чтобы реализовывать периодические задачи.
  • Поддержка приоритетов задач, и таким образом, вытесняющей многозадачности.
  • Эффективное, свободное от гонок данных разделение памяти через хорошо разграниченные критические секции на основе приоритетов.
  • Выполнение без взаимной блокировки задач, гарантированное на этапе компиляции. Это более сильная гарантия, чем предоставляемая стандартной абстракцией Mutex.
  • Минимальные затраты на диспетчеризацию. Диспетчер задач имеет минимальный след; основная часть работы по диспетчеризации делается аппаратно.
  • Высокоэффективное использование памяти: Все задачи используют общий стек вызовов и нет сильной зависимости от динамического распределителя памяти.
  • Все устройства Cortex-M полностью поддерживаются.
  • Эта модель задач поддается известному анализу методом WCET (наихудшего времени исполнения) и техникам анализа диспетчеризации (хотя разработчики еще не разработали дружественных инструментов для этого).

Все программы на RTFM используют атрибут app (#[app(..)]). Этот атрибут нужно применять к const-элементам, содержащим элементы. Атрибут app имеет обязательный аргумент device, в качестве значения которому передается путь. Этот путь должен указывать на библиотеку устройства, сгенерированную с помощью svd2rust v0.14.x. Атрибут app развернется в удобную точку входа, поэтому нет необходимости использовать атрибут cortex_m_rt::entry.

init
Внутри псевдо-модуля атрибут app ожидает запуска функции инициализации, обозначенную атрибутом init. Эта функция должна иметь сигнатуру [unsafe] fn().

Эта функция инициализации будет первой частью запускаемого приложения. Функция init запустится с отключенными прерываниями и будет иметь эксклюзивный доступ к периферии Cortex-M и специфичной для устройства периферии через переменные core и device, которые внедряются в область видимости init атрибутом app. Не вся периферия Cortex-M доступна в core, потому что рантайм RTFM принимает владение частью из неё.

idle
Функция, помеченная атрибутом idle может присутствовать в псевдо-модуле опционально. Эта функция используется как специальная задача ожидания и должна иметь сигнатуру [unsafe] fn() — > !.

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

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

avatar

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

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