基于国产器件的KCF跟踪算法实现与验证

  在国产的FT-M6678 DSP上实现KCF算法是我研究生期间的主要工作,KCF算法的原理与实现已经在之前的文章以及我的Gitee仓库中有部分介绍。这里主要介绍DSP与上位机通信的方式,以及XDMA Linux驱动的使用。具体的设计细节可以看我的毕业设计补充材料。

SRIO与PCIe桥接器

  如果只考虑实现DSP与上位机通信,设计硬件的时候就完全可以将DSP的PCIe接口与上位机连接。但我所用的硬件平台实际上是DSP与FPGA通过SRIO连接,FPGA与上位机通过PCIe连接,所以我就在FPGA里做了一个接口转换的功能。实现数据在SRIO接口与PCIe接口之间的传输,这一设计我称之为“SRIO与PCIe桥接器”。

在这里插入图片描述

  图中的SRIO IP对外与DSP采用SRIO链路互连,XDMA对外提供PCIe接口与上位机互连。桥接器提供了AXI4-Lite slave接口,可以通过配置寄存器来控制它工作。XDMA在实例化的时候勾选上AXI4-Lite接口,上位机就可以直接通过Lite接口控制桥接器;DSP想要控制桥接器工作可以通过EMIF总线接口实现。

在这里插入图片描述

  我另外设计了EMIF与AXI4-Lite接口转换器,使DSP可以通过简单的存储器访问操作实现对桥接器的控制。使用的时候需要按照特定的步骤来实现读写操作。地址线额外采用一个bit来区分读操作和写操作。比如存在地址空间[0,A-1], 则往地址[0,A-1]写就是一般的写,往地址[A,2A-1]写则是发起读请求。根据不同的地址范围解析从地址FIFO输出的地址,来确定将地址发往AW通道或是AR通道。通过EMIF接口读写AXI4-Lite寄存器的操作如下所示:

  • 读寄存器
uint32_t readReg(uint32_t *addr){while(地址FIFO满); // 等待地址FIFO非满*((uint32_t *)((uint32_t)(addr) + offset)) = 0; // 写地址while(读数据FIFO空); // 等待读数据FIFO非空return *(addr); // 读数据
}
  • 写寄存器
void writeReg(uint32_t *addr, uint32_t val){while(地址FIFO满); // 等待地址FIFO非满*addr = val; // 写数据
}

桥接器的具体功能

  1. 向DSP发送门铃事务包或SW事务包;
  2. 接收DSP发送过来的门铃事务包或NW事务包;
  3. 收到的门铃是事务包可以直接转发至PC,向上位机发起MSI中断;
  4. 发送的SW事务包的数据源可以源于FPGA的片内外存储器或者XDMA的H2C通道;
  5. 接收的NW事务包数据可以存入FPGA的片内外存储器或者发往XDMA的C2H通道。

数据传输过程

  有了FPGA上的硬件支持,DSP与上位机之间的数据传输通路才能得以建立。目前数据的交互都是由DSP来主动控制的,也可以采用上位机控制,但我没有做。

DSP向上位机发送数据

  DSP首先通过EMIF接口配置桥接器的工作模式,令它将收到的NW事务包转发至XDMA的C2H通道。DSP接着发送门铃事务包,桥接器转发至上位机,上位机解析门铃信息,启动C2H通道传输。从而实现数据从DSP到上位机的流式传输。

DSP从上位机接收数据

  DSP首先发送门铃事务包,桥接器转发至上位机。上位机解析门铃信息后发起H2C的DMA通道传输,与此同时DSP通过EMIF接口启动桥接器发送SW事务包,同时SW事务包的数据源于H2C通道。从而实现数据从上位机到DSP的流式传输。

数据传输速率测试

  对多种不同的数据量做了传输速率测试,每种数据量多次实验。得到下图结果:

在这里插入图片描述

  数据的传输时间与数据量的关系可以建模为线性关系,即 y = k x + b y=kx+b y=kx+b。其中斜率 k k k表示数据传输速率 v v v的倒数,即 v = 1 / k v=1/k v=1/k b b b表示数据传输固有的时间开销。图中横纵坐标都采用对数坐标系,描点,绘制趋势线后可以对测试点线性拟合,得到的结果表明实际的数据传输速率都在1 GB/s左右。

XDMA Linux驱动使用

  Xilinx在Github上提供了XDMA配套的Linux驱动源码,而且也给出了具体的使用方式,但是实际使用过程中也有一些需要注意的细节在这里记录一下。

驱动编译

  驱动编译需要先切换到xdma目录下,再编译。readme.txt里提示是用make install,但install驱动的过程是需要管理员权限的,因此需要加上sudo。编译过程如下:

sudo make install

在这里插入图片描述

设备识别

  在加载驱动前可以先用lspci查看一下PCI设备。

在这里插入图片描述

  图里的Xilinx Corporation Device 7028就是我们在FPGA里实例化XDMA IP后,由上位机识别到的PCI设备。这里的“7028”是在Vivado里设置的。

在这里插入图片描述

  如果lspci看不到对应的Xilinx设备,那么大概率就是硬件问题了,得检查一下硬件电路是否有问题或者FPGA烧写是否到位。

加载驱动

  加载驱动用的就是tests目录下的load_driver.sh。记得把这个脚本的第21行device_id的设置与前面的设备ID一致再运行这个脚本。

# device_id=903f
device_id=7028

  加载驱动过程中也有可能会出错,遇到出错了也不要紧,可以用dmesg查看内核打印输出的信息,大概率都能找到问题的原因。

dmesg

对驱动源码的修改

  DMA通道的配置寄存器所在的BAR位置是会变化的,驱动识别PCIe外设的过程是依次读取不同BAR空间特定地址的数据来判断该BAR空间是不是DMA配置空间(config BAR)

在这里插入图片描述

  libxdma.c里有一个identify_bars的函数就是识别每个BAR具体的功能。我在Vivado里勾选了XDMA的AXI4-Lite功能,就是如上图中红框中的配置。但是这个驱动里的is_config_bar函数没有识别到BAR1就是config BAR。
  虽然这让人很疑惑,但是我后来发现可以提前指定config BAR的位置,就是在libxdma.h里放开XDMA_CONFIG_BAR_NUM的注释,并且指定config BAR的number为1。然后驱动就可以识别到BAR1是config BAR,而BAR0可以用identify_bars函数来识别。

软件调用

  加载驱动成功后会显示这样的结果。

在这里插入图片描述

  驱动加载完成后会在/dev/目录下生成几个xdma开头的设备文件,对这些文件的读写就能够转换为数据传输操作。而这些加载驱动时生成的文件都是需要管理员权限才能访问的,因此需要用chmod改变它们的读写权限,让所有人都能读写。

#define H2C_DEV_NAME "/dev/xdma0_h2c_0"
#define C2H_DEV_NAME "/dev/xdma0_c2h_0"
#define CTRL_DEV_NAME "/dev/xdma0_control"
#define USER_DEV_NAME "/dev/xdma0_user"
#define EVENT_DEV_NAME "/dev/xdma0_events_0"

  我用到的几个设备文件主要是上面的。h2c和c2h分别是H2C的DMA传输和C2H的DMA传输,control对应到电路上就是AXI4-Lite接口,user对应到电路上是DMA Bypass的接口。events文件是用来响应MSI中断的。具体使用细节可以看代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352690.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Latex符号大全

Latex符号大全 符号名字显示latex语句点乘 ⋅ \cdot ⋅cdot艾普西隆 ϵ / ε \epsilon/\varepsilon ϵ/εepsilon/varepsilon空 ∅ \varnothing ∅varnothing连接 ⋈ \bowtie ⋈bowtie约等于 ≈ \approx ≈approx上划线 A ‾ \overline{A} A\overline{A}西格玛 σ \sigma σ\s…

hive中如何计算字符串中表达式

比如 select 1(2-3)(-4.1-3.1)-(4-3)-(-3.34.3)-1 col ,1(2-3)(-4.1-3.1)-(4-3)-(-3.34.3)-1 result \ 现在的需求式 给你一个字符串如上述col 你要算出result。 前提式 只有和-的运算,而且只有嵌套一次 -(4-3)没有 -(-4(3-(31)))嵌套多次。 第一步我们需要将运…

测试并整理的 Airpods Pro 刻字可用的最全特殊符号

天气符号 ☉ 文化符号 卍卐 办公室符号 № ℗ ℡ ℀ ℅ ™ © ‰ 技术符号 ⇧  打勾符号 ˇ ∨ √ 人的符号 ♀ ♂ ヅ ツ 星星符号 ☆ ★ ✽ 箭头符号 ↖ ↗ ↘ ↙ ↸ ↹ ⇦ ⇧ ⇨ ⇩ ↓ ← → ↑ 图形符号 ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋▋▌▍▎ ▏▓ ▔ ■ □ …

msvcp110.dll丢失怎么修复(一键修复办法)

msvcp110.dll是C编程中非常重要的库文件之一。它实现了运行时库的大部分功能,并提供了许多标准库和其他功能的具体实现,如多线程编程和IO操作等。提高程序的运行效率和稳定性。下面是详细解决msvcp110.dll丢失问题的方法跟msvcp110.dll文件的介绍。 msvc…

python数据分析学习笔记之matplotlib、numpy、pandas

为了学习机器学习,在此先学习以下数据分析的matplotlib,numpy,pandas,主要是为自己的学习做个记录,如有不会的可以随时查阅。希望大家可以一起学习共同进步,我们最终都可以说:功不唐捐&#xff…

SpringBoot自定义starter之接口日志输出

文章目录 前言文章主体1 项目全部源码2 项目结构介绍3 starter 的使用3.1 配置文件 application,yml的内容3.2 启动类3.3 控制器类 4 测试结果 结语 前言 本文灵感来源是一道面试题。 要求做一个可以复用的接口日志输出工具,在使用时引入依赖,即可使用。…

allure报告中如何让测试步骤更清晰

一、allure step测试用例步骤说明 allure step编写测试用例有两种方式 1、with allure.step()用在测试用例中 公共方法代码: # common_fucntion.py import allure import pytest from common.tools.log_util import LoggerrunlogLogger().get_log流程性的用例&a…

ABIDE Preprocessed 结构态MRI数据集介绍及下载

ABIDE数据集介绍及下载 ABIDE Prerocessed项目是在ABIDE I 项目的基础上发展而来,主要是对ABIDE I中采集到的原始数据进行了一定的预处理和初步的特征提取。针对于fMRI和sMRI数据有着不同的处理方式,本次主要对其中提供的sMRI预处理结果进行介绍&#xf…

聊聊TCP协议的粘包、拆包以及http是如何解决的?

目录 一、粘包与拆包是什么? 二、粘包与拆包为什么发生? 三、遇到粘包、拆包怎么办? 解决方案1:固定数据大小 解决方案2:自定义请求协议 解决方案3:特殊字符结尾 四、HTTP如何解决粘包问题的&#xf…

2013年终总结

年终感悟: 2013年就这样过去了,每个人都一样,使用了自己一年生命药水,要知道这种药品是花多少钱都买不来的。现在回头看看,我用这一瓶药水都做了那些事情。在这一年里,有过欢笑,有过悲伤。到了年…

控制算法工程师的工作职责(合集)

控制算法工程师的工作职责1 职责: 1、准确地控制密闭容器的气体或液体的压力,以供校准其他压力表使用; 2、准确地控制温度场的精度,以供校准其他温度计使用; 3、根据不同的控制方案和执行机构/加热制冷方式;测试其特性、建立数学模型、设计算…

SpringCloudAlibaba 微服务生态

一 微服务架构 1.1 微服务 微服务其实是一种架构风格,我们在开发一个应用的时候这个应用应该是由一组小型服务组成,每个小型服务都运行在自己的进程内;小服务之间通过HTTP的方式进行互联互通。 1.2 微服务架构的常见问题 一旦采用微服务系…

【正点原子STM32连载】 第二十六章 USMART调试组件实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第二十…

Prosys OPC UA Modbus Server,一个modbus转opcua的服务器软件

Prosys OPC UA Modbus Server是prosys公司发布的一个modbus转opcua服务的软件。 他们的OPC UA 模拟器软件你肯定听说过,软件是免费的。 这个软件是面向企业收费的,需要License,试用版只能运行2小时,不过作为测试使用也足够了。 作用&#…

避坑之网上下单的手机流量卡为什么老是失败!

最近有一些小伙伴们反应:在网上下单的手机流量卡,经常提示下单失败,不是这问题就是那问题的。 对于小伙伴们的诉求,小编向来是来者不拒的。今天就为大家整理一下下单失败的四大原因。 失败原因一:下单信息填写错误 下…

Swift 周报 第三十期

文章目录 前言新闻和社区App、App 内购买项目和订阅即将实行税率调整码出新宇宙Apple 公证服务更新Apple 设计大奖入围名单公布 提案通过的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组自主整理周报的第二十一期,每个模块已初步成型。各位读者…

Flutter的菜鸟教程一:第一个Flutter应用

2019/1/3留(别再问了昂,之前忘了发出来): Flutter SDK 官网 Dart 官网 Flutter是什么? 跨平台(Android/ios)构建移动应用程序的简单高效方式 Flutter核心只有一层轻量的C/C代码,而上层使用了Dart语言(一种现代的、简洁的、面向对象的语言-ps:我没学直…

Flex 布局语法教程

flex-wrap属性 布局的传统解决方案,基于盒状模型,依赖 display属性 position属性 float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 ps:面试的时候也经常会问到一些 一、Flex布局是什么? F…

tomcat的部署

文章目录 一、什么是tomcat二、Tomcat 功能组件结构三、Tomcat 请求过程四、Tomcat的服务部署五、配置虚拟主机六、Tomcat多实例部署 一、什么是tomcat Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件…

SpringBootWeb案例-1(下: 来源黑马程序员)

3. 员工管理 完成了部门管理的功能开发之后,我们进入到下一环节员工管理功能的开发。 基于以上原型,我们可以把员工管理功能分为: 分页查询带条件的分页查询删除员工新增员工修改员工 3.1 分页查询 3.1.1 基础分页 3.1.1.1 需求分析 我…