嵌入式人工智能(29-基于树莓派4B的按键中断--多线程实现)_树莓派使用按钮控制程序终止进行-CSDN博客
嵌入式人工智能ESP32(3-定时器与外部中断)-CSDN博客
1、多线程
多线程我们已经做过一次实验了,通过按键中断呼吸灯的运行。如果不用多线程,那么在实验中发现按键不灵敏,有时按下并不能中断呼吸灯的运行。为什么?因为按键按下触发的低电平判断只是一瞬间,而这一瞬间CPU在呼吸灯的time.sleep里面,没有腾出时间去判断,而等到CPU有时间判断了,发现按键已经抬起了。说着说着,突然有种伤感,人生总是由于错过而充满遗憾,令人嗟嘘。
但有了多线程就不一样了,它并不是等一个线程执行完了,再去执行另一个线程,而是采用并发执行的操作,同时执行2个线程,就是说同时做2个事情。在呼吸灯sleep里,CPU在另一个线程里面一直等待按键的按下,只要按键按下,立刻中断呼吸灯的线程。这个很像中断,在ESP32里面,我们也通过中断实现按键中断LED灯闪烁的效果,中断是硬件,也是解决问题的一种方式。
在micropython的官方文档里面显示出该多线程模块是高度实验的,没有相关案例参考。我们自己写点意思下。
import _thread
import time
def test1(*args, **kwargs):
for i in range(10):
print("任务1...%d" % i)
time.sleep(0.1)
def test2(*args, **kwargs):
for i in range(5):
print("任务2...%d" % i)
time.sleep(0.2)
t1 = _thread.start_new_thread(test1,(1,))
t2 = _thread.start_new_thread(test2,(2,))
(1)可以看出和标准的Python库还有有一些不一样的,它导入的库名为_thread。
(2)多线程的执行是随机的,但CPU执行分配同样的时间片,那么耗时短的程序会先执行完。
如果是一直循环执行,那么每个线程CPU分配的时间是一样的,这样占用CPU时间少,但又比较重要的事情就会频繁的去做,可以达到软实时监控的要求,但相比较硬件中断还是要实时性差点。(线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。 )
(3)补充 python中*args和**kwargs的解释,这个具体用法不在本文赘述。
*args和**kwargs:属于可变参数
*args会将传入的参数放入名为args的元组中
**kwargs会将传入的关键字参数放入名为kwargs的字典中
如果函数没有参数可以这样写。如果有参数的情况可以参考:
import _thread
import time
def test1(num):
for i in range(num):
print("任务1...%d" % i)
time.sleep(0.1)
def test2(num):
for i in range(num):
print("任务2...%d" % i)
time.sleep(0.2)
t1 = _thread.start_new_thread(test1,(3,))
t2 = _thread.start_new_thread(test2,(6,))