Basically, I'd like to let you name I/O pins via typedef, then efficiently read and write the pins. And I'd like to make Arduino's digitalWrite just as efficient when the pin argument is a constant.
All instruction counts are in Debian Wheezy's avr-gcc version 4.7.2 with -mmcu=atmega328p -Os specified on the commandline.
// You can declare ports (they use zero RAM) typedef IOPIN<PORT_B, 0> iob0; typedef IOPIN<PORT_B, 1> iob1; typedef OCPIN<PORT_B, 1, true> ocb1; // emulate an open collector port // .. and use them efficiently (instruction counts never include ret) int en() { iob0::output(); } // 1 instruction int fn() { iob0::toggle(); } // 1 instruction int gn() { ocb1::set(); } // 2 instructions int hn() { ocb1::clear(); } // 2 instructions int jn(bool b) { iob0::write(b); } // 5 instructions int kn() { iob0::write(1); } // 1 instruction // you can use fastDigitalWrite just like digitalWrite (but faster and inline) int c(int i) { fastDigitalWrite(1, i); } // 5 instructions int d() { fastDigitalWrite(1, 1); } // 1 instruction // these have a variable port so they still turn into calls to digitalWrite int a(int i, int j) { fastDigitalWrite(i, j); } int b(int i) { fastDigitalWrite(i, 1); }
Files currently attached to this page:
fast_io_prototype.cpp | 6.2kB |
Entry first conceived on 30 April 2014, 21:14 UTC, last modified on 30 April 2014, 21:26 UTC
Website Copyright © 2004-2024 Jeff Epler