13
\$\begingroup\$

What are the fastest alternatives to calling the Arduino functions digitalread() and digitalwrite()? AVR-specific or chip-specific solutions are acceptable.

\$\endgroup\$
2
  • 3
    \$\begingroup\$ Reading this and your last question, it seems like you want to do something pretty quickly. I think giving details on what it is and how fast might be useful. \$\endgroup\$
    – Oli Glaser
    Nov 22 '11 at 1:16
  • \$\begingroup\$ @Oli, good idea, thanks. Current project is a tuning system for RC transmitters. It works well, but I would like to make the RC PWM signal decoding efficient so that I can use the same framework for other projects. Here's a writeup on what I have so far: eastbay-rc.blogspot.com/2011/11/… \$\endgroup\$ Nov 27 '11 at 2:17
18
\$\begingroup\$

Access the digital ports directly!

The 3 methods I tested were

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

[...]

enter image description here

As you can see, digitalWrite takes around 56 cycles to complete, while direct Port addressing takes 2 cycles. That’s a big difference in time for programs that have lot’s of IO operations!

\$\endgroup\$
7
\$\begingroup\$

This library is a good alternative: http://code.google.com/p/digitalwritefast/

\$\endgroup\$
2
\$\begingroup\$

As suggested above, access the digital ports directly. But with style!

By writing hard-coded values directly into the hardware registers, you loose in readability and portability.

I've published on Github a tool I called HWA that lets you use an object-oriented interface to the hardware that does not require a C++ compiler and produces high efficiency binary code.

HWA is there: https://github.com/duparq/hwa

\$\endgroup\$
1
  • 1
    \$\begingroup\$ "high efficiency binary code" would sound much more authoritative along with actual measurements. \$\endgroup\$ Feb 15 '18 at 8:49
2
\$\begingroup\$

Folks at Arduino.SE have already discussed and tested this. As it turns out, digitalWriteFast() is not much of improvement over regular digitalWrite(). Direct port access, however, is about 35-40 times faster than digitalWrite().

\$\endgroup\$
1
\$\begingroup\$

Use the ChipKit Uno32. It's much faster than the AVR-based Arduinos. It will also deal with your timing problems.

\$\endgroup\$
8
  • 1
    \$\begingroup\$ I don't think buying faster hardware is the best answer here, at least not until you've reached the bounds of your current hardware and decided that you need something faster. \$\endgroup\$
    – Jon L
    Nov 22 '11 at 0:42
  • 1
    \$\begingroup\$ Why the downvotes? He wanted the fastest solution, not just a faster one, which I've provided. Can anyone suggest a faster Arduino-based solution? \$\endgroup\$ Nov 22 '11 at 1:51
  • 12
    \$\begingroup\$ Because the ChipKit is not an arduino, but an arduino compatible platform. This means that although port switching is faster , there is a big likelihood of a rewrite of some libraries. Ethernet, XBee, SD card libraries may not work at all out of the box. Furthermore, Mark specifically asks for alternative function calls of digitalRead/Write, not for a new platform (doh). \$\endgroup\$
    – Hans
    Nov 22 '11 at 8:43
  • 2
    \$\begingroup\$ Changing hardware is never a good solution. At the very least you miss out on some good learning and will never learn what would be efficient use of the hardware. \$\endgroup\$
    – Rick_2047
    Nov 25 '11 at 13:39
  • 1
    \$\begingroup\$ @Rick_2047 I wouldn't say "never" - if the requirement is new or expanded or the quantity increases, it can make sense to look at alternatives. But I agree that blindly throwing hardware at gross software inefficiencies is unsophisticated - sometimes it doesn't even work as higher performance systems can add overhead of their own and sometimes end up slower than simpler ones for some tasks. There's really no substitute for learning about the platform you use or contemplate using. \$\endgroup\$ Nov 25 '11 at 15:30

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.