diff --git a/TESTS/mbed_drivers/timer/main.cpp b/TESTS/mbed_drivers/timer/main.cpp index 55eab966a8..51ac5f801c 100644 --- a/TESTS/mbed_drivers/timer/main.cpp +++ b/TESTS/mbed_drivers/timer/main.cpp @@ -30,35 +30,24 @@ using namespace utest::v1; extern uint32_t SystemCoreClock; -/* Macro to define delta based on CPU clock frequency. - * - * Note that some extra time is counted by the timer. - * Additional time is caused by the function calls and - * additional operations performed by wait and - * stop functions before in fact timer is stopped. This may - * add additional time to the counted result. - * - * To take in to account this extra time we introduce DELTA - * value based on CPU clock (speed): - * DELTA = TOLERANCE_FACTOR / SystemCoreClock * US_FACTOR - * - * e.g. - * For K64F DELTA = (30000 / 120000000) * 1000000 = 250[us] - * For NUCLEO_F070RB DELTA = (30000 / 48000000) * 1000000 = 625[us] - * For NRF51_DK DELTA = (30000 / 16000000) * 1000000 = 1875[us] - */ #define US_PER_SEC 1000000 #define US_PER_MSEC 1000 -#define TOLERANCE_FACTOR 30000.0f -#define US_FACTOR 1000000.0f +#define MSEC_PER_SEC 1000 -static const int delta_sys_clk_us = ((int) (TOLERANCE_FACTOR / (float)SystemCoreClock * US_FACTOR)); - -/* When test performs time measurement using Timer in sequence, then measurement error accumulates - * in the successive attempts. */ - #define DELTA_US(i) (delta_sys_clk_us * i) - #define DELTA_S(i) ((float)delta_sys_clk_us * i / US_PER_SEC) - #define DELTA_MS(i) (1 + ( (i * delta_sys_clk_us) / US_PER_MSEC)) + /* + * Define tolerance as follows: + * tolerance = 500 us + 2% of measured time + * + * e.g. + * 1 ms delay: tolerance = 520 us + * 10 ms delay: tolerance = 700 us + * 100 ms delay: tolerance = 2500 us + * 1000 ms delay: tolerance = 20500 us + * + * */ +#define DELTA_US(delay_ms) (500 + delay_ms * US_PER_MSEC / 50) +#define DELTA_MS(delay_ms) (1 + (delay_ms * US_PER_MSEC / 50 / US_PER_MSEC)) +#define DELTA_S(delay_ms) (0.000500f + (((float)delay_ms) / MSEC_PER_SEC / 50)) #define TICKER_FREQ_1MHZ 1000000 #define TICKER_BITS 32 @@ -417,10 +406,10 @@ void test_timer_time_accumulation_os_ticker() p_timer->stop(); /* Check results - totally 10 ms have elapsed. */ - TEST_ASSERT_FLOAT_WITHIN(DELTA_S(1), 0.010f, p_timer->read()); - TEST_ASSERT_INT32_WITHIN(DELTA_MS(1), 10, p_timer->read_ms()); - TEST_ASSERT_INT32_WITHIN(DELTA_US(1), 10000, p_timer->read_us()); - TEST_ASSERT_UINT64_WITHIN(DELTA_US(1), 10000, p_timer->read_high_resolution_us()); + TEST_ASSERT_FLOAT_WITHIN(DELTA_S(10), 0.010f, p_timer->read()); + TEST_ASSERT_INT32_WITHIN(DELTA_MS(10), 10, p_timer->read_ms()); + TEST_ASSERT_INT32_WITHIN(DELTA_US(10), 10000, p_timer->read_us()); + TEST_ASSERT_UINT64_WITHIN(DELTA_US(10), 10000, p_timer->read_high_resolution_us()); /* Wait 50 ms - this is done to show that time elapsed when * the timer is stopped does not have influence on the @@ -439,10 +428,10 @@ void test_timer_time_accumulation_os_ticker() p_timer->stop(); /* Check results - totally 30 ms have elapsed. */ - TEST_ASSERT_FLOAT_WITHIN(DELTA_S(2), 0.030f, p_timer->read()); - TEST_ASSERT_INT32_WITHIN(DELTA_MS(2), 30, p_timer->read_ms()); - TEST_ASSERT_INT32_WITHIN(DELTA_US(2), 30000, p_timer->read_us()); - TEST_ASSERT_UINT64_WITHIN(DELTA_US(2), 30000, p_timer->read_high_resolution_us()); + TEST_ASSERT_FLOAT_WITHIN(DELTA_S(30), 0.030f, p_timer->read()); + TEST_ASSERT_INT32_WITHIN(DELTA_MS(30), 30, p_timer->read_ms()); + TEST_ASSERT_INT32_WITHIN(DELTA_US(30), 30000, p_timer->read_us()); + TEST_ASSERT_UINT64_WITHIN(DELTA_US(30), 30000, p_timer->read_high_resolution_us()); /* Wait 50 ms - this is done to show that time elapsed when * the timer is stopped does not have influence on the @@ -460,10 +449,10 @@ void test_timer_time_accumulation_os_ticker() p_timer->stop(); /* Check results - totally 60 ms have elapsed. */ - TEST_ASSERT_FLOAT_WITHIN(DELTA_S(3), 0.060f, p_timer->read()); - TEST_ASSERT_INT32_WITHIN(DELTA_MS(3), 60, p_timer->read_ms()); - TEST_ASSERT_INT32_WITHIN(DELTA_US(3), 60000, p_timer->read_us()); - TEST_ASSERT_UINT64_WITHIN(DELTA_US(3), 60000, p_timer->read_high_resolution_us()); + TEST_ASSERT_FLOAT_WITHIN(DELTA_S(60), 0.060f, p_timer->read()); + TEST_ASSERT_INT32_WITHIN(DELTA_MS(60), 60, p_timer->read_ms()); + TEST_ASSERT_INT32_WITHIN(DELTA_US(60), 60000, p_timer->read_us()); + TEST_ASSERT_UINT64_WITHIN(DELTA_US(60), 60000, p_timer->read_high_resolution_us()); /* Wait 50 ms - this is done to show that time elapsed when * the timer is stopped does not have influence on the @@ -482,10 +471,10 @@ void test_timer_time_accumulation_os_ticker() p_timer->stop(); /* Check results - totally 1060 ms have elapsed. */ - TEST_ASSERT_FLOAT_WITHIN(DELTA_S(4), 1.060f, p_timer->read()); - TEST_ASSERT_INT32_WITHIN(DELTA_MS(4), 1060, p_timer->read_ms()); - TEST_ASSERT_INT32_WITHIN(DELTA_US(4), 1060000, p_timer->read_us()); - TEST_ASSERT_UINT64_WITHIN(DELTA_US(4), 1060000, p_timer->read_high_resolution_us()); + TEST_ASSERT_FLOAT_WITHIN(DELTA_S(1060), 1.060f, p_timer->read()); + TEST_ASSERT_INT32_WITHIN(DELTA_MS(1060), 1060, p_timer->read_ms()); + TEST_ASSERT_INT32_WITHIN(DELTA_US(1060), 1060000, p_timer->read_us()); + TEST_ASSERT_UINT64_WITHIN(DELTA_US(1060), 1060000, p_timer->read_high_resolution_us()); } /* This test verifies if reset() function resets the timer @@ -511,10 +500,10 @@ void test_timer_reset_os_ticker() p_timer->stop(); /* Check results - totally 10 ms elapsed. */ - TEST_ASSERT_FLOAT_WITHIN(DELTA_S(1), 0.010f, p_timer->read()); - TEST_ASSERT_INT32_WITHIN(DELTA_MS(1), 10, p_timer->read_ms()); - TEST_ASSERT_INT32_WITHIN(DELTA_US(1), 10000, p_timer->read_us()); - TEST_ASSERT_UINT64_WITHIN(DELTA_US(1), 10000, p_timer->read_high_resolution_us()); + TEST_ASSERT_FLOAT_WITHIN(DELTA_S(10), 0.010f, p_timer->read()); + TEST_ASSERT_INT32_WITHIN(DELTA_MS(10), 10, p_timer->read_ms()); + TEST_ASSERT_INT32_WITHIN(DELTA_US(10), 10000, p_timer->read_us()); + TEST_ASSERT_UINT64_WITHIN(DELTA_US(10), 10000, p_timer->read_high_resolution_us()); /* Reset the timer - previous measured time should be lost now. */ p_timer->reset(); @@ -529,10 +518,10 @@ void test_timer_reset_os_ticker() p_timer->stop(); /* Check results - 20 ms elapsed since the reset. */ - TEST_ASSERT_FLOAT_WITHIN(DELTA_S(1), 0.020f, p_timer->read()); - TEST_ASSERT_INT32_WITHIN(DELTA_MS(1), 20, p_timer->read_ms()); - TEST_ASSERT_INT32_WITHIN(DELTA_US(1), 20000, p_timer->read_us()); - TEST_ASSERT_UINT64_WITHIN(DELTA_US(1), 20000, p_timer->read_high_resolution_us()); + TEST_ASSERT_FLOAT_WITHIN(DELTA_S(20), 0.020f, p_timer->read()); + TEST_ASSERT_INT32_WITHIN(DELTA_MS(20), 20, p_timer->read_ms()); + TEST_ASSERT_INT32_WITHIN(DELTA_US(20), 20000, p_timer->read_us()); + TEST_ASSERT_UINT64_WITHIN(DELTA_US(20), 20000, p_timer->read_high_resolution_us()); } /* This test verifies if reset() function resets the timer @@ -613,10 +602,10 @@ void test_timer_start_started_timer_os_ticker() p_timer->stop(); /* Check results - 30 ms have elapsed since the first start. */ - TEST_ASSERT_FLOAT_WITHIN(DELTA_S(2), 0.030f, p_timer->read()); - TEST_ASSERT_INT32_WITHIN(DELTA_MS(2), 30, p_timer->read_ms()); - TEST_ASSERT_INT32_WITHIN(DELTA_US(2), 30000, p_timer->read_us()); - TEST_ASSERT_UINT64_WITHIN(DELTA_US(2), 30000, p_timer->read_high_resolution_us()); + TEST_ASSERT_FLOAT_WITHIN(DELTA_S(30), 0.030f, p_timer->read()); + TEST_ASSERT_INT32_WITHIN(DELTA_MS(30), 30, p_timer->read_ms()); + TEST_ASSERT_INT32_WITHIN(DELTA_US(30), 30000, p_timer->read_us()); + TEST_ASSERT_UINT64_WITHIN(DELTA_US(30), 30000, p_timer->read_high_resolution_us()); } /* This test verifies if calling start() for already @@ -650,10 +639,10 @@ void test_timer_start_started_timer_user_ticker() p_timer->stop(); /* Check results - 30 ms have elapsed since the first start. */ - TEST_ASSERT_FLOAT_WITHIN(DELTA_S(2), 0.030f, p_timer->read()); - TEST_ASSERT_INT32_WITHIN(DELTA_MS(2), 30, p_timer->read_ms()); - TEST_ASSERT_INT32_WITHIN(DELTA_US(2), 30000, p_timer->read_us()); - TEST_ASSERT_UINT64_WITHIN(DELTA_US(2), 30000, p_timer->read_high_resolution_us()); + TEST_ASSERT_FLOAT_WITHIN(DELTA_S(30), 0.030f, p_timer->read()); + TEST_ASSERT_INT32_WITHIN(DELTA_MS(30), 30, p_timer->read_ms()); + TEST_ASSERT_INT32_WITHIN(DELTA_US(30), 30000, p_timer->read_us()); + TEST_ASSERT_UINT64_WITHIN(DELTA_US(30), 30000, p_timer->read_high_resolution_us()); } /* This test verifies Timer float operator. @@ -677,7 +666,7 @@ void test_timer_float_operator_os_ticker() p_timer->stop(); /* Check result - 10 ms elapsed. */ - TEST_ASSERT_FLOAT_WITHIN(DELTA_S(1), 0.010f, (float)(*p_timer)); + TEST_ASSERT_FLOAT_WITHIN(DELTA_S(10), 0.010f, (float)(*p_timer)); } /* This test verifies Timer float operator. @@ -732,10 +721,10 @@ void test_timer_time_measurement() p_timer->stop(); /* Check results. */ - TEST_ASSERT_FLOAT_WITHIN(DELTA_S(1), (float)wait_val_us / 1000000, p_timer->read()); - TEST_ASSERT_INT32_WITHIN(DELTA_MS(1), wait_val_us / 1000, p_timer->read_ms()); - TEST_ASSERT_INT32_WITHIN(DELTA_US(1), wait_val_us, p_timer->read_us()); - TEST_ASSERT_UINT64_WITHIN(DELTA_US(1), wait_val_us, p_timer->read_high_resolution_us()); + TEST_ASSERT_FLOAT_WITHIN(DELTA_S(wait_val_us / US_PER_MSEC), (float)wait_val_us / US_PER_SEC, p_timer->read()); + TEST_ASSERT_INT32_WITHIN(DELTA_MS(wait_val_us / US_PER_MSEC), wait_val_us / US_PER_MSEC, p_timer->read_ms()); + TEST_ASSERT_INT32_WITHIN(DELTA_US(wait_val_us / US_PER_MSEC), wait_val_us, p_timer->read_us()); + TEST_ASSERT_UINT64_WITHIN(DELTA_US(wait_val_us / US_PER_MSEC), wait_val_us, p_timer->read_high_resolution_us()); } utest::v1::status_t test_setup(const size_t number_of_cases) {