Skip to content

Commit f68958d

Browse files
committed
Fix tests to work with LPTICKER_DELAY_TICKS
Fix the HAL common_tickers and sleep tests so they work correctly when the define LPTICKER_DELAY_TICKS is set.
1 parent adc64cc commit f68958d

File tree

4 files changed

+136
-37
lines changed

4 files changed

+136
-37
lines changed

TESTS/mbed_hal/common_tickers/main.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "ticker_api_tests.h"
2121
#include "hal/us_ticker_api.h"
2222
#include "hal/lp_ticker_api.h"
23+
#include "hal/mbed_lp_ticker_wrapper.h"
2324

2425
#ifdef __cplusplus
2526
extern "C" {
@@ -496,7 +497,15 @@ utest::v1::status_t us_ticker_setup(const Case *const source, const size_t index
496497
{
497498
intf = get_us_ticker_data()->interface;
498499

499-
OS_Tick_Disable();
500+
/* OS, common ticker and low power ticker wrapper
501+
* may make use of us ticker so suspend them for this test */
502+
osKernelSuspend();
503+
#if DEVICE_LPTICKER && (LPTICKER_DELAY_TICKS > 0)
504+
/* Suspend the lp ticker wrapper since it makes use of the us ticker */
505+
ticker_suspend(get_lp_ticker_data());
506+
lp_ticker_wrapper_suspend();
507+
#endif
508+
ticker_suspend(get_us_ticker_data());
500509

501510
intf->init();
502511

@@ -515,7 +524,12 @@ utest::v1::status_t us_ticker_teardown(const Case *const source, const size_t pa
515524

516525
prev_irq_handler = NULL;
517526

518-
OS_Tick_Enable();
527+
ticker_resume(get_us_ticker_data());
528+
#if DEVICE_LPTICKER && (LPTICKER_DELAY_TICKS > 0)
529+
lp_ticker_wrapper_resume();
530+
ticker_resume(get_lp_ticker_data());
531+
#endif
532+
osKernelResume(0);
519533

520534
return greentea_case_teardown_handler(source, passed, failed, reason);
521535
}
@@ -525,7 +539,9 @@ utest::v1::status_t lp_ticker_setup(const Case *const source, const size_t index
525539
{
526540
intf = get_lp_ticker_data()->interface;
527541

528-
OS_Tick_Disable();
542+
/* OS and common ticker may make use of lp ticker so suspend them for this test */
543+
osKernelSuspend();
544+
ticker_suspend(get_lp_ticker_data());
529545

530546
intf->init();
531547

@@ -544,7 +560,8 @@ utest::v1::status_t lp_ticker_teardown(const Case *const source, const size_t pa
544560

545561
prev_irq_handler = NULL;
546562

547-
OS_Tick_Enable();
563+
ticker_resume(get_lp_ticker_data());
564+
osKernelResume(0);
548565

549566
return greentea_case_teardown_handler(source, passed, failed, reason);
550567
}

TESTS/mbed_hal/common_tickers_freq/main.cpp

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "ticker_api_test_freq.h"
2929
#include "hal/us_ticker_api.h"
3030
#include "hal/lp_ticker_api.h"
31+
#include "hal/mbed_lp_ticker_wrapper.h"
3132

3233
#if !DEVICE_USTICKER
3334
#error [NOT_SUPPORTED] test not supported
@@ -38,6 +39,7 @@
3839
using namespace utest::v1;
3940

4041
const ticker_interface_t *intf;
42+
ticker_irq_handler_type prev_handler;
4143

4244
static volatile unsigned int overflowCounter;
4345

@@ -106,43 +108,74 @@ void ticker_frequency_test()
106108

107109
utest::v1::status_t us_ticker_case_setup_handler_t(const Case *const source, const size_t index_of_case)
108110
{
111+
#if DEVICE_LPTICKER && (LPTICKER_DELAY_TICKS > 0)
112+
/* Suspend the lp ticker wrapper since it makes use of the us ticker */
113+
ticker_suspend(get_lp_ticker_data());
114+
lp_ticker_wrapper_suspend();
115+
#endif
116+
ticker_suspend(get_us_ticker_data());
109117
intf = get_us_ticker_data()->interface;
110-
set_us_ticker_irq_handler(ticker_event_handler_stub);
118+
prev_handler = set_us_ticker_irq_handler(ticker_event_handler_stub);
111119
return greentea_case_setup_handler(source, index_of_case);
112120
}
113121

122+
utest::v1::status_t us_ticker_case_teardown_handler_t(const Case *const source, const size_t passed, const size_t failed,
123+
const failure_t reason)
124+
{
125+
set_us_ticker_irq_handler(prev_handler);
126+
ticker_resume(get_us_ticker_data());
127+
#if DEVICE_LPTICKER && (LPTICKER_DELAY_TICKS > 0)
128+
lp_ticker_wrapper_resume();
129+
ticker_resume(get_lp_ticker_data());
130+
#endif
131+
return greentea_case_teardown_handler(source, passed, failed, reason);
132+
}
133+
114134
#if DEVICE_LPTICKER
115135
utest::v1::status_t lp_ticker_case_setup_handler_t(const Case *const source, const size_t index_of_case)
116136
{
137+
ticker_suspend(get_lp_ticker_data());
117138
intf = get_lp_ticker_data()->interface;
118-
set_lp_ticker_irq_handler(ticker_event_handler_stub);
139+
prev_handler = set_lp_ticker_irq_handler(ticker_event_handler_stub);
119140
return greentea_case_setup_handler(source, index_of_case);
120141
}
121-
#endif
122142

123-
utest::v1::status_t ticker_case_teardown_handler_t(const Case *const source, const size_t passed, const size_t failed,
124-
const failure_t reason)
143+
utest::v1::status_t lp_ticker_case_teardown_handler_t(const Case *const source, const size_t passed, const size_t failed,
144+
const failure_t reason)
125145
{
146+
set_lp_ticker_irq_handler(prev_handler);
147+
ticker_resume(get_lp_ticker_data());
126148
return greentea_case_teardown_handler(source, passed, failed, reason);
127149
}
150+
#endif
128151

129152
// Test cases
130153
Case cases[] = {
131154
Case("Microsecond ticker frequency test", us_ticker_case_setup_handler_t, ticker_frequency_test,
132-
ticker_case_teardown_handler_t),
155+
us_ticker_case_teardown_handler_t),
133156
#if DEVICE_LPTICKER
134157
Case("Low power ticker frequency test", lp_ticker_case_setup_handler_t, ticker_frequency_test,
135-
ticker_case_teardown_handler_t),
158+
lp_ticker_case_teardown_handler_t),
136159
#endif
137160
};
138161

139162
utest::v1::status_t greentea_test_setup(const size_t number_of_cases)
140163
{
164+
/* Suspend RTOS Kernel so the timers are not in use. */
165+
osKernelSuspend();
166+
141167
GREENTEA_SETUP(120, "timing_drift_auto");
142168
return greentea_test_setup_handler(number_of_cases);
143169
}
144170

145-
Specification specification(greentea_test_setup, cases, greentea_test_teardown_handler);
171+
void greentea_test_teardown(const size_t passed, const size_t failed, const failure_t failure)
172+
{
173+
osKernelResume(0);
174+
175+
greentea_test_teardown_handler(passed, failed, failure);
176+
}
177+
178+
Specification specification(greentea_test_setup, cases, greentea_test_teardown);
146179

147180
int main()
148181
{

TESTS/mbed_hal/lp_ticker/main.cpp

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "rtos.h"
2121
#include "lp_ticker_api_tests.h"
2222
#include "hal/lp_ticker_api.h"
23+
#include "hal/mbed_lp_ticker_wrapper.h"
2324

2425
#if !DEVICE_LPTICKER
2526
#error [NOT_SUPPORTED] Low power timer not supported for this target
@@ -29,6 +30,8 @@ using namespace utest::v1;
2930

3031
volatile int intFlag = 0;
3132

33+
ticker_irq_handler_type prev_handler;
34+
3235
#define US_PER_MS 1000
3336

3437
#define TICKER_GLITCH_TEST_TICKS 1000
@@ -113,8 +116,6 @@ void lp_ticker_deepsleep_test()
113116
{
114117
intFlag = 0;
115118

116-
set_lp_ticker_irq_handler(ticker_event_handler_stub);
117-
118119
lp_ticker_init();
119120

120121
/* Give some time Green Tea to finish UART transmission before entering
@@ -157,6 +158,32 @@ void lp_ticker_glitch_test()
157158
}
158159
}
159160

161+
#if DEVICE_LPTICKER
162+
utest::v1::status_t lp_ticker_deepsleep_test_setup_handler(const Case *const source, const size_t index_of_case)
163+
{
164+
/* disable everything using the lp ticker for this test */
165+
osKernelSuspend();
166+
ticker_suspend(get_lp_ticker_data());
167+
#if DEVICE_LPTICKER && (LPTICKER_DELAY_TICKS > 0)
168+
lp_ticker_wrapper_suspend();
169+
#endif
170+
prev_handler = set_lp_ticker_irq_handler(ticker_event_handler_stub);
171+
return greentea_case_setup_handler(source, index_of_case);
172+
}
173+
174+
utest::v1::status_t lp_ticker_deepsleep_test_teardown_handler(const Case *const source, const size_t passed, const size_t failed,
175+
const failure_t reason)
176+
{
177+
set_lp_ticker_irq_handler(prev_handler);
178+
#if DEVICE_LPTICKER && (LPTICKER_DELAY_TICKS > 0)
179+
lp_ticker_wrapper_resume();
180+
#endif
181+
ticker_resume(get_lp_ticker_data());
182+
osKernelResume(0);
183+
return greentea_case_teardown_handler(source, passed, failed, reason);
184+
}
185+
#endif
186+
160187
utest::v1::status_t test_setup(const size_t number_of_cases)
161188
{
162189
GREENTEA_SETUP(20, "default_auto");
@@ -166,7 +193,7 @@ utest::v1::status_t test_setup(const size_t number_of_cases)
166193
Case cases[] = {
167194
Case("lp ticker info test", lp_ticker_info_test),
168195
#if DEVICE_SLEEP
169-
Case("lp ticker sleep test", lp_ticker_deepsleep_test),
196+
Case("lp ticker sleep test", lp_ticker_deepsleep_test_setup_handler, lp_ticker_deepsleep_test, lp_ticker_deepsleep_test_teardown_handler),
170197
#endif
171198
Case("lp ticker glitch test", lp_ticker_glitch_test)
172199
};

TESTS/mbed_hal/sleep/main.cpp

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "utest/utest.h"
2424
#include "unity/unity.h"
2525
#include "greentea-client/test_env.h"
26+
#include "mbed_lp_ticker_wrapper.h"
2627

2728
#include "sleep_api_tests.h"
2829

@@ -40,7 +41,7 @@
4041
*
4142
* This should be replaced with a better function that checks if the
4243
* hardware buffers are empty. However, such an API does not exist now,
43-
* so we'll use the wait_ms() function for now.
44+
* so we'll use the busy_wait_ms() function for now.
4445
*/
4546
#define SERIAL_FLUSH_TIME_MS 20
4647

@@ -103,6 +104,20 @@ bool compare_timestamps(unsigned int delta_ticks, unsigned int ticker_width, uns
103104
}
104105
}
105106

107+
void busy_wait_ms(int ms)
108+
{
109+
const ticker_info_t *info = us_ticker_get_info();
110+
uint32_t mask = (1 << info->bits) - 1;
111+
int delay = (int)((uint64_t)ms * info->frequency / 1000);
112+
113+
uint32_t prev = us_ticker_read();
114+
while (delay > 0) {
115+
uint32_t next = us_ticker_read();
116+
delay -= (next - prev) & mask;
117+
prev = next;
118+
}
119+
}
120+
106121
void us_ticker_isr(const ticker_data_t *const ticker_data)
107122
{
108123
us_ticker_clear_interrupt();
@@ -125,17 +140,6 @@ void sleep_usticker_test()
125140

126141
const ticker_irq_handler_type us_ticker_irq_handler_org = set_us_ticker_irq_handler(us_ticker_isr);
127142

128-
// call ticker_read_us to initialize ticker upper layer
129-
// prevents subsequent scheduling of max_delta interrupt during ticker initialization while test execution
130-
// (e.g when ticker_read_us is called)
131-
ticker_read_us(ticker);
132-
#ifdef DEVICE_LPTICKER
133-
// call ticker_read_us to initialize lp_ticker
134-
// prevents scheduling interrupt during ticker initialization (in lp_ticker_init) while test execution
135-
// (e.g when ticker_read_us is called for lp_ticker, see MBED_CPU_STATS_ENABLED)
136-
ticker_read_us(get_lp_ticker_data());
137-
#endif
138-
139143
/* Test only sleep functionality. */
140144
sleep_manager_lock_deep_sleep();
141145
TEST_ASSERT_FALSE_MESSAGE(sleep_manager_can_deep_sleep(), "deep sleep should be locked");
@@ -173,17 +177,12 @@ void deepsleep_lpticker_test()
173177
const unsigned int ticker_freq = ticker->interface->get_info()->frequency;
174178
const unsigned int ticker_width = ticker->interface->get_info()->bits;
175179

176-
// call ticker_read_us to initialize ticker upper layer
177-
// prevents subsequent scheduling of max_delta interrupt during ticker initialization while test execution
178-
// (e.g when ticker_read_us is called)
179-
ticker_read_us(ticker);
180-
181180
const ticker_irq_handler_type lp_ticker_irq_handler_org = set_lp_ticker_irq_handler(lp_ticker_isr);
182181

183182
/* Give some time Green Tea to finish UART transmission before entering
184183
* deep-sleep mode.
185184
*/
186-
wait_ms(SERIAL_FLUSH_TIME_MS);
185+
busy_wait_ms(SERIAL_FLUSH_TIME_MS);
187186

188187
TEST_ASSERT_TRUE_MESSAGE(sleep_manager_can_deep_sleep(), "deep sleep should not be locked");
189188

@@ -218,7 +217,7 @@ void deepsleep_high_speed_clocks_turned_off_test()
218217
/* Give some time Green Tea to finish UART transmission before entering
219218
* deep-sleep mode.
220219
*/
221-
wait_ms(SERIAL_FLUSH_TIME_MS);
220+
busy_wait_ms(SERIAL_FLUSH_TIME_MS);
222221

223222
TEST_ASSERT_TRUE_MESSAGE(sleep_manager_can_deep_sleep(), "deep sleep should not be locked");
224223

@@ -256,15 +255,38 @@ utest::v1::status_t greentea_failure_handler(const Case *const source, const fai
256255
utest::v1::status_t greentea_test_setup(const size_t number_of_cases)
257256
{
258257
GREENTEA_SETUP(60, "default_auto");
258+
/* Suspend RTOS Kernel to enable sleep modes. */
259+
osKernelSuspend();
260+
#if DEVICE_LPTICKER
261+
ticker_suspend(get_lp_ticker_data());
262+
#if DEVICE_LPTICKER && (LPTICKER_DELAY_TICKS > 0)
263+
lp_ticker_wrapper_suspend();
264+
#endif
265+
#endif
266+
ticker_suspend(get_us_ticker_data());
267+
259268
us_ticker_init();
260269
#if DEVICE_LPTICKER
261270
lp_ticker_init();
262271
#endif
263-
/* Suspend RTOS Kernel to enable sleep modes. */
264-
osKernelSuspend();
272+
265273
return greentea_test_setup_handler(number_of_cases);
266274
}
267275

276+
void greentea_test_teardown(const size_t passed, const size_t failed, const failure_t failure)
277+
{
278+
ticker_resume(get_us_ticker_data());
279+
#if DEVICE_LPTICKER
280+
#if DEVICE_LPTICKER && (LPTICKER_DELAY_TICKS > 0)
281+
lp_ticker_wrapper_resume();
282+
#endif
283+
ticker_resume(get_lp_ticker_data());
284+
#endif
285+
osKernelResume(0);
286+
287+
greentea_test_teardown_handler(passed, failed, failure);
288+
}
289+
268290
Case cases[] = {
269291
Case("sleep - source of wake-up - us ticker", sleep_usticker_test, greentea_failure_handler),
270292
#if DEVICE_LPTICKER
@@ -273,7 +295,7 @@ Case cases[] = {
273295
#endif
274296
};
275297

276-
Specification specification(greentea_test_setup, cases, greentea_test_teardown_handler);
298+
Specification specification(greentea_test_setup, cases, greentea_test_teardown);
277299

278300
int main()
279301
{

0 commit comments

Comments
 (0)