问题标签 [zynq]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1589 浏览

linux - 将 libgio.so 与 libz.so (linux) 链接时未解析的符号

短版

将我的可执行文件与几个库链接,包括 libgio-2.0.so.0.4800.1 (libgio-2.0.so) 和 libz.so.1.2.8 (libz.so),我得到两个未解析的符号 - deflateSetHeader@ZLIB_1.2.2 和膨胀GetHeader@ZLIB_1.2.2。libz.so 中没有定义任何符号,但 inflateGetHeader@@ZLIB_1.2.2 和 deflateSetHeader@@ZLIB_1.2.2 是:

libgio 中引用的其他符号被 libz 成功解析,但不是这两个。

长版

我正在从 Windows 主机(Xilinx SDK 2016.1 (Eclipse),工具链“arm-linux-gnueabihf”)交叉编译运行 32 位 Ubuntu 14.04 和 Linaro 4.4 内核的基于 Zynq 7010 的目标( krtkl.com ) .

主机和目标平台都给出了,以防你觉得有必要问我为什么这样做。

使用外部共享库的过程如下:在目标上下载、配置和构建库(除非目标上已经存在该库),然后将包含和库 (libabc.so.xyz) 文件复制到上的定制项目目录主机,将 libabc.so.xyz 重命名为 abc.so,并将库路径设置为项目目录,将库名称设置为 abc(即 gcc ... -L<project dir> -labc)。

我正在使用此过程将 GLib(以及其他)包含在我的项目中。GLib (libglib.so) 需要 GIO (libgio.so),而 GIO (libgio.so) 又需要(除其他外)ZLIB (libz.so)。

这些库是从源代码构建的:glib-2.48.1(包括 gio、gobject 和 gmodule)、libffi-3.2.1、zlib-1.2.8。其他来自 Ubuntu 发行版。

当我在 Windows 上运行交叉编译器(Eclipse 中的“Project|Build All”)时,一切都按计划进行 - libgio-2.0.so、libglib-2.0.so、gobject-2.0.so、libffi.so、libgmodule- 2.0.so、libdl.so、libpcre.so、libresolv-2.19.so 和 libz.so 满足除 deflateSetHeader@ZLIB_1.2.2 和 inflateGetHeader@ZLIB_1.2.2 之外的所有外部引用。

readelf 输出(见上文)显示了 libz.so 中可用的相似但不相同的符号。我在网上搜索时看到过一些类似问题的提及,但解决方法总是与查找 ZLIB 的过时版本有关——考虑到我的开发环境,这不可能。

libgio 和 libz 都是广泛使用的成熟库 - 这不可能是错误,对吧?

我没有想法 - 有没有人遇到过这个或类似的事情?

[更新]

gcc 版本 4.9.2 20140904(预发布)(crosstool-NG linaro-1.13.1-4.9-2014.09 - Linaro GCC 4.9-2014.09)

根据要求,以下是 Eclipse 发出的示例编译器和链接器命令:

0 投票
1 回答
4979 浏览

linux - 使用 mmap() 时如何避免缓存

我正在为我的 FPGA 中的设备编写 petalinux 驱动程序,并且我已经实现了 mmap 功能以控制用户空间中的设备。我的问题是,如果我正在使用

在用户应用程序的 mmap 函数和MAP_SHARED标志中,似乎启用了缓存。

我所做的测试是向我的映射设备的特定寄存器写入一个值(比如 5),该寄存器实际上只存储来自 AXI 总线的数据的最低有效位。如果我在写入操作后立即读取,我希望读取 1(在 Microblaze 上使用裸机应用程序时发生这种情况),而不是读取 5。但是,该值已正确写入寄存器,因为必须发生什么...... ..发生。

提前致谢。

0 投票
1 回答
1317 浏览

xilinx - Xilinx CDMA 的设备树中的寻址如何工作?

背景:

我想做的是能够从我的 ARM 处理器写入 Zynq 7000 上的 BRAM。

为此,我有以下组件:

==================================================== ========================

在我看来,这个设置应该做的是:

  1. 一旦从 ARM DMA 引擎提交事务,Zynq 将使用 GP0 通过 GP0 向 CDMA 控制器发送命令。

  2. CDMA 控制器将在其从 AXI_LITE 端口上接收命令,并解释通过 HP3 访问 RAM 的请求。

  3. CDMA 控制器将通过 axi_mem_intercon 移动数据,以便从 M01_AXI 上的 hp3 获取事务数据,并通过 M00_AXI 将其发送到 BRAM 控制器

  4. BRAM 控制器将接收 AXI-4 输入并将其转换为适当的 BRAM 端口,以将数据写入 blk_mem_gen_0 生成的 BRAM

  5. 完成此动作后,CDMA 会通过 sys_concat 发送中断,向 DMA Engine 指示其工作已完成。

将此 hdl 设计加载到 PL 结构后,我尝试通过内核模块将事务提交给 DMA 引擎。结果是超时,DMA 引擎显然永远不会完成任务。

==================================================== ========================

在我试图找出问题的过程中,我做了以下观察:

  1. 在尝试了超时的写入事务后,我尝试了对同一 DMA 通道的读取事务,但配置为读取数据。我得到的是我试图写入的所有数据。对我来说,这似乎表明 DMA 引擎正在写入某个地方,但没有识别出任务的完成

  2. 有问题的 BRAM 是双端口 RAM,另一个端口读取 BRAM 中的数据并切换 LED 以反映数据。当我尝试写入事务时,LED 没有切换,所以似乎 DMA 事务没有达到 BRAM

  3. 查看 cat /proc/interrupts 时,我可以看到几个中断,但不是 GIC 87。如前所述,我使用的中断线连接到 IRQ concat 块的输入 11。我可以确认到输入 12 的中断线确实对应于 /proc/interrupts 的 GIC 88,所以我相信我对我正在寻找的中断的理解是正确的。因此,由于某种原因,它没有在处理器上注册该中断。

==================================================== ========================

基于此,我相信我的这个 CDMA 的设备树条目是不正确的。

在 Vivado 中,我可以在地址编辑器中看到这些条目(为简洁起见,省略了一些条目):

我编写设备树条目的尝试如下:

在我在内核模块中添加此条目之前,甚至无法注册事务通道,现在它注册了,因此我相当确定内核至少接受了此条目以分配 DMA 通道。但是,我不太了解 devicetree 的工作原理,特别是寻址方式,所以我很有可能写错了,这就是我的交易没有成功的原因。谁能帮我纠正我的设计?}

0 投票
2 回答
413 浏览

embedded-linux - 在 Xillinux 上启用硬件 SPI

我有一块运行 Xillinux 1.3 的 MicroZed 板。我想将一个外部 SPI ADC 连接到它,并在 linux 中编写一个应用程序来从 ADC 读取值。Xillinux 中未启用 Zynq 设备的硬件 SPI 接口。我该如何启用它,我必须重新编译 FSBL 和 U-boot,但我不知道从哪里开始。我可以只修改 Xillinux 的 Vivado 设计并从那里开始,还是必须从头开始?

0 投票
1 回答
2260 浏览

linux-device-driver - 设备树中的简单帧缓冲区

我一直在尝试在设备上设置简单的帧缓冲区,但设备树出现问题。目前我的设置和文档中的差不多:

在启动期间,我得到的错误是:

从 simplefb 代码中,我看到它在以下方面失败:

一些互联网消息来源告诉我 IORESOURCE_MEM 是 reg 属性,它是被定义的,所以我对可能出现的问题感到困惑。

0 投票
0 回答
272 浏览

c - 在寄存器中发送一个浮点数

我在 sdk vivado 中用 c 代码编写软件,我有这个函数可以写入寄存器

如您所见,此函数的参数之一是Data,它是U32和 U32 表示:

我想在寄存器中发送一个浮点数。

就像这个数字 0.0807836f 一样,我做了什么,我将小数部分和小数部分分开并将它们发送到不同的寄存器。(然后我想使用其他函数从寄存器中读取,我可以将它们连接起来)

我的问题是当我将它们发送到寄存器时,小数部分是807836 ,它希望有0807836

我写了这段代码:

请帮助我如何发送像 0807836 这样的小数部分。

先感谢您

0 投票
1 回答
537 浏览

linux - Zynq 7000 上的嵌入式 Linux,丢弃几乎所有 UDP 数据包

我正在 Zynq 7000 板上使用 Xilinx 发行版的 Linux。它有两个 ARM 处理器、一些 L2 缓存、一个 DRAM 接口和大量 FPGA 结构。我们的设备收集由 FPGA 处理的数据,然后通过千兆网络将其发送到其他系统。

我们需要在此设备上支持的服务之一是 SNMP,它依赖于 UDP 数据报,虽然 SNMP 确实支持 TCP,但我们不能强制客户端使用它。

我发现这个系统正在丢失几乎所有的 SNMP 请求。

重要的是要注意网络和 CPU 都没有过载。数据速率不是特别高,CPU 的负载通常在 30% 左右。另外,我们为 SNMP 使用了 SNMP++ 和 Agent++ 库,所以我们可以控制它们,所以系统守护进程中断不是问题。但是,如果我们停止处理和网络活动,SNMP 请求不会丢失。SNMP 在其自己的线程中处理,我们确保请求很少且分散,以便在任何时候确实不应该有超过一个缓冲的请求。在 CPU 负载较低的情况下,上下文切换到接收进程以服务请求应该没有问题。

由于这不是 CPU 或以太网带宽问题,我最好的猜测是问题出在 Linux 内核上。尽管网络负载很低,但我猜测有限的网络堆栈缓冲区被过度填充,这就是它丢弃 UDP 数据报的原因。

谷歌搜索时,我找到了如何使用 netstat 报告丢失数据包的示例,但这似乎在这个系统上不起作用,因为没有“-s”选项。如何监控这些丢包?如何诊断原因?如何调整内核参数以最小化这种损失?

谢谢!

0 投票
0 回答
124 浏览

arm - 加载/存储寄存器的值与内存查看器不同

我正在开发一个在 Xilinx 的 QEMU 构建下运行的程序。这个问题被标记为,但我实际上是针对 QEMU 中的 Zynq MP,特别是 Cortex-R5。

我的背景是微控制器和 Cortex-M,所以这是一个很大的飞跃,并且有很多我不习惯的特性(MPU、AXI、额外缓存)。我正在编写一个驱动程序,该驱动程序正在访问其中一个硬外设(在低功耗域中)中的外设寄存器。我编写了一个函数,reginsert以简化访问这些寄存器中的位。

根本不是一个非常令人兴奋的功能。对我来说,这也很简单。

我这样调用函数:

附加信息:

在逐步执行代码时,我发现该函数正确地计算了寄存器的地址,0xFF000000当查看reg. 我还可以看到,单步执行寄存器r3加载了正确地址的程序集。

当执行达到:

拆解有:

我进去0x00000000r3。如果我使用内存视图,我可以看到它0xFF000000的值为0x00000114. 如果我查看变量视图,我可以看到它*reg具有相同的值 ( 0x00000114)。如果我进入屏蔽本地副本的行,然后写回,我最终会得到以下指令:

跳过这一点,我看到0x00000000应该写入的值(尽管不是正确的值),但该值实际上并没有改变(通过内存或变量视图)。在这些视图中的任何一个中,我都可以手动更改值并正确写入。

我不知道在这个 QEMU 版本中对 Zynq MP 的总线架构进行了多么彻底的仿真,但是芯片具有用于调试访问和处理器访问的单独内存端口,并且不通过 CPU 访问内存,所以有一个以不同方式映射事物的可能性。但是,Xilinx 演示代码确实可以适当地执行相同的操作。

所以,总结一下我的尝试:

  1. 验证反汇编应该从寄存器位置加载/存储。
  2. 逐步执行指令以验证 CPU 寄存器是否具有访问外设寄存器的正确值。
  3. 通过调试器直接访问内存和变量。
  4. 使用 Xilinx 代码验证 QEMU 模拟外设。
  5. 检查 MPU 设置(区域设置为非共享且无访问限制)

我不知道我还应该尝试什么,我基本上被难住了。看起来 QEMU,至少通过 gdb 接口,正确地模拟了外围寄存器,所以我认为 CPU 读/写相当简单。我感谢任何帮助、指示、提示等。有很多事情对我来说是新的,包括使用 QEMU 作为开发平台。

0 投票
1 回答
338 浏览

real-time - 如何使用freertos实时发送数据

我是编码界的新手,我需要你的帮助。我需要执行以下操作: 在 Zedboard 平台中,我从 USB 端口获取数据,并希望制作实时数据包并通过 TCP 发送它们。

我已经为此建立了 FreeRTOS。我从 UART 获取数据并将它们保存在循环缓冲区中。我从 Matlab 发送了一个 TCP 命令来开始传输,但这只给了我一个数据包。如何让这成为现实?

0 投票
1 回答
333 浏览

linux - 如何将文件放入 riscv linux?

ri 1.我们尝试在Zedboard上用risc-v linux安装rocket芯片,成功进入riscv linux。但是,我们无法将汇编程序编译的文件(使用指令:riscv64-unknown-linux-gnu-g++)放入riscv linux。有人能告诉我怎么放进去吗?(ps我们尝试将文件挂载到名为root.bin的文件中,但似乎risc-v linux不使用该文件启动。) 2.如果我们使用linux instrustion [make CONFIG=RoccExampleConfig] 在我们的车间,那里会是RoCC吗?如果没有,如何启用 RoCC?