TS101的链式DMA操作方法
最近在用TS101进行采集图像数据,需要将FPGA内建的双口RAM里的数据通过FLYBY的方式读到SDRAM里。这就要用到DMA了。
FLYBY这个东西是个好东西,可以通过DSP的总线在两个外设之间互传东西,而且不用占用DSP周期。但是DMA有一点点让人郁闷,就是只能用一次。不像从前用51的时候里面的那个定时器还有一个自动重装的模式,完全不用你管,每次计数满之后再装入初值。用TS101解决这个问题需要用到链式DMA。这个链式DMA比51里面的自动重装功能强大很多,但是却又麻烦很多,以至于我研究了差不多一天才研究出来怎么用。不过如果我英语好一点的话可能会快一点,一方面因为网上基本上没有人写这方面的文章,另一方面ADI是美国的公司,他不可能用中文写芯片资料。
好,废话不多说了,下面开始介绍方法。
要看这篇文章,要求您首先对TS101中DMA的TCB(传输控制块)寄存器有一定的了解。什么叫一定呢?就是你要知道每一位是做什么用的。如果在这篇文章里去介绍TCB的每一位是什么的话,那我还不如翻译一下ADI的datasheet。
下面先介绍一下链式DMA的工作过程:当DSP完成一次DMA传输时,TCB寄存器不会复原,所以,如果你不管的话,你只能进行一次DMA。而如果你使能了链式DMA的话(TCB_DP_22),这一次DMA传输完后就会从链指针寄存器(TCB_DP_0~14)所指向的地址里把下一个存有TCB配置参数的寄存器里把TCB读出来,并写到链目的通道(TCB_DP_17~21)上。基中还会遇到一个问题,就是选择链指针寄存器所指向的地址是哪一个存储器块里面的。这通过TCB_DP_15~16进行设置。那我哪知道程序把它存到哪里了?我等下再说限制的办法,这个办法可以做到你让一个变量存到哪个块的哪个地方,他就存到哪个块的哪个地方。
在做任何一件事时,无论是硬件还是软件,都要做一个需求分析。比如说,你要邮一封信,就要写清对方的地址,还要写清你的地址,再选择一个邮寄方式。缺少了任意一个都是不好的。好,那我们不邮信了,改成操作链式DMA了。就要知道,链式DMA的TCB_DP_0~14指向的是内存中的哪个地址、在哪一个块里。光取出东西够不够?不够,还要知道这个链要指向哪里,就是我把这个地址里的数据送到哪里去呢?这就要设置一下TCB_DP_17~21了。只有把这些都设完,头脑中才会出现一个完整的画面。其实,这些东西都是以一个最简单的方式存在的,你所要做的就是让程序知道你想要从哪里去哪里怎样去。
一开始,我对TCB_DP_0~14怎么设不知道,不知道这个地址怎么得到。后来知道了,在VDSP里,可以通过编辑LDF文件来实现对一变量存储位置的约束。具体的方法如下:
利用ulteredit或其它编译工具打开工程里面的LDF文件,找到MEMORY{…(表示里面有好多东西)},在里面加入一行:
TCB_DATA { TYPE( RAM) START(0x100000) END(0x100007) WIDTH(32) }
START(0x100000) END(0x100007)表示我的起始地址是在0x100000,这就是MEMORY BLOCK2。注意你这里用了一段地址,就要在前面重复的地方把这个地址减去,要不就重复了。如原来的:
M2Data { TYPE( RAM) START(0x00100000) END(0x0010ffff) WIDTH(32) }
就被我改成了后来这个样子:
M2Data { TYPE( RAM) START(0x00100008) END(0x0010ffff) WIDTH(32) }
这样说大家就明白了吧。
然后还要在SECTIONS{…}里加上这样几行:
TCB_DATA{
INPUT_SECTION_ALIGN(4)
INPUT_SECTIONS($OBJECTS(TCB_DATA))
}>TCB_DATA
然后呢,在程序里你就可以这样声明你的变量:
section("TCB_DATA") TCB TCB_Send,TCB_Rev; //TCB是我定义的一个结构体,装载TCB寄存器里的东东。
这样,我所定义的TCB_Send在运行时就会一直在0x00100000,而TCB_Rev就在0x00100004喽。而他们所处的块就在块2喽。这下,你就知道TCB_DP_0~14怎样去设置了吧?
然后呢?然后当每次DMA传输完后,就会找到相应的地址里重新把TCB读出来,然后给谁呢?这就需要设置TCB_DP_17~21,哪个数代表什么芯片资料里面都会有写的。
如果大家对我说的没有看懂(确实写得不好,混乱),就去ADI的网站上下一个:
VisualDSP++ 4.5 C Compiler and Library Manual for TigerSHARC Processors (Revision 3.0, April 2006) .pdf
这个文件,里面的2-25页就也有写操作方法。这才是官方的方法噢,我是山寨的他的。
这个东西的确有点绕人,大家多想一想应该就想清楚啦。
TS101的链式DMA操作方法相关推荐
- 基于国产FPGA紫光同创Titan2 PG2T390H的PCIe链式DMA控制器设计
文章目录 背景介绍 逻辑方案 性能测试 软件驱动 相关帖子 技术交流 背景介绍 近年来,国产FPGA厂商发展迅速,紫光同创.安路等公司已经量产28nm.几k~几百k的FPGA逻辑芯片,在自主可控的大环 ...
- DMA、链式DMA、RDMA(精华讲解)
一.DMA DMA全称Direct Memory Access,即直接存储器访问.CPU完成传输配置后,即可不在参与传输过程,由DMA控制器将数据从一个地址空间复制到另外一个地址空间.最常见的是本地D ...
- php sql 条件拼组_ThinkPHP框架SQL操作链式写法原理(浅显易懂)
引言 大家如果有面试几次不难发现,虽然国产的TP一直被人诟病.但是丝毫不能影响它在广大企业中的开发受到青睐,强大的社区,暴力实用详细的中文手册.有一个地方相信大家都不陌生,就是他的链式写法,链式写法的 ...
- 仿Jquery链式操作的xml操作类
经常需要对xml文件进行操作,参考了Jquery的链式操作后实现了xmlHelper类. 代码 using System; using System.Data; using System.Config ...
- Guava链式风格Ordering比较器实例
###1.简介 Ordering 实例无非就是一个特殊的Comparator 实例.Ordering只是需要依赖于一个比较器(例如,Collections.max)的方法,并使其可作为实例方法.另外, ...
- 如何解读链式中介作用分析结果?
中介作用是研究自变量X对因变量Y的影响时,是否会先通过中介变量M,再去影响Y.比如工作满意度(X)会影响到创新氛围(M),再影响最终工作绩效(Y). 在中介作用研究中,如果自变量与因变量之间存在多个中 ...
- 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)
本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...
- 链式写法php,ThinkPHP框架SQL操作链式写法原理
下面给大家介绍ThinkPHP框架SQL操作链式写法原理,希望对需要的朋友有所帮助! 引言 大家如果有面试几次不难发现,虽然国产的TP一直被人诟病.但是丝毫不能影响它在广大企业中的开发受到青睐,强大的 ...
- 二维矩阵节点的链式消除和自动补齐!消消乐类游戏可参考!
效果预览 操作方法 点击选中开始节点,按住拖动到相邻的节点,相邻节点添加至选择链中,沿着链往回拖,将会取消之前选择的节点,松开手指以后,选择的节点将会消失,空节点上方的节点将会自动掉落,上方自动随机生 ...
最新文章
- ZOJ 38727(贪心)
- 第十二届蓝桥杯A组省赛试题 I: 双向排序(Java)
- Opencv中IplImage的四字节对齐问题
- QMessageBox改变大小
- java 系列1:数据类型转换
- 布隆过滤器速度_高并发系统一定要考虑的 Bloom Filter 布隆过滤器
- 【转】Jenkins+Ant+Jmeter接口自动化集成测试实例
- python argparse(参数解析)模块学习(二)
- 记录一次json转换的经历
- Web系统集成OCS在线状态功能
- delphi连接access数据库的步骤(详细教程)
- 正态分布变换NDT算法原理及其在点云配准中的应用
- 轮式移动机器人轨迹跟踪的MATHLAB程序,运用运动学和动力学模型的双闭环控制
- 基于SpringBoot的宿舍管理系统
- jQuery Ajax异步请求详解
- HDU 2544 最短路 最短路入门
- opa example
- 记录一下需要优化的东西
- SQL Server 2012学习笔记 (三) ----- SQL Server SQL语句
- java redis 秒杀_Redis 实现秒杀