在本教程中,我们将使用 MicroPython在 Raspberry Pi Pico 上通过双核编程的多线程控制两个 LED 。
到目前为止,我们已经了解了如何连接OLED、LCD、伺服、超声波传感器,并且我们已经实现了I2C、ADC、与 Raspberry Pi Pico 的蓝牙通信。RP2040微控制器pico 板具有双核。如果您不熟悉多线程执行,那么请考虑一下您的计算机系统。它可以同时执行多个程序,这些程序可以由一个操作系统使用多线程来运行。但是我们在 Raspberry Pi Pico 上没有任何操作系统来控制 CPU 周期,它只能支持每个内核一个线程,在这种情况下是两个。
Raspberry Pi Pico 上双核编程所需的组件
您需要确保拥有以下组件来演示 Pico 板上的双核编程。
树莓派 Pico
LED x2
电阻器 x2(330 欧姆)
面包板
连接电线
使用 Raspberry Pi Pico 板的伺服电机威廉希尔官方网站 图
伺服电机的威廉希尔官方网站 图就是这么简单。我已经分别使用两个 330 欧姆电阻与 GPIO15 和 GPIO16 连接了两个 LED。LED 的接地引脚已连接到 Pico 板的接地引脚。

使用双核编程在 Raspberry Pi Pico 上进行多线程
您需要克隆我们的Raspberry Pi Pico 教程GitHub 存储库。然后打开“ T9_DualCore_Program_PIco”文件夹。在此文件夹中,您可以找到“代码”文件夹。在Thonny编辑器中打开“main.py” python 文件。现在,让我们讨论一下main.py文件。
从机器进口销 导入 utime 导入_thread
首先,我们需要从上面提到的 machine.py 库中导入Pin () 类。在我们之前的教程中,我们已经多次使用机器库,希望您现在熟悉机器库。然后我们需要导入“ utime”库来使用pico的内部时钟。我们正在使用“_thread”库来使用 raspberry pi pico 社区制作的线程函数。
led1 = Pin(16, machine.Pin.OUT) led2 = Pin(15, machine.Pin.OUT) sLock = _thread.allocate_lock()
在上面的代码中,我使用“Pin(16, machine.Pin.OUT)”和“Pin(15, machine.Pin.OUT)”函数将 GPIO15 和 GPIO16 的两个 LED 初始化为 OUPUT 。“ _thread.allocate_lock() ”函数可用于为两个线程提供信号量锁。如果想详细了解这个函数,可以参考“_thread”库的文档。
定义核心任务():
而真:
sLock.acquire()
print("进入第二个线程")
utime.sleep(1)
led2.high()
print("Led 2 开启")
utime.sleep(2)
led2.low()
print("Led 2 关闭")
utime.sleep(1)
print("从第二个线程退出")
utime.sleep(1)
sLock.release()
_thread.start_new_thread(CoreTask, ())
我们将在单线程的另一个内核中使用“ CoreTask() ”函数。在函数内的 while 循环中,我们使用信号量锁来保持线程,直到它完成。然后我将 led2 调高 1 秒钟,然后在 Thonny 的输出端打印指令。然后我在线程完成时释放信号量锁。“ _thread.start_new_thread(CoreTask, ()) ”函数将启动线程。该函数将目标函数名作为第一个参数。在我的例子中,它是“ CoreTask ”,它在第二个参数中接受参数。就我而言,我没有任何要传递的论点。
而真:
# 我们获取信号量锁
sLock.acquire()
print("进入主线程")
led1.toggle()
utime.sleep(0.15)
print("Led 1 开始切换。")
print("退出主线程")
utime.sleep(1)
# 我们释放信号量锁
sLock.release()
在上面的 while 循环中,我们类似地使用了另一个信号量锁,以便主线程继续运行直到它完成。它将切换 led1,然后释放信号量锁。现在,在 Thonny IDE中,打开 “main.py” 文件。首先, 通过按键盘上的 “ctrl+shift+s”键将“main.py”文件保存在 Pico 板上 。在保存文件之前,请确保您的 Pico 板已连接到您的笔记本电脑。保存代码后,会出现一个弹出窗口,如下图所示。您必须首先 选择 Raspberry Pi Pico,然后 将文件命名为“main.py”并保存。 此过程使您能够在 Pico 打开时运行程序。

当您在 Pico 板上上传并运行代码时,您会看到连接到 GPIO16 的 led1 以 1.15 秒的延迟切换。但是连接到 GPIO15 的 led2 会延迟 2 秒闪烁。您可以参考下面的视频了解更多详情。
代码
主文件
进口机
导入 utime
导入_thread
led1 = machine.Pin(16, machine.Pin.OUT)
led2 = machine.Pin(15, machine.Pin.OUT)
sLock = _thread.allocate_lock()
定义核心任务():
而真:
sLock.acquire()
print("进入第二个线程")
utime.sleep(1)
led2.high()
print("Led 2 开启")
utime.sleep(2)
led2.low()
print("Led 2 关闭")
utime.sleep(1)
print("从第二个线程退出")
utime.sleep(1)
sLock.release()
_thread.start_new_thread(CoreTask, ())
而真:
# 我们获取信号量锁
sLock.acquire()
print("进入主线程")
led1.toggle()
utime.sleep(0.15)
print("Led 1 开始切换。")
utime.sleep(1)
print("退出主线程")
utime.sleep(1)
# 我们释放信号量锁
sLock.release()
全部0条评论
快来发表一下你的评论吧 !