// Writing a custom delay-loop routine and timing how fast it is. // delay for amount of time specified by loops (no-op loop) inline void fine_time(uint32_t loops) { for (uint32_t fine_loops=loops; fine_loops>0; fine_loops--) { asm("nop"); } } void time_loops(uint32_t inner_loops) { uint32_t outer_loops = 1; // number of times to repeat fine_tune call for (uint32_t scaled_inner=inner_loops; scaled_inner< (1<<24); scaled_inner*=2) { outer_loops *=2; } uint32_t start_time=micros(); // start time (usec) for (uint32_t loops=outer_loops; loops>0; loops--) { fine_time(inner_loops); } uint32_t time = micros() - start_time; // elapsed time (usec) Serial.print(outer_loops); Serial.print(" outer "); Serial.print(inner_loops); Serial.print(" loops "); Serial.print( time); Serial.println(" usec"); } void setup(void) { Serial.begin(115200); } void loop(void) { // time_loops(0); // BUG: this asks for a delay of 2^32 time_loops(1); // This is the shortest requestable delay for (uint32_t iters=2; iters<= (1<<27); iters=2*iters) { time_loops(iters); } }