I’m pretty sure that my interpreted CPython code is as efficient as possible, so if I want to capture all samples (for accurate integration) rather than the 95% I currently get, I need to make the motion processing code take less than 1ms and the most obvious currently-available solution (until the RPi A2 is launched) is to move from the interpreted CPython to the compiled Cython or PyPy.
I considered this a long time ago when trying to speed up the code, but in the end, I didn’t need to make the move as various tweaks to the code* improved the performance by a factor of 5 or 6.
But now is the time to make that leap of faith. I’ll update you on progress.
*Primary performance enhancements:
- customized GPIO library to optimize rising edge performance for the data ready hardware interrupt
- run sampling at 1kHz but only run motion processing for each batch of 10 (averaged) samples.
- minimized calls to time.time() to just time stamping each batch of 10 samples – another irony that calling time.time() is the most time consuming call in this code.