Skip to content

Commit 239ce02

Browse files
committed
tests-mbed_hal-common_tickers: add ticker_free() functional tests.
1 parent 0f9ce65 commit 239ce02

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed

TESTS/mbed_hal/common_tickers/main.cpp

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ extern "C" {
4343
#define US_TICKER_OVERFLOW_DELTA2 60
4444

4545
#define TICKER_100_TICKS 100
46+
#define TICKER_500_TICKS 500
4647

4748
#define MAX_FUNC_EXEC_TIME_US 20
4849
#define DELTA_FUNC_EXEC_TIME_US 5
@@ -420,8 +421,19 @@ void ticker_increment_test(void)
420421
void ticker_speed_test(void)
421422
{
422423
Timer timer;
424+
#if DEVICE_LPTICKER
425+
LowPowerTimer lptimer;
426+
#endif
423427
int counter = NUM_OF_CALLS;
424428

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+
425437
/* ---- Test ticker_read function. ---- */
426438
timer.reset();
427439
timer.start();
@@ -475,8 +487,70 @@ void ticker_speed_test(void)
475487
timer.stop();
476488

477489
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
478503
}
479504

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+
480554
utest::v1::status_t us_ticker_setup(const Case *const source, const size_t index_of_case)
481555
{
482556
intf = get_us_ticker_data()->interface;
@@ -551,6 +625,8 @@ Case cases[] = {
551625
Case("Microsecond ticker overflow test", us_ticker_setup, ticker_overflow_test, us_ticker_teardown),
552626
Case("Microsecond ticker increment test", us_ticker_setup, ticker_increment_test, us_ticker_teardown),
553627
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),
554630
#if DEVICE_LPTICKER
555631
Case("lp ticker init is safe to call repeatedly", lp_ticker_setup, ticker_init_test, lp_ticker_teardown),
556632
Case("lp ticker info test", lp_ticker_setup, ticker_info_test, lp_ticker_teardown),
@@ -561,6 +637,8 @@ Case cases[] = {
561637
Case("lp ticker overflow test", lp_ticker_setup, ticker_overflow_test, lp_ticker_teardown),
562638
Case("lp ticker increment test", lp_ticker_setup, ticker_increment_test, lp_ticker_teardown),
563639
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),
564642
#endif
565643
};
566644

TESTS/mbed_hal/common_tickers/ticker_api_tests.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,21 @@ void ticker_speed_test(void);
118118
*/
119119
void ticker_overflow_test(void);
120120

121+
/** Test ticker_free disables ticker interrupt.
122+
*
123+
* Given ticker is available.
124+
* When ticker interrupt is set and then ticker_free is called.
125+
* Then ticker interrupt is not triggered.
126+
*/
127+
void ticker_free_interrupt_test(void);
128+
129+
/** Test that ticker can be successfully re-initialized after free().
130+
*
131+
* Given ticker is available.
132+
* When ticker has been re-initialized after free().
133+
* Then ticker counts and generates interrupts.
134+
*/
135+
void ticker_init_free_test(void);
121136
/**@}*/
122137

123138
#ifdef __cplusplus

0 commit comments

Comments
 (0)