找回密码
 立即注册
搜索
0赞
赞赏
手机版
扫码打开手机版
把文字装进口袋

使用MicroPython在Raspberry Pi上通过双核编程的多线程控制LED

清凉一夏啊沼 2022-8-3 11:16:43
在本教程中,我们将使用 MicroPython在 Raspberry Pi Pico 上通过双核编程的多线程控制两个 LED
        到目前为止,我们已经了解了如何连接OLED、LCD、伺服、超声波传感器,并且我们已经实现了I2CADC、与 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文件。
       
  1. 从机器进口销
  2. 导入 utime
  3. 导入_thread
复制代码

        首先,我们需要从上面提到的 machine.py 库中导入Pin() 类。在我们之前的教程中,我们已经多次使用机器库,希望您现在熟悉机器库。然后我们需要导入“utime”库来使用pico的内部时钟。我们正在使用“_thread”库来使用 raspberry pi pico 社区制作的线程函数。
       
  1. led1 = Pin(16, machine.Pin.OUT)
  2. led2 = Pin(15, machine.Pin.OUT)
  3. sLock = _thread.allocate_lock()
复制代码

        在上面的代码中,我使用“Pin(16, machine.Pin.OUT)”和“Pin(15, machine.Pin.OUT)”函数将 GPIO15 和 GPIO16 的两个 LED 初始化为 OUPUT 。“_thread.allocate_lock()”函数可用于为两个线程提供信号量锁。如果想详细了解这个函数,可以参考“_thread”库的文档。
       
  1. 定义核心任务():
  2.     而真:
  3.         sLock.acquire()
  4.         print("进入第二个线程")
  5.         utime.sleep(1)
  6.         led2.high()
  7.         print("Led 2 开启")
  8.         utime.sleep(2)
  9.         led2.low()
  10.         print("Led 2 关闭")
  11.         utime.sleep(1)
  12.         print("从第二个线程退出")
  13.         utime.sleep(1)
  14.         sLock.release()
  15. _thread.start_new_thread(CoreTask, ())
复制代码

        我们将在单线程的另一个内核中使用“CoreTask()”函数。在函数内的 while 循环中,我们使用信号量锁来保持线程,直到它完成。然后我将 led2 调高 1 秒钟,然后在 Thonny 的输出端打印指令。然后我在线程完成时释放信号量锁。“_thread.start_new_thread(CoreTask, ())”函数将启动线程。该函数将目标函数名作为第一个参数。在我的例子中,它是“CoreTask”,它在第二个参数中接受参数。就我而言,我没有任何要传递的论点。
       
  1. 而真:
  2.     # 我们获取信号量锁
  3.     sLock.acquire()
  4.     print("进入主线程")
  5.     led1.toggle()
  6.     utime.sleep(0.15)
  7.     print("Led 1 开始切换。")
  8.     print("退出主线程")
  9.     utime.sleep(1)
  10.     # 我们释放信号量锁
  11.     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 秒闪烁。您可以参考下面的视频了解更多详情。
        代码
        主文件
       
  1. 进口机
  2. 导入 utime
  3. 导入_thread
  4. led1 = machine.Pin(16, machine.Pin.OUT)
  5. led2 = machine.Pin(15, machine.Pin.OUT)
  6. sLock = _thread.allocate_lock()
  7. 定义核心任务():
  8.     而真:
  9.         sLock.acquire()
  10.         print("进入第二个线程")
  11.         utime.sleep(1)
  12.         led2.high()
  13.         print("Led 2 开启")
  14.         utime.sleep(2)
  15.         led2.low()
  16.         print("Led 2 关闭")
  17.         utime.sleep(1)
  18.         print("从第二个线程退出")
  19.         utime.sleep(1)
  20.         sLock.release()
  21. _thread.start_new_thread(CoreTask, ())
  22. 而真:
  23.     # 我们获取信号量锁
  24.     sLock.acquire()
  25.     print("进入主线程")
  26.     led1.toggle()
  27.     utime.sleep(0.15)
  28.     print("Led 1 开始切换。")
  29.     utime.sleep(1)
  30.     print("退出主线程")
  31.     utime.sleep(1)
  32.     # 我们释放信号量锁
  33.     sLock.release()
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

使用道具 举报

您需要登录后才可以回帖 立即登录
不错!顶LZ
2022-8-4 13:26:52
感觉不错
2022-8-5 15:37:01
路过还不错
2022-8-6 09:19:04
很不错的哦,支持,加油
2022-8-7 03:01:06
还是看不懂,复杂
2022-8-7 23:00:24
学习一下!十分感谢
2022-8-8 18:59:41
2022-8-10 07:10:45
学习一下!十分感谢
2022-8-12 06:05:21
路过还不错
2022-8-14 04:59:57
返回顶部