Skip to content

Commit 472abab

Browse files
committed
Update deep sleep lock check in tests
When the define LPTICKER_DELAY_TICKS is set deep sleep can be randomly disallowed when using the low power ticker. This is because a Timer object, which locks deep sleep, is used to protect from back-to-back writes to lp tickers which can't support that. This causes tests which assert that deep sleep is allowed to intermittently fail. To fix this intermittent failure this patch adds the function sleep_manager_can_deep_sleep_test_check() which checks if deep sleep is allowed over a duration. It updates all the tests to use sleep_manager_can_deep_sleep_test_check() rather than sleep_manager_can_deep_sleep() so the tests work even if deep sleep is spuriously blocked.
1 parent 1bbf43a commit 472abab

File tree

9 files changed

+57
-32
lines changed

9 files changed

+57
-32
lines changed

TESTS/mbed_drivers/sleep_lock/main.cpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,90 +29,90 @@ using namespace utest::v1;
2929

3030
void deep_sleep_lock_lock_test()
3131
{
32-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
32+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
3333
{
3434
// Check basic usage works
3535
DeepSleepLock lock;
36-
TEST_ASSERT_EQUAL(false, sleep_manager_can_deep_sleep());
36+
TEST_ASSERT_EQUAL(false, sleep_manager_can_deep_sleep_test_check());
3737
}
3838

39-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
39+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
4040
{
4141
// Check that unlock and lock change can deep sleep as expected
4242
DeepSleepLock lock;
43-
TEST_ASSERT_EQUAL(false, sleep_manager_can_deep_sleep());
43+
TEST_ASSERT_EQUAL(false, sleep_manager_can_deep_sleep_test_check());
4444
lock.unlock();
45-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
45+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
4646
lock.lock();
47-
TEST_ASSERT_EQUAL(false, sleep_manager_can_deep_sleep());
47+
TEST_ASSERT_EQUAL(false, sleep_manager_can_deep_sleep_test_check());
4848
}
4949

50-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
50+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
5151
{
5252
// Check that unlock releases sleep based on count
5353
DeepSleepLock lock;
5454
lock.lock();
5555
lock.lock();
5656
lock.unlock();
57-
TEST_ASSERT_EQUAL(false, sleep_manager_can_deep_sleep());
57+
TEST_ASSERT_EQUAL(false, sleep_manager_can_deep_sleep_test_check());
5858
}
5959

60-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
60+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
6161
{
6262
// Check that unbalanced locks do not leave deep sleep locked
6363
DeepSleepLock lock;
6464
lock.lock();
65-
TEST_ASSERT_EQUAL(false, sleep_manager_can_deep_sleep());
65+
TEST_ASSERT_EQUAL(false, sleep_manager_can_deep_sleep_test_check());
6666
}
67-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
67+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
6868

6969
}
7070

7171
void timer_lock_test()
7272
{
73-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
73+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
7474
{
7575
// Just creating a timer object does not lock sleep
7676
Timer timer;
77-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
77+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
7878
}
7979

80-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
80+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
8181
{
8282
// Starting a timer does lock sleep
8383
Timer timer;
8484
timer.start();
85-
TEST_ASSERT_EQUAL(false, sleep_manager_can_deep_sleep());
85+
TEST_ASSERT_EQUAL(false, sleep_manager_can_deep_sleep_test_check());
8686
}
8787

88-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
88+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
8989
{
9090
// Stopping a timer after starting it allows sleep
9191
Timer timer;
9292
timer.start();
9393
timer.stop();
94-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
94+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
9595
}
9696

97-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
97+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
9898
{
9999
// Starting a timer multiple times still lets you sleep
100100
Timer timer;
101101
timer.start();
102102
timer.start();
103103
}
104-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
104+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
105105

106-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
106+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
107107
{
108108
// Stopping a timer multiple times still lets you sleep
109109
Timer timer;
110110
timer.start();
111111
timer.stop();
112112
timer.stop();
113-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
113+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
114114
}
115-
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep());
115+
TEST_ASSERT_EQUAL(true, sleep_manager_can_deep_sleep_test_check());
116116
}
117117

118118
Case cases[] = {

TESTS/mbed_drivers/timeout/timeout_tests.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ void test_sleep(void)
263263
timer.start();
264264
timeout.attach_callback(mbed::callback(sem_callback, &sem), delay_us);
265265

266-
bool deep_sleep_allowed = sleep_manager_can_deep_sleep();
266+
bool deep_sleep_allowed = sleep_manager_can_deep_sleep_test_check();
267267
TEST_ASSERT_FALSE_MESSAGE(deep_sleep_allowed, "Deep sleep should be disallowed");
268268
while (sem.wait(0) != 1) {
269269
sleep();
@@ -322,7 +322,7 @@ void test_deepsleep(void)
322322
timer.start();
323323
timeout.attach_callback(mbed::callback(sem_callback, &sem), delay_us);
324324

325-
bool deep_sleep_allowed = sleep_manager_can_deep_sleep();
325+
bool deep_sleep_allowed = sleep_manager_can_deep_sleep_test_check();
326326
TEST_ASSERT_TRUE_MESSAGE(deep_sleep_allowed, "Deep sleep should be allowed");
327327
while (sem.wait(0) != 1) {
328328
sleep();

TESTS/mbed_hal/lp_ticker/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ void lp_ticker_deepsleep_test()
130130
* tick_count + TICKER_INT_VAL. */
131131
lp_ticker_set_interrupt(tick_count + TICKER_INT_VAL);
132132

133-
TEST_ASSERT_TRUE(sleep_manager_can_deep_sleep());
133+
TEST_ASSERT_TRUE(sleep_manager_can_deep_sleep_test_check());
134134

135135
while (!intFlag) {
136136
sleep();

TESTS/mbed_hal/rtc/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ void rtc_sleep_test_support(bool deepsleep_mode)
7474

7575
timeout.attach(callback, DELAY_4S);
7676

77-
TEST_ASSERT(sleep_manager_can_deep_sleep() == deepsleep_mode);
77+
TEST_ASSERT(sleep_manager_can_deep_sleep_test_check() == deepsleep_mode);
7878

7979
while (!expired) {
8080
sleep();

TESTS/mbed_hal/sleep_manager/main.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ using namespace utest::v1;
2525

2626
void sleep_manager_deepsleep_counter_test()
2727
{
28-
bool deep_sleep_allowed = sleep_manager_can_deep_sleep();
28+
bool deep_sleep_allowed = sleep_manager_can_deep_sleep_test_check();
2929
TEST_ASSERT_TRUE(deep_sleep_allowed);
3030

3131
sleep_manager_lock_deep_sleep();
32-
deep_sleep_allowed = sleep_manager_can_deep_sleep();
32+
deep_sleep_allowed = sleep_manager_can_deep_sleep_test_check();
3333
TEST_ASSERT_FALSE(deep_sleep_allowed);
3434

3535
sleep_manager_unlock_deep_sleep();
36-
deep_sleep_allowed = sleep_manager_can_deep_sleep();
36+
deep_sleep_allowed = sleep_manager_can_deep_sleep_test_check();
3737
TEST_ASSERT_TRUE(deep_sleep_allowed);
3838
}
3939

TESTS/mbed_hal/sleep_manager_racecondition/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ void sleep_manager_multithread_test()
5555
t2.join();
5656
}
5757

58-
bool deep_sleep_allowed = sleep_manager_can_deep_sleep();
58+
bool deep_sleep_allowed = sleep_manager_can_deep_sleep_test_check();
5959
TEST_ASSERT_TRUE_MESSAGE(deep_sleep_allowed, "Deep sleep should be allowed");
6060
}
6161

@@ -83,7 +83,7 @@ void sleep_manager_irq_test()
8383
timer.stop();
8484
}
8585

86-
bool deep_sleep_allowed = sleep_manager_can_deep_sleep();
86+
bool deep_sleep_allowed = sleep_manager_can_deep_sleep_test_check();
8787
TEST_ASSERT_TRUE_MESSAGE(deep_sleep_allowed, "Deep sleep should be allowed");
8888
}
8989

TESTS/mbedmicro-rtos-mbed/systimer/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ void test_deepsleep(void)
313313

314314
lptimer.start();
315315
st.schedule_tick(TEST_TICKS);
316-
TEST_ASSERT_TRUE_MESSAGE(sleep_manager_can_deep_sleep(), "Deep sleep should be allowed");
316+
TEST_ASSERT_TRUE_MESSAGE(sleep_manager_can_deep_sleep_test_check(), "Deep sleep should be allowed");
317317
while (st.sem_wait(0) != 1) {
318318
sleep();
319319
}

hal/mbed_sleep_manager.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "mbed_error.h"
2222
#include "mbed_debug.h"
2323
#include "mbed_stats.h"
24+
#include "us_ticker_api.h"
2425
#include "lp_ticker_api.h"
2526
#include <limits.h>
2627
#include <stdio.h>
@@ -183,6 +184,19 @@ bool sleep_manager_can_deep_sleep(void)
183184
return deep_sleep_lock == 0 ? true : false;
184185
}
185186

187+
bool sleep_manager_can_deep_sleep_test_check()
188+
{
189+
const uint32_t check_time_us = 2000;
190+
const ticker_data_t *const ticker = get_us_ticker_data();
191+
uint32_t start = ticker_read(ticker);
192+
while ((ticker_read(ticker) - start) < check_time_us) {
193+
if (sleep_manager_can_deep_sleep()) {
194+
return true;
195+
}
196+
}
197+
return false;
198+
}
199+
186200
void sleep_manager_sleep_auto(void)
187201
{
188202
#ifdef MBED_SLEEP_TRACING_ENABLED

platform/mbed_power_mgmt.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,17 @@ void sleep_manager_unlock_deep_sleep_internal(void);
122122
*/
123123
bool sleep_manager_can_deep_sleep(void);
124124

125+
/** Check if the target can deep sleep within a period of time
126+
*
127+
* This function in intended for use in testing. The amount
128+
* of time this functions waits for deeps sleep to be available
129+
* is currently 2ms. This may change in the future depending
130+
* on testing requirements.
131+
*
132+
* @return true if a target can go to deepsleep, false otherwise
133+
*/
134+
bool sleep_manager_can_deep_sleep_test_check(void);
135+
125136
/** Enter auto selected sleep mode. It chooses the sleep or deeepsleep modes based
126137
* on the deepsleep locking counter
127138
*

0 commit comments

Comments
 (0)