52 lines
993 B
Python
52 lines
993 B
Python
|
|
# Ensure that disabling IRQs creates mutual exclusion between threads
|
||
|
|
# (also tests nesting of disable_irq across threads)
|
||
|
|
import machine
|
||
|
|
import time
|
||
|
|
import _thread
|
||
|
|
|
||
|
|
if not hasattr(machine, "disable_irq"):
|
||
|
|
print("SKIP")
|
||
|
|
raise SystemExit
|
||
|
|
|
||
|
|
count = 0
|
||
|
|
thread_done = False
|
||
|
|
|
||
|
|
|
||
|
|
def inc_count():
|
||
|
|
global count
|
||
|
|
a = machine.disable_irq()
|
||
|
|
try:
|
||
|
|
count += 1
|
||
|
|
i = 0
|
||
|
|
while i < 20:
|
||
|
|
b = machine.disable_irq()
|
||
|
|
try:
|
||
|
|
count += 1
|
||
|
|
count -= 1
|
||
|
|
i += 1
|
||
|
|
finally:
|
||
|
|
machine.enable_irq(b)
|
||
|
|
finally:
|
||
|
|
machine.enable_irq(a)
|
||
|
|
|
||
|
|
|
||
|
|
def inc_count_multiple(times):
|
||
|
|
for _ in range(times):
|
||
|
|
inc_count()
|
||
|
|
|
||
|
|
|
||
|
|
def thread_entry(inc_times):
|
||
|
|
global thread_done
|
||
|
|
inc_count_multiple(inc_times)
|
||
|
|
thread_done = True
|
||
|
|
|
||
|
|
|
||
|
|
_thread.start_new_thread(thread_entry, (1000,))
|
||
|
|
inc_count_multiple(1000)
|
||
|
|
|
||
|
|
time.sleep(1)
|
||
|
|
|
||
|
|
print("count", count, thread_done)
|
||
|
|
if count == 2000:
|
||
|
|
print("PASS")
|