Какие самые быстрые альтернативы для вызова функций Arduino digitalread()
и digitalwrite()
? AVR-специфичные или чип-специфичные решения являются приемлемыми.
Какие самые быстрые альтернативы для вызова функций Arduino digitalread()
и digitalwrite()
? AVR-специфичные или чип-специфичные решения являются приемлемыми.
Ответы:
Доступ к цифровым портам напрямую!
3 метода, которые я тестировал, были
- digitalWrite (pin, LOW); digitalWrite (pin, HIGH);
- CLR (PORTB, 0); SET (PORTB, 0);
- PORTB | = _BV (0); PORTB & = ~ (_BV (0));
[...]
Как видите, для выполнения digitalWrite требуется около 56 циклов, а для прямой адресации портов - 2 цикла. Это большая разница во времени для программ, которые имеют много операций ввода-вывода!
Эта библиотека является хорошей альтернативой: http://code.google.com/p/digitalwritefast/
Как указано выше, доступ к цифровым портам напрямую. Но со стилем!
Записывая жестко запрограммированные значения непосредственно в аппаратные регистры, вы теряете удобочитаемость и переносимость.
Я опубликовал на Github инструмент под названием HWA, который позволяет вам использовать объектно-ориентированный интерфейс с аппаратным обеспечением, для которого не требуется компилятор C ++ и который создает высокоэффективный двоичный код.
HWA там: https://github.com/duparq/hwa
Люди в Arduino.SE уже обсуждали и проверяли это. Как оказалось, digitalWriteFast()
не так много улучшений по сравнению с обычным digitalWrite()
. Прямой доступ к порту, однако, примерно в 35-40 раз быстрее, чем digitalWrite()
.
Используйте ChipKit Uno32. Это намного быстрее чем Arduinos на базе AVR. Это также поможет решить ваши проблемы со временем.