【应该不可能会有人看到吧= =】

前言

尝试记录下大懒人学习一项新技能时的心路历程,看能不能为后续新技能学习提供一个方法论

介绍

以学习zynq嵌入式开发作为主线= =

自评

记性有点差、注意力过剩,容易被很多东西吸引;好奇心强,容易被自己的兴趣所驱动

记录说明

以下记录评论下自己学习历程,尝试对自己学习的过程做个总结。
发表在这的原因是:“这里发表可能会有人看到”,再这样的情况下记录可能会勤快些,可以获得虚无的激励(虽然不会有人看),持续更新,可能逻辑会比价乱,但我会不断优化的。
以之前经验推测接下来心路历程为:
①基础艰难期
最容易放弃的时期,主要因素如下:
1、不知道看什么资料,资料看什么好
2、没有学习框架,学习不知道从哪入手,学习线路如何,容易走歪路,把时间浪费在没必要的地方
3、学习效率慢导致容易气馁,由于初次学习技能时,总会遇到许多问题,而且是奇奇怪怪的问题,一般原因是老手一般不会那么操作
4、怕事,不知道什么可以做什么不可以做,或者总遇到知识盲区,不敢继续开展下去
…待补充
②脚踏实地期
能够对技能进行一些基本操作,拥有最基础的知识框架或者技能框架,这个阶段进步最快。这时候已经可以根据网络资料开展大部分工作,只是效率会慢。

记录

基础艰难期

i 亦步亦趋

目前学习zynq还是基于黑金开发板配套的资料,跟着教程走了几个例程,感觉挺没意思的,我对zynq开发只是按部就班,理解仅浮于表面,或许可以增加对工具的熟练度吧…
我在思考,它们刚开始是如何上手zynq开发的
于是尝试不看黑金资料,自己搭建代码:

ii 有点浮躁,改变思路

先前也有一定知识储备,能够搭建PL端硬件平台,因此重心主要放在如何通过PS端使用硬件平台,

过程中遇到的问题:

①PS端与硬件平台的关系,或者说PS端如何控制硬件平台的,共分两部分(内容可能不全,有待补充)
1、PS和FPGA
主要有GP口,HP口,时钟,中断和MIO
2、PS和外部管脚
有EMIO和DDR接口,通过BLOCK DESIGN可以定义PS的外部引脚如何使用,可以定义成以太网、flash、USB、spi等接口。
②PS端如何控制这些接口
1、每个接口都占用着ARM的地址,个人认为,总线或者端口的使用一般就是对地址对应的数据进行读取或者赋值
2、如何控制接口,即如何读取与赋值,当在硬件平台定义这个接口时,xilinx很贴心的在SDK的BSP工程里头提供了这个接口例程,如果里头没有,VIVADO安装路径内也可以会找到相关接口的例程
3、这个例程如何使用,例程内部有详细的注解,不知道是不是我没有stm32库函数开发基础,这里显得没有头绪且非常吃力,可能还是不太熟练,里头可能有些规律或者嵌入式开发者习以为常的东西我还没适应吧(后续理解待补充)
③如何开发PS端工程,或者说SDK如何操作,这个软件的框架如何
1、目前看过SDK和VITIS,这VITIS相对于SDK目前接触到的区别就是硬件平台的管理,SDK多个工程可能有多个BSP工程,但VITIS做了统一管理
2、忽略这两个平台差异,一个PS裸机开发首先需要PL端生成的平台文件,然后是板级支持包,一些库,还有用户代码(个人理解),平台文件和板级支持包都可以自动生成,因此我们主要关注如何通过代码调用这些库函数(或者寄存器)。
④知识体系问题,获取的资料太多,导致无从下手
1、稍微整理了下,目前开发zynq涉及到:zynq utrascle+ 芯片——《ds891-zynq-ultrascale-plus-overview》、芯片ps核配置与使用——《pg201-zynq-ultrascale-plus-processing-system》、 pl端开发(已掌握)、vitis工具使用——《ug1400-vitis-embedded-zh-cn-2022.2》、嵌入式(当前学习目标仅裸机)软件开发——《ug1137-zynq-ultrascale-mpsoc-swdev-en-us-2022.2》、xilinx嵌入式设计方法指南——《ug1228-ultrafast-embedded-design-methodology-guide.pdf》
2、由于缺少ARM开发方面知识,学习zynq开发路线参考黑金科技的教程走,以实操为主

iii 尝试自己开发一个小项目

感觉还是有点浮躁,可能是预备知识不充足导致的吧,那就把开发板内的双目图像通过以太网上传到上位机把!边实战边学习或许能更有动力些。开发板用的是黑金的AXU2CGB
①摄像头接口:黑金给的资料是真的足,有摄像头的和接口的,但这不重要思虑了下,这方面并不是主线任务,为了保留学习的激情,此处先跳过,把他当成黑盒子,输出stream-axi即可(axi总线分为axi、axi-lite、axi-stream。axi总线读写异步,突发传输用于数据传输;axi-lite相对于stream一次只能发送一个地址数据,主要用于控制;axi-stream协议简单,fpga工程时最喜欢这个接口)
②vdma-IP:看着数据手册pg020(ps:IP核手册可以在建立ip核时点击左上角documentation查看和下载,当然也可以去官网搜,不得不说xilinx的手册详细的让人敬佩,这应该就是他占据fpga市场主导的一部分原因吧),xilinx-ip手册规范很近似,Designing with the Core讲述IP核运行原理,Design Flow Steps讲述IP核GUI具体如何配置,Example Design讲述具体设计实例
③:vdma&&以太网传输大致流程:
1、vdma一共可以缓存3帧数据,存完一帧数据进入中断,更新状态并锁定写的帧号(以免写到当前读的帧),和标记要发送的帧号WriteOneFrameEnd[] = N;({N|0,1,2})
2、以太网循环检测状态满足发送条件(有新的帧,并且处于未被发送状态)进行发送,发送完毕后更改状态为已发送WriteOneFrameEnd[] = -1;
④上位机图像获取和显示:
不知道为啥,黑金给的软件无法识别,问过工作人员说防火墙关闭,板卡没发数据,IP不对,我都排查了,还是不行。干脆自己写了个python显示脚本,用cv2和socket库和numpy库,教程上的控制报文似乎有点问题,于是我对着 vitis工程修改了下,图像能正常显示,代码如下,代码不是很美观请见谅,懒得修饰了233

import socket
import time
import math
import numpy as np

import cv2

# IP地址和端口号设置
server_ip = '192.168.1.42'
server_port = 8080
delay = 1100

# 指令
hex_data = 'FE00020002000A350001020301'
star_byte_data = bytes.fromhex(hex_data)
hex_data = 'FE00020002000A350001020300'
stop_byte_data = bytes.fromhex(hex_data)

# buff
figrue_packet_num = math.ceil((800 * 600 * 3) / 1440)
left_figure = []
left_figure_temp = []
next_cnt_left = 0

# cv2
cv2.namedWindow("UDP Video", cv2.WINDOW_NORMAL)
cv2.resizeWindow("UDP Video", 800, 600)

# state
continue_mode = True

# 创建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定套接字到服务器地址和端口号
sock.bind((server_ip, server_port))
# 设置发送缓冲区大小
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10 * 1024 * 1024)  # 10MB

# 设置接收缓冲区大小
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 10 * 1024 * 1024)  # 10MB

def init():
    if continue_mode:
        hex_data = 'FE000200030100'
    else:
        hex_data = 'FE000200030000'

    delay = '{:04x}'.format(int(input('输入延迟值')))

    set_delay_code = hex_data + delay
    byte_data = bytes.fromhex(set_delay_code)

    sock.sendto(byte_data, ('192.168.1.56', server_port))

    sock.sendto(star_byte_data, ('192.168.1.56', server_port))


def change_delay(key):
    if key == ord('z'):  # 如果按下 'z' 键
        hex_data = 'FE000200030000'
        delay = '{:04x}'.format(int(input('输入延迟值')))
        set_delay_code = hex_data + delay
        byte_data = bytes.fromhex(set_delay_code)
        sock.sendto(byte_data, ('192.168.1.56', server_port))


def set_ready():
    hex_data = 'FE000200030001'
    set_delay_code = hex_data + delay
    byte_data = bytes.fromhex(set_delay_code)
    sock.sendto(byte_data, ('192.168.1.56', server_port))
    print('set_ready')


init()

while True:
    if not continue_mode:
        set_ready()

    # 接收数据
    data, addr = sock.recvfrom(1490)
    decimal = np.frombuffer(data, dtype=np.uint8);

    hand_data = decimal[0:8]
    packet_num = hand_data[5] * 2 ** 16 + hand_data[6] * 2 ** 8 + hand_data[7]
    part_data = decimal[8:]
    # print(hand_data[5:8])
    print(packet_num)

    if np.array_equal(hand_data[0:5], [255, 0, 2, 0, 2]):
        if packet_num == 1:
            left_figure_temp = part_data
            next_cnt_left = 2
        elif next_cnt_left == packet_num:
            if next_cnt_left == figrue_packet_num:
                left_figure = np.concatenate((left_figure_temp, part_data), axis=0)
                # left_figure = cv2.imdecode(left_figure, cv2.IMREAD_COLOR)
                left_figure2 = left_figure.reshape(600, 800, 3)
                # 显示图像
                cv2.imshow("UDP Video", left_figure2)

                left_figure_temp = []
                next_cnt_left = 0
                # print('last')
            else:
                left_figure_temp = np.concatenate((left_figure_temp, part_data), axis=0)
                next_cnt_left = next_cnt_left + 1
                print('continue')
                print(next_cnt_left)

    key = cv2.waitKey(1) & 0xFF

    if key == 27:  # 如果按下 'Esc' 键
        print("按下了 'Esc' 键,程序中断")
        sock.close()
        break

    change_delay(key)
# 关闭套接字
sock.close()

⑤其实我还有另一块开发板k7 的(xc7k325t),上面有两个千兆以太网口,phy用的rgmii接口,感觉这板子是抄黑金的但我没有证据,教程不是很完善,但是比较便宜,我用黑金的例程做了下适配,目前可以正常运行,包含arp,icmp,udpip,还算挺全的,接下来打算获取网口发送的数据进行处理,最近工作有点累,先暂停下吧

过程中遇到的问题:

①首先,花了很大时间来看lwip,学习视频非常长(野火stm32的),倍速看的,看了但没完全看,因为很多概念不懂,而且很多可能理解的东西,但这些东西都是片段的无法联系,导致即使看了视频也很难记忆和无从下手。没事不pua自己,学不下就学不下呗,跟着实际代码来,实际代码结合视频,我找到了ps以太网传输的函数并且了解如何发送和接收,在联系黑金教程和查看库函数实现,大概了解如何操作vitis内部工程。到这种程度我觉得应该也够了,后续有深入使用再说吧,毕竟我的积极性有限
②由于嵌入式开发基础不是很扎实,就直接走到应用了,项目开展十分卡顿,比如说中断如何实现,之前没有弄过,又要回头看中断原理,中断初始化
③对于自己工程项目开发不是很有信心,但项目开发和网上资料查询,发现所有vivadoip都有其对应的示例工程,我似乎有些入门了裸机开发流程。工作中也有涉及到ipi开发,工作加实践,感觉我对vitis裸机开发的不自信的感觉开始减淡,或许学习过程中觉得难很大一部分原因是不熟练把,就像右手打羽毛球技术很好,知道什么姿势击球怎么发力,但换到左手还是各种打不中或者没力气
④加油吧,知道自己很平庸但积极性还是要维持的,毕竟还在坚持那就还未失败。网上好多大佬乐于分享,也会有很多大佬不上网展示技术,自己那点进步或许对别人来说不值一提,莫名的压力和失落…但我觉得现在处于某个瓶颈,如果跨过去会进入所谓的心流,学习效率会提高,哈哈幻想的,算给自己一个希望吧,希望未来不用那么焦虑,可以做自己喜欢的事,同时能够做些新的东西,让自己觉得自己没那么平庸

总结

多希望有个互助或者问题有偿回答的通用平台啊,实时的那种= =

希望不要被科技高速发展的洪流冲刷吧

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值