Arduino: более быстрые альтернативы digitalread () и digitalwrite ()?


13

Какие самые быстрые альтернативы для вызова функций Arduino digitalread()и digitalwrite()? AVR-специфичные или чип-специфичные решения являются приемлемыми.


3
Читая этот и ваш последний вопрос, кажется, что вы хотите сделать что-то довольно быстро. Я думаю, что подробности о том, что это и как быстро может быть полезным.
Оли Глейзер

@ Оли, хорошая идея, спасибо. Текущий проект - система настройки для передатчиков RC. Это работает хорошо, но я хотел бы сделать декодирование сигнала RC PWM эффективным, чтобы я мог использовать ту же платформу для других проектов. Вот рецензия на то, что я имею до сих пор: eastbay-rc.blogspot.com/2011/11/…
Марк Харрисон

Ответы:


18

Доступ к цифровым портам напрямую!

3 метода, которые я тестировал, были

  • digitalWrite (pin, LOW); digitalWrite (pin, HIGH);
  • CLR (PORTB, 0); SET (PORTB, 0);
  • PORTB | = _BV (0); PORTB & = ~ (_BV (0));

[...]

введите описание изображения здесь

Как видите, для выполнения digitalWrite требуется около 56 циклов, а для прямой адресации портов - 2 цикла. Это большая разница во времени для программ, которые имеют много операций ввода-вывода!



2

Как указано выше, доступ к цифровым портам напрямую. Но со стилем!

Записывая жестко запрограммированные значения непосредственно в аппаратные регистры, вы теряете удобочитаемость и переносимость.

Я опубликовал на Github инструмент под названием HWA, который позволяет вам использовать объектно-ориентированный интерфейс с аппаратным обеспечением, для которого не требуется компилятор C ++ и который создает высокоэффективный двоичный код.

HWA там: https://github.com/duparq/hwa


1
«Высокоэффективный двоичный код» будет звучать гораздо более авторитетно, чем реальные измерения.
Дмитрий Григорьев

2

Люди в Arduino.SE уже обсуждали и проверяли это. Как оказалось, digitalWriteFast()не так много улучшений по сравнению с обычным digitalWrite(). Прямой доступ к порту, однако, примерно в 35-40 раз быстрее, чем digitalWrite().


0

Используйте ChipKit Uno32. Это намного быстрее чем Arduinos на базе AVR. Это также поможет решить ваши проблемы со временем.


1
Я не думаю, что покупка более быстрого оборудования - лучший ответ здесь, по крайней мере, пока вы не достигли пределов своего текущего оборудования и решили, что вам нужно что-то быстрее.
Джон Л

1
Почему отрицательные? Он хотел самое быстрое решение, а не просто более быстрое, которое я предоставил. Кто-нибудь может предложить более быстрое решение на базе Arduino?
Леон Хеллер

12
Потому что ChipKit - это не Arduino, а платформа, совместимая с Arduino. Это означает, что хотя переключение портов происходит быстрее, существует большая вероятность переписывания некоторых библиотек. Библиотеки карт Ethernet, XBee, SD могут вообще не работать из коробки. Кроме того, Марк специально запрашивает альтернативные вызовы функций digitalRead / Write, а не новой платформы (doh).
Ганс

2
Замена оборудования никогда не является хорошим решением. По крайней мере, вы упускаете какое-то хорошее обучение и никогда не узнаете, как эффективно использовать оборудование.
Rick_2047

1
@ Rick_2047 Я бы не сказал «никогда» - если требование новое или расширенное, или количество увеличивается, может иметь смысл рассмотреть альтернативы. Но я согласен с тем, что вслепую бросать аппаратные средства из-за большой неэффективности программного обеспечения несложно - иногда это даже не работает, поскольку системы с более высокой производительностью могут добавлять собственные издержки, а иногда оказываются медленнее, чем простые, для некоторых задач. На самом деле ничто не заменит изучение платформы, которую вы используете или планируете использовать.
Крис Страттон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.