Testbench for FastIO

Dependencies:   FastIO mbed

Fork of FastIO by Igor Skochinsky

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));
}