2929#define TICKER_INT_VAL 500
3030#define TICKER_DELTA 10
3131
32- #define LP_TICKER_OVERFLOW_DELTA 0 // this will allow to detect that ticker counter rollovers to 0
33- #define US_TICKER_OVERFLOW_DELTA 50
32+ #define LP_TICKER_OVERFLOW_DELTA1 0 // this will allow to detect that ticker counter rollovers to 0
33+ #define LP_TICKER_OVERFLOW_DELTA2 0
34+ #define US_TICKER_OVERFLOW_DELTA1 50
35+ #define US_TICKER_OVERFLOW_DELTA2 60
3436
3537#define TICKER_100_TICKS 100
3638
@@ -48,7 +50,18 @@ using namespace utest::v1;
4850volatile int intFlag = 0 ;
4951const ticker_interface_t * intf;
5052ticker_irq_handler_type prev_irq_handler;
51- unsigned int ticker_overflow_delta;
53+ /* Some targets might fail overflow test uncertainly due to getting trapped in busy
54+ * intf->read() loop. In the loop, some ticker values wouldn't get caught in time
55+ * because of:
56+ * 1. Lower CPU clock
57+ * 2. Compiled code with worse performance
58+ * 3. Interrupt at that time
59+ *
60+ * We fix it by checking small ticker value range rather than one exact ticker point
61+ * in near overflow check.
62+ */
63+ unsigned int ticker_overflow_delta1;
64+ unsigned int ticker_overflow_delta2;
5265
5366/* Auxiliary function to count ticker ticks elapsed during execution of N cycles of empty while loop.
5467 * Parameter <step> is used to disable compiler optimisation. */
@@ -293,12 +306,13 @@ void ticker_overflow_test(void)
293306 intFlag = 0 ;
294307
295308 /* Wait for max count. */
296- while (intf->read () != (max_count - ticker_overflow_delta)) {
309+ while (intf->read () >= (max_count - ticker_overflow_delta2) &&
310+ intf->read () <= (max_count - ticker_overflow_delta1)) {
297311 /* Just wait. */
298312 }
299313
300314 /* Now we are near/at the overflow point. Detect rollover. */
301- while (intf->read () > ticker_overflow_delta );
315+ while (intf->read () > ticker_overflow_delta1 );
302316
303317 const uint32_t after_overflow = intf->read ();
304318
@@ -310,7 +324,7 @@ void ticker_overflow_test(void)
310324 const uint32_t next_after_overflow = intf->read ();
311325
312326 /* Check that after the overflow ticker continue count. */
313- TEST_ASSERT (after_overflow <= ticker_overflow_delta );
327+ TEST_ASSERT (after_overflow <= ticker_overflow_delta1 );
314328 TEST_ASSERT (next_after_overflow >= TICKER_100_TICKS);
315329 TEST_ASSERT_EQUAL (0 , intFlag);
316330
@@ -465,7 +479,8 @@ utest::v1::status_t us_ticker_setup(const Case *const source, const size_t index
465479
466480 prev_irq_handler = set_us_ticker_irq_handler (ticker_event_handler_stub);
467481
468- ticker_overflow_delta = US_TICKER_OVERFLOW_DELTA;
482+ ticker_overflow_delta1 = US_TICKER_OVERFLOW_DELTA1;
483+ ticker_overflow_delta2 = US_TICKER_OVERFLOW_DELTA2;
469484
470485 return greentea_case_setup_handler (source, index_of_case);
471486}
@@ -493,7 +508,8 @@ utest::v1::status_t lp_ticker_setup(const Case *const source, const size_t index
493508
494509 prev_irq_handler = set_lp_ticker_irq_handler (ticker_event_handler_stub);
495510
496- ticker_overflow_delta = LP_TICKER_OVERFLOW_DELTA;
511+ ticker_overflow_delta1 = LP_TICKER_OVERFLOW_DELTA1;
512+ ticker_overflow_delta2 = LP_TICKER_OVERFLOW_DELTA2;
497513
498514 return greentea_case_setup_handler (source, index_of_case);
499515}
0 commit comments