@@ -37,8 +37,10 @@ extern "C" {
37
37
#define TICKER_INT_VAL 500
38
38
#define TICKER_DELTA 10
39
39
40
- #define LP_TICKER_OVERFLOW_DELTA 0 // this will allow to detect that ticker counter rollovers to 0
41
- #define US_TICKER_OVERFLOW_DELTA 50
40
+ #define LP_TICKER_OVERFLOW_DELTA1 0 // this will allow to detect that ticker counter rollovers to 0
41
+ #define LP_TICKER_OVERFLOW_DELTA2 0
42
+ #define US_TICKER_OVERFLOW_DELTA1 50
43
+ #define US_TICKER_OVERFLOW_DELTA2 60
42
44
43
45
#define TICKER_100_TICKS 100
44
46
@@ -56,7 +58,18 @@ using namespace utest::v1;
56
58
volatile int intFlag = 0 ;
57
59
const ticker_interface_t * intf;
58
60
ticker_irq_handler_type prev_irq_handler;
59
- unsigned int ticker_overflow_delta;
61
+ /* Some targets might fail overflow test uncertainly due to getting trapped in busy
62
+ * intf->read() loop. In the loop, some ticker values wouldn't get caught in time
63
+ * because of:
64
+ * 1. Lower CPU clock
65
+ * 2. Compiled code with worse performance
66
+ * 3. Interrupt at that time
67
+ *
68
+ * We fix it by checking small ticker value range rather than one exact ticker point
69
+ * in near overflow check.
70
+ */
71
+ unsigned int ticker_overflow_delta1;
72
+ unsigned int ticker_overflow_delta2;
60
73
61
74
/* Auxiliary function to count ticker ticks elapsed during execution of N cycles of empty while loop.
62
75
* Parameter <step> is used to disable compiler optimisation. */
@@ -301,12 +314,13 @@ void ticker_overflow_test(void)
301
314
intFlag = 0 ;
302
315
303
316
/* Wait for max count. */
304
- while (intf->read () != (max_count - ticker_overflow_delta)) {
317
+ while (intf->read () >= (max_count - ticker_overflow_delta2) &&
318
+ intf->read () <= (max_count - ticker_overflow_delta1)) {
305
319
/* Just wait. */
306
320
}
307
321
308
322
/* Now we are near/at the overflow point. Detect rollover. */
309
- while (intf->read () > ticker_overflow_delta );
323
+ while (intf->read () > ticker_overflow_delta1 );
310
324
311
325
const uint32_t after_overflow = intf->read ();
312
326
@@ -318,7 +332,7 @@ void ticker_overflow_test(void)
318
332
const uint32_t next_after_overflow = intf->read ();
319
333
320
334
/* Check that after the overflow ticker continue count. */
321
- TEST_ASSERT (after_overflow <= ticker_overflow_delta );
335
+ TEST_ASSERT (after_overflow <= ticker_overflow_delta1 );
322
336
TEST_ASSERT (next_after_overflow >= TICKER_100_TICKS);
323
337
TEST_ASSERT_EQUAL (0 , intFlag);
324
338
@@ -473,7 +487,8 @@ utest::v1::status_t us_ticker_setup(const Case *const source, const size_t index
473
487
474
488
prev_irq_handler = set_us_ticker_irq_handler (ticker_event_handler_stub);
475
489
476
- ticker_overflow_delta = US_TICKER_OVERFLOW_DELTA;
490
+ ticker_overflow_delta1 = US_TICKER_OVERFLOW_DELTA1;
491
+ ticker_overflow_delta2 = US_TICKER_OVERFLOW_DELTA2;
477
492
478
493
return greentea_case_setup_handler (source, index_of_case);
479
494
}
@@ -501,7 +516,8 @@ utest::v1::status_t lp_ticker_setup(const Case *const source, const size_t index
501
516
502
517
prev_irq_handler = set_lp_ticker_irq_handler (ticker_event_handler_stub);
503
518
504
- ticker_overflow_delta = LP_TICKER_OVERFLOW_DELTA;
519
+ ticker_overflow_delta1 = LP_TICKER_OVERFLOW_DELTA1;
520
+ ticker_overflow_delta2 = LP_TICKER_OVERFLOW_DELTA2;
505
521
506
522
return greentea_case_setup_handler (source, index_of_case);
507
523
}
0 commit comments