tests/ports/rp2: Add a test case for light sleeping from CPU1.
Not currently passing. This work was funded through GitHub Sponsors. Signed-off-by: Angus Gratton <angus@redyak.com.au>
This commit is contained in:
committed by
Damien George
parent
03da15575f
commit
977fd94856
54
tests/ports/rp2/rp2_lightsleep_thread.py
Normal file
54
tests/ports/rp2/rp2_lightsleep_thread.py
Normal file
@@ -0,0 +1,54 @@
|
||||
# Verify that a thread running on CPU1 can go to lightsleep
|
||||
# and wake up in the expected timeframe
|
||||
import _thread
|
||||
import time
|
||||
import unittest
|
||||
from machine import lightsleep
|
||||
|
||||
N_SLEEPS = 5
|
||||
SLEEP_MS = 250
|
||||
|
||||
IDEAL_RUNTIME = N_SLEEPS * SLEEP_MS
|
||||
MAX_RUNTIME = (N_SLEEPS + 1) * SLEEP_MS
|
||||
MAX_DELTA = 20
|
||||
|
||||
|
||||
class LightSleepInThread(unittest.TestCase):
|
||||
def thread_entry(self, is_thread=True):
|
||||
for _ in range(N_SLEEPS):
|
||||
lightsleep(SLEEP_MS)
|
||||
if is_thread:
|
||||
self.thread_done = True
|
||||
|
||||
def elapsed_ms(self):
|
||||
return time.ticks_diff(time.ticks_ms(), self.t0)
|
||||
|
||||
def setUp(self):
|
||||
self.thread_done = False
|
||||
self.t0 = time.ticks_ms()
|
||||
|
||||
def test_cpu0_busy(self):
|
||||
_thread.start_new_thread(self.thread_entry, ())
|
||||
# CPU0 is busy-waiting not asleep itself
|
||||
while not self.thread_done:
|
||||
self.assertLessEqual(self.elapsed_ms(), MAX_RUNTIME)
|
||||
self.assertAlmostEqual(self.elapsed_ms(), IDEAL_RUNTIME, delta=MAX_DELTA)
|
||||
|
||||
def test_cpu0_sleeping(self):
|
||||
_thread.start_new_thread(self.thread_entry, ())
|
||||
time.sleep_ms(MAX_RUNTIME)
|
||||
self.assertTrue(self.thread_done)
|
||||
self.assertAlmostEqual(self.elapsed_ms(), MAX_RUNTIME, delta=MAX_DELTA)
|
||||
|
||||
def test_cpu0_also_lightsleep(self):
|
||||
_thread.start_new_thread(self.thread_entry, ())
|
||||
time.sleep(0.050) # account for any delay in starting the thread
|
||||
self.thread_entry(False) # does the same lightsleep loop, doesn't set the done flag
|
||||
self.assertTrue(self.thread_done)
|
||||
# only one thread can actually be in lightsleep at a time to avoid races, so the total
|
||||
# runtime is doubled by doing it on both CPUs
|
||||
self.assertAlmostEqual(self.elapsed_ms(), IDEAL_RUNTIME * 2, delta=IDEAL_RUNTIME)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user