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

news2024/11/17 6:31:19

  在国产的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://www.coloradmin.cn/o/611883.html

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

相关文章

SpringBoot 使用validator进行参数校验(实例操作+注意事项+自定义参数校验)

一、实例操作 ①、引入依赖 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.4.Final</version></dependency> ②、创建实体类 package com.springboot.entity;im…

蓝桥杯2022年第十三届决赛真题-出差

题目描述 A 国有 N 个城市&#xff0c;编号为 1 . . . N。小明是编号为 1 的城市中一家公司的员工&#xff0c;今天突然接到了上级通知需要去编号为 N 的城市出差。 由于疫情原因&#xff0c;很多直达的交通方式暂时关闭&#xff0c;小明无法乘坐飞机直接从城市 1 到达城市 N&a…

【教学类-10-03】20230603《空心图案3*2-单元格不重复》( 随机图案拼贴)(中班主题)

作品展示&#xff1a; 背景需求&#xff1a; 最近在做小课题结题资料&#xff0c;看到之前做过的几个学具项目&#xff0c;其中的空心图案拼贴画很不错&#xff08;中班上学期做过&#xff09;想到中6班的孩子还没有玩过&#xff0c;就想再打印一套学具&#xff08;中班下学期…

chat聊天系统消息消费时遇到的问题及优化思路(二)

1、前言 考虑下面几个条件下如何提升kafka的消费速度 消息要求严格有序&#xff0c;如chat聊天消息业务处理速度慢&#xff0c;如处理一条数据需要100ms分片不合理&#xff0c;如有的分区很闲&#xff0c;有的分区消息数量积压 2、解决方案 1、顺序问题 关于消息消费时存在…

leetcode701. 二叉搜索树中的插入操作(java)

二叉搜索树中的插入操作 leetcode701. 二叉搜索树中的插入操作题目描述 递归解题解题思路代码演示 二叉树专题 leetcode701. 二叉搜索树中的插入操作 原题链接&#xff1a; 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problem…

保护您的邮件安全:Exchange Reporter Plus 助您全面监控与审计

引言&#xff1a; 在当今数字化时代&#xff0c;电子邮件已成为我们日常生活和工作中不可或缺的沟通工具。然而&#xff0c;随着电子邮件的广泛使用&#xff0c;邮件安全也成为一个备受关注的议题。为了保护组织的敏感信息和防止数据泄露&#xff0c;我们需要一种强大的解决方…

go 并发/并行/协程/sync锁读写锁

下面来介绍几个概念&#xff1a; 进程/线程&#xff1a; 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。线程是进程的一个执行实体&#xff0c;是 CPU 调度和分派的基本单位&#xff0c;它是比进程更小的能独立运行的基本单位。一…

APO AI一款基于GPT-4.0的AI聊天工具

APO AI APO AI是一款为用户提供AI聊天机器人功能的软件&#xff0c;用户在这里可以免费使用ChatGP3.5和ChatGPT4.0&#xff0c;这里的用户可以和AI机器人自由聊天&#xff0c;非常有趣的人工智能对话&#xff0c;并且AI还能代替你写文章、脚本、代码、文案等等。 测试GPT4.0 …

python数据可视化--matplotlib库

目录 python数据可视化--matplotlib库0、前言1、饼图2、直方图3、折线图4、散点图5、柱状图6、箱线图7、极坐标图8、步阶图9、谱图10、功率密度图11、相干谱图 python数据可视化–matplotlib库 0、前言 在进行数据分析的过程中&#xff0c;正所谓“一图胜千言”&#xff0c;一…

java并发编程:重排序与happens-before介绍

文章目录 什么是重排序&#xff1f;顺序一致性模型与JMM的保证数据竞争与顺序一致性顺序一致性模型JMM中同步程序的顺序一致性效果JMM中未同步程序的顺序一致性效果 happens-before什么是happens-before?天然的happens-before关系 什么是重排序&#xff1f; 计算机在执行程序…

代码随想录算法训练营第四十八天|198.打家劫舍|213.打家劫舍II|337.打家劫舍III

LeetCode198.打家劫舍 动态规划五部曲&#xff1a; 1&#xff0c;确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[i]。 2&#xff0c;确定递…

【初识Spring框架】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. Spring框架是什么&#xff1f; 2. IOC 容器…

[Flink] Flink On Yarn(yarn-session.sh)启动错误

在Flink上启动 yarn-session.sh时出现 The number of requested virtual cores for application master 1 exceeds the maximum number of virtual cores 0 available in the Yarn Cluster.错误。 版本说明&#xff1a; Hadoop&#xff1a; 3.3.4 Flink&#xff1a;1.17.1 问题…

锐捷AC的部署实例

进行锐捷AC部署时&#xff0c;遇到了一些问题&#xff0c;遂记录下来&#xff0c;如若大家在项目过程中遇到类似问题可以对照解决。 写在前面&#xff08;锐捷AC的基础配置&#xff09; ac-controller //配置AC的capwap源地址信息&#xff0c;国家码等…

[操作系统]1.计算机系统概述

写在前面:这篇是为了复习基础知识准备的,而不是根据学校的教材走的,所以叙述有些出入的地方请见谅,该系列旨在快速梳理操作系统的基础知识和一些常见的问题点,知识框架来自于王道操作系统,后续有机会的话会继续补充 1.操作系统的基本概念 一个计算机系统可以自上而下分成四个…

go 流媒体服务搭建-01

这里写自定义目录标题 go 流媒体服务搭建-01 go 流媒体服务搭建-01 新建go 项目&#xff0c;配置go 版本1.19 新增main.go package mainfunc main() {}新增go.mod 文件 go mod init mym7s导入m7s 主包 go get m7s.live/engine/v4查看go.mod 文件 发现下载了一段的依赖包&…

2023年面试工具篇Postman面试题及答案

1. 说下你对Postman的了解&#xff1f; Postman是一种接口调试与http接口测试的工具。我们可以非常方便的用来模拟get或者post或者其他方式的请求来调试和测试接口。 Postman 的优点 •支持各种的请求类型: get、post、put、patch、delete 等 •支持在线存储数据&#xff0c;…

如果你当架构师,从0开始,如何做一个后台项目的架构?

前言 在40岁老架构师 尼恩的读者社群(50)中&#xff0c;很多小伙伴要拿高薪&#xff0c;这就要面试架构师&#xff0c;要完成架构的升级&#xff0c;进入架构赛道。 在架构师的面试过程中&#xff0c;常常会遇到下面的问题&#xff1a; 如果给你一个项目要你从0到1做架构&…

Python入门教程+项目实战-13.2节-集合的操作方法

目录 13.2.1 集合的常用操作方法 13.2.2 集合的查找 13.2.3 集合的添加 13.2.4 集合的删除 13.2.4 集合运算 13.2.5 知识要点 13.2.6 系统学习python 13.2.1 集合的常用操作方法 集合类型是一种抽象数据类型&#xff0c;抽象数据类型定义了数据类型的操作方法&#xff…

怎么把投票链接生成二维码投票链接怎么生成二维码

用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。 而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&#xff0c;很多用户都很喜欢“活动星投票”这款软件。 “活动星投票”小程序在…