Arduino: szybsze alternatywy dla digitalread () i digitalwrite ()?

13

Jakie są najszybsze alternatywy dla wywoływania funkcji Arduino digitalread()i digitalwrite()? Dopuszczalne są rozwiązania specyficzne dla AVR lub chipów.

Mark Harrison
źródło
3
Czytając to i ostatnie pytanie, wydaje się, że chcesz zrobić coś dość szybko. Myślę, że podając szczegółowe informacje na temat tego, co to jest i jak szybko może być przydatne.
Oli Glaser,
@Oli, dobry pomysł, dzięki. Obecny projekt to system dostrajania nadajników RC. Działa dobrze, ale chciałbym, aby dekodowanie sygnału RC PWM było wydajne, aby móc używać tego samego frameworka do innych projektów. Oto podsumowanie tego, co mam do tej pory: eastbay-rc.blogspot.com/2011/11/…
Mark Harrison

Odpowiedzi:

18

Uzyskaj bezpośredni dostęp do portów cyfrowych!

Testowałem 3 metody

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

[...]

wprowadź opis zdjęcia tutaj

Jak widać, digitalWrite zajmuje około 56 cykli, a bezpośrednie adresowanie portów zajmuje 2 cykle. To duża różnica w czasie dla programów, które mają dużo operacji IO!

Marty
źródło
2

Jak sugerowano powyżej, uzyskaj bezpośredni dostęp do portów cyfrowych. Ale ze stylem!

Zapisując na stałe wartości bezpośrednio w rejestrach sprzętowych, tracisz czytelność i przenośność.

W Github opublikowałem narzędzie, które nazwałem HWA, które pozwala na użycie zorientowanego obiektowo interfejsu do sprzętu, który nie wymaga kompilatora C ++ i wytwarza wysokowydajny kod binarny.

Jest tam HWA: https://github.com/duparq/hwa

duparq
źródło
1
„wysokowydajny kod binarny” brzmiałby o wiele bardziej wiarygodnie wraz z rzeczywistymi pomiarami.
Dmitrij Grigoriew
2

Ludzie z Arduino.SE już to omówili i przetestowali. Jak się okazuje, digitalWriteFast()poprawa jest niewielka w porównaniu do zwykłych digitalWrite(). Bezpośredni dostęp do portu jest jednak około 35-40 razy szybszy niż digitalWrite().

Dmitrij Grigoriew
źródło
0

Użyj ChipKit Uno32. Jest znacznie szybszy niż Arduinos oparte na AVR. Zajmie się również twoimi problemami z czasem.

Leon Heller
źródło
1
Nie sądzę, aby kupowanie szybszego sprzętu było najlepszą odpowiedzią tutaj, przynajmniej dopóki nie osiągniesz granic obecnego sprzętu i nie zdecydujesz, że potrzebujesz czegoś szybciej.
Jon L
1
Dlaczego opinie negatywne? Chciał najszybszego rozwiązania, a nie tylko tego, które zapewniłem. Czy ktoś może zasugerować szybsze rozwiązanie oparte na Arduino?
Leon Heller
12
Ponieważ ChipKit nie jest platformą arduino, ale platformą kompatybilną z arduino. Oznacza to, że chociaż przełączanie portów jest szybsze, istnieje duże prawdopodobieństwo przepisania niektórych bibliotek. Biblioteki kart Ethernet, XBee, SD mogą w ogóle nie działać od razu po wyjęciu z pudełka. Ponadto Mark konkretnie prosi o alternatywne wywołania funkcji digitalRead / Write, a nie o nową platformę (doh).
Hans
2
Zmiana sprzętu nigdy nie jest dobrym rozwiązaniem. Przynajmniej przegapisz dobrą naukę i nigdy nie dowiesz się, jakie byłoby efektywne wykorzystanie sprzętu.
Rick_2047,
1
@ Rick_2047 Nie powiedziałbym „nigdy” - jeśli wymaganie jest nowe lub rozszerzone lub ilość rośnie, warto spojrzeć na alternatywy. Zgadzam się jednak, że ślepe rzucanie sprzętem przy rażącej nieefektywności oprogramowania jest niewyszukane - czasami nawet nie działa, ponieważ systemy o wyższej wydajności mogą nakładać własne koszty, a czasem kończą się wolniej niż prostsze w niektórych zadaniach. Naprawdę nie ma substytutu nauki o platformie, z której korzystasz lub którą rozważasz.
Chris Stratton,