05使用Overlay库和python父子进程实现开发板按键控制LED灯流水或熄灭
前言
前四篇文章完成后,其实整个项目就能完整运行起来了。但我们似乎忘了使用PYNQ的初心——用python编程实现对开发板硬件部分的控制。因此,本文章使用PYNQ Overlay库的GPIO读写实现LED灯流水,然后使用python父子进程的多进程编程实现按键即关闭程序。
一、PYNQ Overlay库的GPIO读写实现LED灯流水
这里就是借由PYNQ的Overlay库,使用python来控制硬件设备的读写。代码注释已经尽我所能写得很详细了。注意如果 overlay.axi_gpio_0 处报错,可能是vivado硬件设计时忘了加上AXI_GPIO模块或者位宽设置不正确,此时需要修改硬件文件并重新按前面文章制作、烧录一遍镜像!(报错原因也可能是其它的,具体问题具体分析)
from pynq import Overlay
import os
import time
# 导入overlay库(此处的.bit文件即为前面vivado工程导出的bit文件)
overlay=Overlay('./design_1.bit')
# vivado工程时设置了gpio0是控制LED灯的,gpio1是控制按键的
led = overlay.axi_gpio_0
key = overlay.axi_gpio_1
print("gpio start!")
# 代表每个LED灯灭时的输入
states=[1,2,4,8]
state=0
# 初始时让四个LED灯全亮
led.write(0x00,15)
while 1:
# 每轮灭一个LED灯,达到流水效果
led.write(0x04,states[state%4])
state=state+1
time.sleep(0.5)
# 0:未按 1:按下;如果读取到按键不是0,则代表按键被按下
if not key.read(0x00):
print("stopping...")
break;
# 检测到按键被按下后,LED灯全灭
led.write(0x00,0)
# 获取本进程的pid号
pid=os.getpid()
print(f"key.py stop.pid:{pid}")
程序运行时,LED灯流水效果:
二、python父子进程实现按键即关闭程序
上面只实现了按键使灯停止,还没有将按键与关闭程序联动起来。个人对于父子进程的理解都写在了代码注释中,有理解不对的地方还请指正。
import os
import time
import psutil
# 关闭此进程及其所有的递归子进程
def kill_process(pid):
# 创建指定进程号的对象
parent_proc = psutil.Process(pid)
# 查找此进程所有的子进程及它们的递归子进程,全部杀死
for child_proc in parent_proc.children(recursive=True):
child_proc.kill()
# 杀死本进程
parent_proc.kill()
# 创建一个新进程,该新进程为control.py进程的子进程
# 在父进程内,参数pid的值是子进程的pid;在子进程内,参数pid的值是0
# 因此可用参数pid的值区别父子进程,从而进行多进程编程
pid=os.fork()
# 父进程执行内容
if(pid!=0):
print(f"key进程编号{os.getpid()}")
time.sleep(1)
# 运行key.py文件
os.system("sudo python key.py")
print("parent_pid_end")
# key.py文件运行结束后(说明按键被按下),完全杀死该进程
kill_process(os.getpid())
exit(0)
# 子进程执行内容
if not pid:
print("请在1秒后,10秒内输入密码欸:")
time.sleep(10)
print("开始运行检测程序:")
print(f"face进程编号{os.getpid()}")
# 运行faceDetect.py文件
os.system("python faceDetect.py")
按下key1按键后,LED灯全部熄灭,程序停止:
总结
至此,基于Xilinx ZYNQ7000的PYNQ框架的人脸识别项目的内容就介绍完毕啦!想回顾整个项目全貌
的请看第一篇文章:【基于Xilinx ZYNQ7000的PYNQ框架项目】01人脸识别项目介绍与展示。第一次写技术博客,有出错的地方还请大家多多指正!~
您的关注、点赞与收藏,是我持续创作优秀博客的最大动力!
本项目系列文章:
【基于Xilinx ZYNQ7000的PYNQ框架项目】01人脸识别项目介绍与展示
【基于Xilinx Zynq7000的PYNQ框架项目】02 PYNQ镜像制作