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:
Angus Gratton
2024-12-18 16:27:48 +11:00
committed by Damien George
parent 03da15575f
commit 977fd94856

View 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()