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

}