如何在Zynq SoC 上使用“中断”

如何在Zynq SoC 上使用“中断”,第1张

在嵌入式处理中,中断表示暂时停止处理器的当前活动。处理器会保存当前手迅的状态并执行中断服务例程,以便对引起毕基此中断的原因进行寻锋猛址。中断可能来自下列三个地方之一:

 硬件 – 直接连接处理器的电子信号

 软件 – 处理器加载的软件说明

 异常情况 – 发生错误或异常事件时处理器出现的异常情况!

设置时钟定时中断,首先设置时间定时器,定时器到期,产生信号,触发中断,执行中断处理函数。整体流程如下:

1.设置好sigevt信号事件相关(如何处理该信号,信号做标记

2.timer_creat() 创建定时器

3.timer_settime() 设置定时器相关信息

4.信号捕捉函数,捕捉到斗饥信号后,进行中断处理函数执行或其他

时钟定时器

POSIX定时器

POSIX 1003.16标准为用户态程序引入了一种新型软定时器,尤其是针对各线程和实时应用程序。这些定时器常被称作POSIX定时器。

要执行每个销虚POSIX定时器必须向用户态程序提供些亏销燃POSIX时钟,也就是说,虚拟时间源预定义了分辨度和属性。只要应用程序想使用POSIX定时器,它就创建一个新的定时器资源并指定一个现存的POSIX时钟来作为定时基准。表6-3列出了允许用户来处理POSIX时钟和定时器的一些系统调用。

在ZYNQ上使用gigE Vision协议的网络接口相机。

第一步:调通PS侧网口GEM0(Xilinx BSP默认配好)。

第二步:调通PS侧网口GEM1(见前一篇文档:开发笔记(1))。

第三步:调通PL侧网口(本文阐述)。

第四步:在PL侧网口上验证Jumbo Frame特性,并在应用层适配gigE Vision协议。

根据《xapp1082》可知,PL侧的PHY支持1000Base-X和SGMII两种配置,这两种配置对应两种不同的PHY引脚接口(连接到MAC)。而我们的hdf文件使用的是1000Base-X的配置。

关于网口的Linux驱动,我们在官网找到一份资料: Xilinx Wiki - Zynq PL Ethernet 。资料很长,我们只看与我们相关的2.4.1 PL Ethernet BSP installation for 1000Base-X”这一章节就可以了。

首先导入FPGA设计同事提供的hdf文件:散衡

在d出的图形界面里,进入Subsystem AUTO Hardware Settings——Ethernet Settings——Primary Ethernet,确认可以看到PL侧网络设备axi_ethernet_0,说明hdf文件里已包含了必要的网口硬件信息:

上图中被选中的网口将成为Linux上的设备eth0。这里我们默认选择ps7_ethernet_0,即使用GEM0作为首选网口。

启用Xilinx AXI Ethernet驱动

进入Device Drivers -- Network device support – 选中Xilinx AXI Ethernet(以及Xilinx Ethernet GEM,这是PS侧网口的驱动)

进入Networking support – 选中 Random ethaddr if unset

进入Device Drivers -- Network device support -- PHY Device support and infrastructure – 启用Drivers for xilinx PHYs

进入~~~~Device Drivers -- DMA Engine Support -– 禁用~~~~Xilinx AXI DMAS Engine~~~ (陵伏对应的配置项名为 ~~ CONFIG_XILINX_DMA ~~~)

注意: Xilinx Wiki里对设备树节点的引用有误(&axi_ethernet),导致编译报错,应改为&axi_ethernet_0。

注:PL-ETH驱动所在路径:<project>/build/tmp/work-shared/plnx_arm/kernel-source/drivers/net/ethernet/xilinx/xilinx_axienet_main.c和xilinx_axienet_mdio.c。对应的内核配置项为CONFIG_NET_VENDOR_XILINX和CONFIG_XILINX_AXI_EMAC。

启用ethtool和tcpdump(调试用,非必须):

然后将生成的BOOT.BIN和image.ub拷贝到SD卡根目录下,将SD卡插入板子上,上电运行。

上电后,使用ifconfig eth1查看网口信息,观察MAC地址与设置的一致,且ifconfig eth1 192.168.1.11 up没有报尺掘携错。

测试网络通路:ping PC是通的。说明网口工作正常。

Linux下eth1(即PL-ETH)的MAC地址有误

问题描述:

开机打印:

注意:

MAC地址是错的,驱动里解析出的是GEM0的MAC地址。

试验发现,即使在system-user.dtsi里不写local-mac-address,也照样解析出的是GEM0的MAC。

而将system-user.dtsi里的local-mac-address改名为pl-mac-address,并将驱动里解析的字符串也对应更改为pl-mac-address,则可以正确解析出来:

Passing MAC address to kernel via Device Tree Blob and U-Boot:

http://zedboard.org/content/passing-mac-address-kernel-device-tree-blob

通过更改u-boot环境变量和设备树,为每个板子设置一个独特的MAC地址:

https://www.xilinx.com/support/answers/53476.html

U-Boot里的环境变量ethaddr会覆盖掉设备树里pl-eth的local-mac-addr字段,从而影响Linux启动后的网卡MAC地址;

但U-Boot里的环境变量ipaddr不会对Linux启动后的配置产生任何影响。因为设备树里根本就没有关于IP地址的配置。

phy-mode怎么会是sgmii?查了下官方的提供的BSP里,也是“sgmii”。说明这个没问题。具体原因不清楚。

@TODO: 设备树里的中断号的顺序如何影响功能?

为何读出来的IRQ号不对呢?这是因为这里读到的不是硬件的中断号,而是经过系统映射之后的软件IRQ number。两者不具有线性关系。

关于中断号的疑问:

Linux上的网口eth0、eth1的顺序,似乎是按照phy地址从小到大来排布的。

Xilinx xapp1082-zynq-eth.pdf (v5.0) July 16, 2018

https://www.xilinx.com/support/documentation/application_notes/xapp1082-zynq-eth.pdf

Xilinx Wiki - Zynq PL Ethernet:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841633/Zynq+PL+Ethernet

Xilinx Wiki - Linux Drivers:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841873/Linux+Drivers

Xilinx Wiki - Linux Drivers - Macb Driver:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841740/Macb+Driver

Xilinx Wiki - Zynq Ethernet Performance:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841743/Zynq+Ethernet+Performance

查到关于Jumbo frame MTU的定义,当前值为9000,可否改大一些?

驱动源码里关于jumbo frame的说明:

设置MTU为9000,发现ping包最大长度只能设为ping 192.168.1.10 -s 1472

https://lore.kernel.org/patchwork/patch/939535/

【完】


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12357306.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存