|
| 1 | +# Verify that a thread running on CPU1 can go to lightsleep |
| 2 | +# and wake up in the expected timeframe |
| 3 | +import_thread |
| 4 | +importtime |
| 5 | +importunittest |
| 6 | +frommachineimportlightsleep,Pin |
| 7 | + |
| 8 | +N_SLEEPS=5 |
| 9 | +SLEEP_MS=250 |
| 10 | + |
| 11 | +IDEAL_RUNTIME=N_SLEEPS*SLEEP_MS |
| 12 | +MAX_RUNTIME= (N_SLEEPS+1)*SLEEP_MS |
| 13 | +MAX_DELTA=20 |
| 14 | + |
| 15 | + |
| 16 | +classLightSleepInThread(unittest.TestCase): |
| 17 | +defthread_entry(self,is_thread=True): |
| 18 | +for_inrange(N_SLEEPS): |
| 19 | +lightsleep(SLEEP_MS) |
| 20 | +ifis_thread: |
| 21 | +self.thread_done=True |
| 22 | + |
| 23 | +defelapsed_ms(self): |
| 24 | +returntime.ticks_diff(time.ticks_ms(),self.t0) |
| 25 | + |
| 26 | +defsetUp(self): |
| 27 | +self.thread_done=False |
| 28 | +self.t0=time.ticks_ms() |
| 29 | + |
| 30 | +deftest_cpu0_busy(self): |
| 31 | +_thread.start_new_thread(self.thread_entry, ()) |
| 32 | +# CPU0 is busy-waiting not asleep itself |
| 33 | +whilenotself.thread_done: |
| 34 | +self.assertLessEqual(self.elapsed_ms(),MAX_RUNTIME) |
| 35 | +self.assertAlmostEqual(self.elapsed_ms(),IDEAL_RUNTIME,delta=MAX_DELTA) |
| 36 | + |
| 37 | +deftest_cpu0_sleeping(self): |
| 38 | +_thread.start_new_thread(self.thread_entry, ()) |
| 39 | +time.sleep_ms(MAX_RUNTIME) |
| 40 | +self.assertTrue(self.thread_done) |
| 41 | +self.assertAlmostEqual(self.elapsed_ms(),MAX_RUNTIME,delta=MAX_DELTA) |
| 42 | + |
| 43 | +deftest_cpu0_also_lightsleep(self): |
| 44 | +_thread.start_new_thread(self.thread_entry, ()) |
| 45 | +time.sleep(0.050)# account for any delay in starting the thread |
| 46 | +self.thread_entry(False)# does the same lightsleep loop, doesn't set the done flag |
| 47 | +self.assertTrue(self.thread_done) |
| 48 | +# only one thread can actually be in lightsleep at a time to avoid races, so the total |
| 49 | +# runtime is doubled by doing it on both CPUs |
| 50 | +self.assertAlmostEqual(self.elapsed_ms(),IDEAL_RUNTIME*2,delta=IDEAL_RUNTIME) |
| 51 | + |
| 52 | + |
| 53 | +if__name__=="__main__": |
| 54 | +unittest.main() |