@@ -43,6 +43,7 @@ extern "C" {
43
43
#define US_TICKER_OVERFLOW_DELTA2 60
44
44
45
45
#define TICKER_100_TICKS 100
46
+ #define TICKER_500_TICKS 500
46
47
47
48
#define MAX_FUNC_EXEC_TIME_US 20
48
49
#define DELTA_FUNC_EXEC_TIME_US 5
@@ -420,8 +421,19 @@ void ticker_increment_test(void)
420
421
void ticker_speed_test (void )
421
422
{
422
423
Timer timer;
424
+ #if DEVICE_LPTICKER
425
+ LowPowerTimer lptimer;
426
+ #endif
423
427
int counter = NUM_OF_CALLS;
424
428
429
+ /* Free function will disable the ticker. For time measurement
430
+ * we need to use other one.
431
+ */
432
+ #if DEVICE_LPTICKER
433
+ bool us_ticker_test = (intf == get_us_ticker_data ()->interface );
434
+ Timer * free_timer = us_ticker_test ? &lptimer : &timer;
435
+ #endif
436
+
425
437
/* ---- Test ticker_read function. ---- */
426
438
timer.reset ();
427
439
timer.start ();
@@ -475,8 +487,70 @@ void ticker_speed_test(void)
475
487
timer.stop ();
476
488
477
489
TEST_ASSERT (timer.read_us () < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
490
+
491
+ /* ---- Test free function. ---- */
492
+ #if DEVICE_LPTICKER
493
+ counter = NUM_OF_CALLS;
494
+ free_timer->reset ();
495
+ free_timer->start ();
496
+ while (counter--) {
497
+ intf->free ();
498
+ }
499
+ free_timer->stop ();
500
+
501
+ TEST_ASSERT (free_timer->read_us () < (NUM_OF_CALLS * (MAX_FUNC_EXEC_TIME_US + DELTA_FUNC_EXEC_TIME_US)));
502
+ #endif
478
503
}
479
504
505
+ /* Test that ticker_free disables ticker interrupt. */
506
+ void ticker_free_interrupt_test (void )
507
+ {
508
+ overflow_protect ();
509
+
510
+ uint32_t cycles_500_ticks = 50 ;
511
+ uint32_t reference_ticks_count = 0 ;
512
+
513
+ while (reference_ticks_count < TICKER_500_TICKS) {
514
+ cycles_500_ticks *= 2 ;
515
+ const uint32_t start = intf->read ();
516
+ wait_cycles (cycles_500_ticks);
517
+ reference_ticks_count = intf->read () - start;
518
+ }
519
+
520
+ intFlag = 0 ;
521
+
522
+ intf->set_interrupt (intf->read () + (TICKER_500_TICKS / 2 ));
523
+ intf->free ();
524
+ wait_cycles (cycles_500_ticks);
525
+ intf->init ();
526
+ TEST_ASSERT_EQUAL (0 , intFlag);
527
+ }
528
+
529
+ /* Test that ticker can be successfully re-initialized after free(). */
530
+ void ticker_init_free_test (void )
531
+ {
532
+ intf->free ();
533
+ intf->init ();
534
+
535
+ overflow_protect ();
536
+
537
+ intFlag = 0 ;
538
+
539
+ const uint32_t tick_count = intf->read ();
540
+
541
+ intf->set_interrupt (intf->read () + TICKER_INT_VAL);
542
+
543
+ while (intf->read () < (tick_count + TICKER_INT_VAL - TICKER_DELTA)) {
544
+ TEST_ASSERT_EQUAL_INT_MESSAGE (0 , intFlag, " Interrupt fired too early" );
545
+ }
546
+
547
+ while (intf->read () < (tick_count + TICKER_INT_VAL + TICKER_DELTA)) {
548
+ }
549
+
550
+ TEST_ASSERT_EQUAL (1 , intFlag);
551
+ }
552
+
553
+
480
554
utest::v1::status_t us_ticker_setup (const Case *const source, const size_t index_of_case)
481
555
{
482
556
intf = get_us_ticker_data ()->interface ;
@@ -551,6 +625,8 @@ Case cases[] = {
551
625
Case (" Microsecond ticker overflow test" , us_ticker_setup, ticker_overflow_test, us_ticker_teardown),
552
626
Case (" Microsecond ticker increment test" , us_ticker_setup, ticker_increment_test, us_ticker_teardown),
553
627
Case (" Microsecond ticker speed test" , us_ticker_setup, ticker_speed_test, us_ticker_teardown),
628
+ Case (" Microsecond ticker free interrupt test" , us_ticker_setup, ticker_free_interrupt_test, us_ticker_teardown),
629
+ Case (" Microsecond re-init after free test" , us_ticker_setup, ticker_init_free_test, us_ticker_teardown),
554
630
#if DEVICE_LPTICKER
555
631
Case (" lp ticker init is safe to call repeatedly" , lp_ticker_setup, ticker_init_test, lp_ticker_teardown),
556
632
Case (" lp ticker info test" , lp_ticker_setup, ticker_info_test, lp_ticker_teardown),
@@ -561,6 +637,8 @@ Case cases[] = {
561
637
Case (" lp ticker overflow test" , lp_ticker_setup, ticker_overflow_test, lp_ticker_teardown),
562
638
Case (" lp ticker increment test" , lp_ticker_setup, ticker_increment_test, lp_ticker_teardown),
563
639
Case (" lp ticker speed test" , lp_ticker_setup, ticker_speed_test, lp_ticker_teardown),
640
+ Case (" lp ticker free interrupt test" , lp_ticker_setup, ticker_free_interrupt_test, lp_ticker_teardown),
641
+ Case (" lp ticker re-init after free test" , lp_ticker_setup, ticker_init_free_test, lp_ticker_teardown),
564
642
#endif
565
643
};
566
644
0 commit comments