Fix WMath's map() implementation for inverse/round-trip mapping by dok-net · Pull Request #7027 · esp8266/Arduino (original) (raw)
Here's the sketch for testing correctness and timing:
uint32_t expired; uint32_t iterations;
void setup() { Serial.begin(115200); while (!Serial); Serial.println("check map"); expired = 0; iterations = 0; }
constexpr int imin = 0; constexpr int imax = 180; constexpr int omin = 1000; constexpr int omax = 2000;
int i = 0; int fails = 0;
void loop() { ++iterations; i = (i + 1) % (imax + 1);
#if defined(ESP8266) || defined(ESP32) cli(); volatile auto start = ESP.getCycleCount(); #else // Set Timer 1 to normal mode at F_CPU. TCCR1A = 0; TCCR1B = 1; cli(); volatile uint16_t start = TCNT1; #endif
volatile auto o = map(i, imin, imax, omin, omax);
#if defined(ESP8266) || defined(ESP32) sei(); volatile auto cycles = ESP.getCycleCount() - start; #else sei(); volatile uint16_t finish = TCNT1; uint16_t cycles = finish - start; #endif
expired += cycles;
if (i != map(o, omin, omax, imin, imax))
{
++fails;
}
if (iterations > 100000)
{
Serial.print("Cycles per map(...) = "); Serial.print(expired / iterations);
Serial.print(", fails = "); Serial.print(fails);
Serial.println();
expired = 0;
iterations = 0;
fails = 0;
}
}