Чем программные интерфейсы отличаются от аппаратных по скорости и надежности?

Ядро Arduino включает в себя многочисленные программные интерфейсы, имитирующие аппаратные интерфейсы, предоставляемые чипом, и даже выходящие за его пределы. Мой вопрос: если в проекте я могу использовать либо программный, либо аппаратный протокол, какая будет разница в стабильности, скорости и универсальности? Есть ли причина, по которой предпочтение отдается аппаратным интерфейсам? Потому что в любом случае протокол обрабатывается процессором, или я что-то ошибаюсь?

, 👍0

Обсуждение

периферийные устройства могут работать автономно, задействуя ЦП по прерыванию только в случае необходимости. например, если вы запускаете PWM, процессор не участвует в генерации импульсов. если вы используете внешнее прерывание на контакте, ЦП не участвует в мониторинге контакта., @Juraj


2 ответа


Лучший ответ:

1

В своем вопросе вы спрашиваете обо всех коммуникационных интерфейсах в целом, поэтому ответ будет таким же общим, как и ваш вопрос.

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

Потому что протокол в любом случае обрабатывается процессором

В основном это неправильно. Протокол связи в большинстве случаев выполняется аппаратно, если вы используете аппаратные интерфейсы. Последовательный (UART), например, автоматически отправляет байт, помещенный в аппаратный буфер, с заданной конфигурацией. Для этого не требуется никакого программного обеспечения. То же самое касается SPI или I2C. Протокол интерфейса обрабатывается аппаратно.

Хотя, по крайней мере, для пользователей Arduino Core/библиотеки есть еще кое-что, что обрабатывается автоматически. Поскольку аппаратное обеспечение интерфейса ограничено, программное обеспечение должно заботиться о результирующих или необходимых данных. Например: Все упомянутые выше интерфейсы используют 1-байтовый буфер для данных. Программное обеспечение должно читать или записывать эти данные, чтобы аппаратное обеспечение могло работать. Если вы не прочитаете байт данных, полученный последовательным интерфейсом, он может быть перезаписан следующим байтом. Аппаратно не может обеспечить буфер, который, как правило, достаточно большой, так как производитель не может знать, как долго будут передаваться передачи. Таким образом, интерфейсы получают 1-байтовый буфер, а программное обеспечение должно делать все остальное. По этой причине все библиотеки используют в своем программном обеспечении буфер большего размера, который заполняется, когда оборудование отправляет соответствующее прерывание.

Итак: аппаратные интерфейсы реализуют базовый протокол интерфейса (то, как передаются биты) в аппаратном обеспечении, поэтому программное обеспечение должно только предоставлять и считывать байтовые данные. Стабильность, скорость и универсальность определяются только тем, как производитель строит аппаратное обеспечение этого интерфейса. Это ограничение четко указано в техническом описании и не меняется вместе с кодом.

Для программных интерфейсов все делается программно. Это также включает в себя мониторинг и настройку соответствующих выводов с правильной синхронизацией. В лучшем случае программное обеспечение может использовать общие аппаратные функции, такие как прерывание контакта, но если оно не может этого сделать, оно должно постоянно контролировать (опрашивать) контакты, чтобы что-то получить. Программные интерфейсы часто называют «битовыми», потому что программное обеспечение вручную выталкивает каждый отдельный бит с точным требуемым временем. Это утомительная задача, которая часто блокирует выполнение другого кода, поскольку время часто имеет решающее значение. В частности, временные ограничения вводят ограничения, поскольку выполнение действий в программном обеспечении часто требует на много тактов больше, чем это может быть выполнено с помощью специального оборудования (рассмотрите весь код для опроса вывода и несколько операторов if для реагирования на определенные ситуации). Например: когда вы записываете данные с помощью SoftwareSerial, вызов функции записи блокируется, потому что вручную выталкивает бит за битом. Или с SPI: с аппаратным SPI вы можете достичь невероятных тактовых частот в диапазоне МГц. С программным обеспечением вы не сможете приблизиться к этому, потому что программное обеспечение просто не может работать так быстро.

Обратите внимание, что в зависимости от фактического аппаратного обеспечения используемого чипа библиотеке может потребоваться реализовать части протокола в программном обеспечении. Например, это случай использования I2C на ATtiny85, который не имеет полной аппаратной поддержки I2C. Вместо этого можно использовать USI (универсальный последовательный интерфейс) для реализации некоторых функций протокола аппаратно, а остальных программно.

TL;DR

  • Аппаратные интерфейсы снимают с программного обеспечения тяжелую работу по обработке низкоуровневого протокола (передача битов в соответствии с необходимым стандартом) (что может быть довольно сложным).
  • Тогда программное обеспечение обрабатывает только байтовые данные, а не их передачу.
  • Преобразование сложных протоколов с выделенного оборудования в программное обеспечение (передача данных через простые контакты) накладывает большие ограничения на скорость и надежность.
,

1

Использование аппаратного интерфейса сильно нагружает ЦП. Возьмем, к примеру, асинхронный последовательный интерфейс.

Благодаря встроенному аппаратному средству UART вы получите аппаратное преобразование параллельного последовательного и обратного сигналов. ЦП «просто» нужно хранить данные для отправки в регистре. Принимающая часть полностью обрабатывается аппаратным обеспечением, и ЦП «просто» нужно посмотреть на флаг «получено» перед чтением данных. Или он устанавливает прерывание как обратный вызов.

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

Теперь вы можете подумать о проблемах, которые вы упомянули:

Стабильность: если все сделано правильно, оба подхода одинаково стабильны, что означает надежную функцию. Если у вас есть еще задачи, которые нужно выполнить, вы, возможно, не сможете выполнить требования. Это происходит «раньше» с программными интерфейсами, чем с аппаратными, из-за более высокой нагрузки.

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

Универсальность. Программные интерфейсы более универсальны, поскольку возможности аппаратных интерфейсов ограничены. Если аппаратный интерфейс не может делать то, что вам нужно, нет способа заставить его это делать. Программное обеспечение может делать «все», если у процессора есть для этого достаточно времени и ресурсов.

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

,

Относительно «_Стабильности_»: обратите внимание, что программные интерфейсы иногда срезают углы, чтобы упростить реализацию. Программный UART обычно принимает одну выборку RX на бит, тогда как аппаратный UART принимает не менее трех выборок и выполняет большинство голосов. Также нередко программный UART не проверяет стоповый бит, а программный I2C не поддерживает растяжение тактовой частоты. Аппаратный порт также имеет тенденцию обеспечивать более стабильную синхронизацию, чем программный., @Edgar Bonet

@EdgarBonet Вот что я имел в виду под «Если все сделано правильно ...» ;-) Аппаратный UART может начать прием по переднему фронту стартового бита или использовать часы в примере 16x. Это может быть реализовано в программном обеспечении с помощью прерываний по фронту и прерывания таймера с высокой тактовой частотой, которые, если честно, не являются чисто программными., @the busybee