PYNQ开发板使用-上电启动不停复位

出于好奇买了PYNQ Z2开发板,因为前段时间看到Python已经成为一种嵌入式编程语言了。

了解了一下PYNQ开发板,实际上就是一片Xilinx 7000系列FPGA嵌入在一块有各种外设的开发板上,而关键在于PYNQ社区提供了一个叫做PYNQ Overlays的抽象层,它实际上是对平台设备驱动的进一步封装,在PYNQ板子启动之后创建的Python应用只需要导入“pynq”包就可以直接使用底层设备,下面两张图分别是对PYNQ Overlays的描述和在PYNQ上做嵌入式Python应用开发的实例:

import numpy as np
import pynq

def get_pynq_buffer(shape, dtype):
    """ Simple function to call PYNQ's memory allocator with numpy attributes

    """
    return pynq.allocate(shape, dtype)

buffer = get_pynq_buffer(shape=(4,4), dtype=np.uint32)
buffer

--------------------------------------------------------
输出
CMABuffer([[0, 0, 0, 0],
           [0, 0, 0, 0],
           [0, 0, 0, 0],
           [0, 0, 0, 0]], dtype=uint32)

【注】:对PS与PL端共享的块设备的一部分数据进行矩阵运算

正题开始:

现象描述:

买来板子之后插上已经具备镜像的SD卡,直接上电,然后我发现指示灯一直没有向用户说明上写的那样达到系统就绪的状态。然后打开串口查看打印信息,发现U-boot完成后,加载内核,加载到一半重新boot,陷入死循环。然后我用曾经用过的一个镜像烧写工具把商家给我的镜像重新往SD卡上烧了一遍。现象没有变化,甚至复位的位置都一样。后来去PYNQ的官网上找各种镜像版本,都烧了一遍,现象一致—_—。

故障猜测:

第一直觉是我板子上有个设备坏了,导致每次初始化到他都过不了,然后看门狗就给我复位了,所以我想找到PYNQ Z2的内核源码,自己修改一下,把可能坏掉的设备裁掉。不过太麻烦了,我就做了些别的实验。

早些时候也用过Xilinx的板子,我就随便用了个uImage把PYNQ的uImage给替换了,果然启动成功。并且使用Jupyter Notebook做了很多Python简单应用,只要不涉及平台硬件完全没有问题,但是一旦使用到文章开头那种需要导pynq包来调用外设的时候,就会报错,原因就是这个与平台不匹配的内核根本无法探测到平台设备。

故障定位:

我把之前无法正常加载的内核打印信息和成功加载的内核打印对比了一下:

左侧是加载失败的,右侧是加载成功的。前面的干的事儿都差不太多,发现到此处之后,能用的内核已经开始引导根文件系统了。设想一下官网上的多个镜像都不能正常引导文件系统,不太可能。所以可能是我制作SD卡的时候出现了点问题。

解决方案:

但是镜像烧写软件这种东西挺傻瓜的,我也没做什么操作。在查了一下其他人的做法之后,唯一的区别就是,用的SD卡制作工具不一样。。最终换了win32diskimager-1.0.0,来制作SD卡。一上电,就启动成功了。

难道商家卖给我板子之前,都没有用户反馈说他做的SD卡用不了么。实际上我也不知道为什么换个烧写工具就好用了,有懂的朋友,指点一下。

 

演示:

初步试用了一下使用Python语言操作与arm相连的FPGA,主要工作是在线更新FPGA的bit流文件,然后统计50次更新使用的时间

import os, warnings
from pynq import PL
from pynq import Overlay

if not os.path.exists(PL.bitfile_name):
    warnings.warn('There is no overlay loaded after boot.', UserWarning)
ol = Overlay(PL.bitfile_name)
ol.download()
ol.timestamp
#-------------
#输出'2019/9/30 9:20:33 +625650'
#-------------
PL.bitfile_name
#-------------
#输出'/usr/local/lib/python3.6/dist-packages/pynq/overlays/base/base.bit'
#-------------
ol.is_loaded()
#-------------
#输出True
#-------------

import time
import matplotlib.pyplot as plt

length = 50
time_log = []
for i in range(length):
    start = time.time()
    ol.download()
    end = time.time()
    time_log.append((end-start)*1000)

%matplotlib inline
plt.plot(range(length), time_log, 'ro')
plt.title('Bitstream loading time (ms)')
plt.axis([0, length, 0, 1000])
plt.show()

好像挺有意思的,会继续学习下去

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值