Erik -
/
FastIO_TestBench
Testbench for FastIO
Fork of FastIO by
main.cpp
- Committer:
- igorsk
- Date:
- 2010-03-12
- Revision:
- 0:f1e54c45ccaf
- Child:
- 1:8064f8b8cf82
File content as of revision 0:f1e54c45ccaf:
#include "mbed.h" // Super-fast DigitalOut-like class for mbed // by Igor Skochinsky // usage: FastOut<LED2> led2; // then use the same assignment operators as with DigitalOut template <PinName pin> class FastOut { // pin = LPC_GPIO0_BASE + port * 32 + bit // port = (pin - LPC_GPIO0_BASE) / 32 // bit = (pin - LPC_GPIO0_BASE) % 32 // helper function to calculate the GPIO port definition for the pin // we rely on the fact that port structs are 0x20 bytes apart inline LPC_GPIO_TypeDef* portdef() { return (LPC_GPIO_TypeDef*)(LPC_GPIO0_BASE + ((pin - P0_0)/32)*0x20); }; // helper function to calculate the mask for the pin's bit in the port inline uint32_t mask() { return 1UL<<((pin - LPC_GPIO0_BASE) % 32); }; public: FastOut() { // set FIODIR bit to 1 (output) portdef()->FIODIR |= mask(); } void write(int value) { if ( value ) portdef()->FIOSET = mask(); else portdef()->FIOCLR = mask(); } int read() { return (portdef()->FIOPIN) & mask() != 0; } FastOut& operator= (int value) { write(value); return *this; }; FastOut& operator= (FastOut& rhs) { return write(rhs.read()); }; operator int() { return read(); }; }; DigitalOut led1(LED1); FastOut<LED2> led2; Timer t; #define LOOPS 100000000 int main() { int value = 0; int count = LOOPS; t.start(); while ( count -- ) { led1.write(value); value = 1-value; } t.stop(); printf("DigitalOut: %f seconds (%d ns per iteration).\n", t.read(), t.read_us()/(LOOPS/1000)); count = LOOPS; t.reset(); t.start(); while ( count -- ) { led2 = value; value = 1-value; } t.stop(); printf("FastOut: %f seconds (%d ns per iteration).\n", t.read(), t.read_us()/(LOOPS/1000)); }