资料介绍
DMA在DSP应用中至关重要,本文给出了DMA操作非阻塞的请求方法,针对TMS320C620x,实现了与CSL中DAT接口一致的驱动模块QDAT,并指出了EDMA相关的高级特征。
在DSP中,DMA控制器实际是一个外设,与其他集成的串口、主机接口、片外内存接口等都在系统外设总线上,也与其他外设一样有一组相关的控制/状态/数据寄存器,CPU可以访问。
非常重要的一点是,DMA通道能够用于内存之间的数据传送。这里内存都是统一编址的,包括:片上内存,程序和数据分立;接在EMIF上的片外内存,如SDRAM;外设的寄存器也都是内存映射的(memory-mapped),所以DMA通道也可以用于外设和内存之间,进行外设数据接收与发送。
在DSP的处理模型中,所有数据应位于片上供CPU处理,不鼓励CPU直接访问片外数据,因为CPU访问片外资源的时间较长,周期数也不确定,对于实时性和确定性不利。片上内存有时也能够配置成为缓存(cache),缓存控制器会根据一定策略、使用DMA方式切换片外的数据进出缓存,最终使得用户能够在片上访问数据,这个过程对用户是透明的。正因为缓存的机制是透明的,所以也是很难控制的。比如,一段调用频率很高的代码很可能被不常用的部分清出缓存,因为它们映射相同,但随后又很快被调入,这样会造成局部的效率降低。
所以,如果能够明确掌握程序流或数据流的运转特征,不使用缓存模式,用户通过DMA进行自定义的调度,可能提高效率。有的处理器不具备缓存控制器,不支持片上内存作为缓存,如C6205的片上数据内存就不能够配置为缓存,所以主动使用DMA移动数据不可避免。
DSP的DMA功能一般也都较为强大,TI C6000系列的DMA通道支持1D-1D、1D-2D、2D-1D以及常用的2D-2D数据传送,对DMA的合理使用可能替代相当的编程效果,如排序、采样或裁剪。
TI的CSL(Chip Support Library,芯片支持库)对于使用DMA给出了很好的支持,有专门的DMA模块,便于对DMA的各个寄存器进行控制。还有一个DAT模块,使用DMA进行内存数据传送,函数DAT_copy()和DAT_fill()就像常用的内存操作memcpy()、memset()一样,只需要在API接口指出源地址、目的地址和长度,或者其他的维数属性等即可,不需要再去管具体的寄存器,非常方便。
视频处理实例分析
DAT模块易用,但因为是在CSL中,所以只能将DMA控制器直接的功能表达出来。对于灰度图像处理(先不考虑将算法处理后的结果传回片外的情况),在下面的处理框架中,每次DMA执行操作时,CPU在前台还可以做算法处理任务。
。..
task=DAT_copy(。..);//启动头一个DAT任务
。..
while(not_finished){
DAT_wait(task); //本次task完成
task=DAT_copy(。..); //启动下一次的DMA
pingpong_alg_process(。..); //对本次传送的数据处理
}
当视频为4:2:0 YUV图像(planar模式)序列,需要处理某一区域时,实际上是在相同时机处理Y、U、V三块数据,通常它们并不连续,也就是说,将会同时使用三个DMA操作。
这里可能可以同时启动多条DMA通道,但有一些限制:
1. 有的处理器支持同时启动的DMA通道数有限,有些DSP有4条通道,但寄存器集只能完整地支持两条;
2. 由于共享总线和某些接口,同时工作的DMA通道数过多将可能增加访问冲突,降低系统性能;
3. 有时多条通道又必须同时使用,比如系统视频、音频采集进入的数据必须占用独立的通道。
所以,上面的任务能够尽量使用一个DMA通道完成,不失一般性,DAT模块的所有操作实际上是在一条打开的通道上完成的。
那么,对于YUV图像,处理程序框架类似上面,可能如下,
。..
taskY = DAT_copy(。..);
taskU = DAT_copy(。..);
taskV = DAT_copy(。..);
。..
while(not_finished){
DAT_wait(taskY);
DAT_wait(taskU);
DAT_wait(taskV);
taskY = DAT_copy(。..);
taskU = DAT_copy(。..);
taskV = DAT_copy(。..);
YUV_pingpong_process(。..);
这时问题出现了:C620x的DMA通道一次只能接受一个传送请求,也就是说,每次请求必须等到该通道空闲时才可能真正提交上去,这样taskY和taskU在后台操作时,前台无法进行taskU和taskV的启动,即实际上前台没有什么处理任务可做,浪费了效率。而这三个dat任务绑定在一起,启动时机很难拆开。显然,如果能够允许DMA请求连续地提交,将提高效率。
DMA通道请求非阻塞提交的方法
把DMA通道看作一个单处理单元,每个DMA操作作为一个任务,这就形成了一个单处理多任务的模型,任务调度就是FIFO。不妨定义:
1. DMA通道请求上下文是一个数据结构,它包含启动一次DMA传送所需要设定的寄存器参数集合,如源、目的、长度、index寄存器(维数)等等;
2. DMA通道请求上下文队列,一个DMA请求上下文的队列用以缓存DMA请求;
DMA通道的使用和请求非阻塞的提交应有以下两条原则:
a. 应用程序的使用DMA通道的方法:
提交DMA通道请求(无阻塞),获得此次任务的id;在需要使用某任务的目标内存时,应检查该id任务状态直到完成;如果完成,即可进行相应的处理。
b. 无阻塞提交DMA通道请求的实现:标志此次DMA传送任务正在进行;如果DMA通道空闲,设置寄存器启动DMA操作,标志DMA通道正在工作;如果DMA通道正在工作,则将此次DMA请求插入上下文队列。
3. DMA中断服务程序(注:DAT模块不使用ISR,只是查询对应标志,确定DMA传送是否完成):标志此次DMA传送任务完成;如果DMA请求上下文队列为空,标志DMA通道空闲;如果DMA请求上下文队列非空,则从队列中取出头一个DMA请求上下文,用以设置相应的寄存器启动DMA操作。
在DSP中,DMA控制器实际是一个外设,与其他集成的串口、主机接口、片外内存接口等都在系统外设总线上,也与其他外设一样有一组相关的控制/状态/数据寄存器,CPU可以访问。
非常重要的一点是,DMA通道能够用于内存之间的数据传送。这里内存都是统一编址的,包括:片上内存,程序和数据分立;接在EMIF上的片外内存,如SDRAM;外设的寄存器也都是内存映射的(memory-mapped),所以DMA通道也可以用于外设和内存之间,进行外设数据接收与发送。
在DSP的处理模型中,所有数据应位于片上供CPU处理,不鼓励CPU直接访问片外数据,因为CPU访问片外资源的时间较长,周期数也不确定,对于实时性和确定性不利。片上内存有时也能够配置成为缓存(cache),缓存控制器会根据一定策略、使用DMA方式切换片外的数据进出缓存,最终使得用户能够在片上访问数据,这个过程对用户是透明的。正因为缓存的机制是透明的,所以也是很难控制的。比如,一段调用频率很高的代码很可能被不常用的部分清出缓存,因为它们映射相同,但随后又很快被调入,这样会造成局部的效率降低。
所以,如果能够明确掌握程序流或数据流的运转特征,不使用缓存模式,用户通过DMA进行自定义的调度,可能提高效率。有的处理器不具备缓存控制器,不支持片上内存作为缓存,如C6205的片上数据内存就不能够配置为缓存,所以主动使用DMA移动数据不可避免。
DSP的DMA功能一般也都较为强大,TI C6000系列的DMA通道支持1D-1D、1D-2D、2D-1D以及常用的2D-2D数据传送,对DMA的合理使用可能替代相当的编程效果,如排序、采样或裁剪。
TI的CSL(Chip Support Library,芯片支持库)对于使用DMA给出了很好的支持,有专门的DMA模块,便于对DMA的各个寄存器进行控制。还有一个DAT模块,使用DMA进行内存数据传送,函数DAT_copy()和DAT_fill()就像常用的内存操作memcpy()、memset()一样,只需要在API接口指出源地址、目的地址和长度,或者其他的维数属性等即可,不需要再去管具体的寄存器,非常方便。
视频处理实例分析
DAT模块易用,但因为是在CSL中,所以只能将DMA控制器直接的功能表达出来。对于灰度图像处理(先不考虑将算法处理后的结果传回片外的情况),在下面的处理框架中,每次DMA执行操作时,CPU在前台还可以做算法处理任务。
。..
task=DAT_copy(。..);//启动头一个DAT任务
。..
while(not_finished){
DAT_wait(task); //本次task完成
task=DAT_copy(。..); //启动下一次的DMA
pingpong_alg_process(。..); //对本次传送的数据处理
}
当视频为4:2:0 YUV图像(planar模式)序列,需要处理某一区域时,实际上是在相同时机处理Y、U、V三块数据,通常它们并不连续,也就是说,将会同时使用三个DMA操作。
这里可能可以同时启动多条DMA通道,但有一些限制:
1. 有的处理器支持同时启动的DMA通道数有限,有些DSP有4条通道,但寄存器集只能完整地支持两条;
2. 由于共享总线和某些接口,同时工作的DMA通道数过多将可能增加访问冲突,降低系统性能;
3. 有时多条通道又必须同时使用,比如系统视频、音频采集进入的数据必须占用独立的通道。
所以,上面的任务能够尽量使用一个DMA通道完成,不失一般性,DAT模块的所有操作实际上是在一条打开的通道上完成的。
那么,对于YUV图像,处理程序框架类似上面,可能如下,
。..
taskY = DAT_copy(。..);
taskU = DAT_copy(。..);
taskV = DAT_copy(。..);
。..
while(not_finished){
DAT_wait(taskY);
DAT_wait(taskU);
DAT_wait(taskV);
taskY = DAT_copy(。..);
taskU = DAT_copy(。..);
taskV = DAT_copy(。..);
YUV_pingpong_process(。..);
这时问题出现了:C620x的DMA通道一次只能接受一个传送请求,也就是说,每次请求必须等到该通道空闲时才可能真正提交上去,这样taskY和taskU在后台操作时,前台无法进行taskU和taskV的启动,即实际上前台没有什么处理任务可做,浪费了效率。而这三个dat任务绑定在一起,启动时机很难拆开。显然,如果能够允许DMA请求连续地提交,将提高效率。
DMA通道请求非阻塞提交的方法
把DMA通道看作一个单处理单元,每个DMA操作作为一个任务,这就形成了一个单处理多任务的模型,任务调度就是FIFO。不妨定义:
1. DMA通道请求上下文是一个数据结构,它包含启动一次DMA传送所需要设定的寄存器参数集合,如源、目的、长度、index寄存器(维数)等等;
2. DMA通道请求上下文队列,一个DMA请求上下文的队列用以缓存DMA请求;
DMA通道的使用和请求非阻塞的提交应有以下两条原则:
a. 应用程序的使用DMA通道的方法:
提交DMA通道请求(无阻塞),获得此次任务的id;在需要使用某任务的目标内存时,应检查该id任务状态直到完成;如果完成,即可进行相应的处理。
b. 无阻塞提交DMA通道请求的实现:标志此次DMA传送任务正在进行;如果DMA通道空闲,设置寄存器启动DMA操作,标志DMA通道正在工作;如果DMA通道正在工作,则将此次DMA请求插入上下文队列。
3. DMA中断服务程序(注:DAT模块不使用ISR,只是查询对应标志,确定DMA传送是否完成):标志此次DMA传送任务完成;如果DMA请求上下文队列为空,标志DMA通道空闲;如果DMA请求上下文队列非空,则从队列中取出头一个DMA请求上下文,用以设置相应的寄存器启动DMA操作。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- STM32F103DMA功能实现
- LMS自适应滤波器的MATLAB仿真和DSP实现 64次下载
- verilog中阻塞赋值和非阻塞赋值到底有什么区别 0次下载
- FPGA的视频教程之Verilog中阻塞与非阻塞的详细资料说明 2次下载
- TMS320DSP算法标准和指定的DMA架构的详细描述概述 2次下载
- TMS320VC5505DSP直接存储器存取(DMA)控制器特点和操作的概述 3次下载
- TMS320C6474 DSP 增强型DMA控制器用户指南 6次下载
- 基于FPGA技术的无阻塞ATM交换技术结构的特点介绍 10次下载
- 浅谈关于DSP的DMA控制技术 1次下载
- 基于STM32中采用DMA实现方波的产生和捕获 23次下载
- 基于FPGA技术的CATV核心网络无阻塞ATM交换结构 5次下载
- DSP芯片中双通道DMA的研究与设计 51次下载
- 采用DSP的DMA控制技术分析 27次下载
- TMS320C6204DSP中DMA操作的无阻塞请求实现
- ADSP2116x中DMA的应用
- 什么是阻塞和非阻塞? 358次阅读
- 雅特力AT32F423 DMA使用指南 470次阅读
- 一种高性能多通道通用DMA设计与实现 1064次阅读
- 基于STM32H7 EXTI+SPI+DMA双缓冲应用演示 4014次阅读
- 基于SPI配合DMA实现理论速度性能 3943次阅读
- Verilog中阻塞和非阻塞赋值金规 929次阅读
- 如何使用 ESP-AT实现HTTP请求 1065次阅读
- STM8L051F3的DMA相关知识 1425次阅读
- 时序逻辑中的阻塞和非阻塞 2851次阅读
- 浅谈鸿蒙内核源码的原子操作 1199次阅读
- VerilogHDL语言:清阻塞赋值和非阻塞赋值 1062次阅读
- STM32单片机串口DMA解析 7908次阅读
- 如何使用STM32单片机实现DMA的同时发送和接收 1w次阅读
- STM32中DMA模块的使用 6338次阅读
- S5935如何实现DMA传输的设计与研究 1667次阅读
下载排行
本周
- 1电子电路原理第七版PDF电子教材免费下载
- 0.00 MB | 1489次下载 | 免费
- 2单片机典型实例介绍
- 18.19 MB | 91次下载 | 1 积分
- 3S7-200PLC编程实例详细资料
- 1.17 MB | 27次下载 | 1 积分
- 4笔记本电脑主板的元件识别和讲解说明
- 4.28 MB | 18次下载 | 4 积分
- 5开关电源原理及各功能电路详解
- 0.38 MB | 9次下载 | 免费
- 6基于AT89C2051/4051单片机编程器的实验
- 0.11 MB | 4次下载 | 免费
- 7基于单片机和 SG3525的程控开关电源设计
- 0.23 MB | 3次下载 | 免费
- 8基于单片机的红外风扇遥控
- 0.23 MB | 3次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 2PADS 9.0 2009最新版 -下载
- 0.00 MB | 66304次下载 | 免费
- 3protel99下载protel99软件下载(中文版)
- 0.00 MB | 51209次下载 | 免费
- 4LabView 8.0 专业版下载 (3CD完整版)
- 0.00 MB | 51043次下载 | 免费
- 5555集成电路应用800例(新编版)
- 0.00 MB | 33562次下载 | 免费
- 6接口电路图大全
- 未知 | 30319次下载 | 免费
- 7Multisim 10下载Multisim 10 中文版
- 0.00 MB | 28588次下载 | 免费
- 8开关电源设计实例指南
- 未知 | 21539次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935053次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537791次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233045次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191183次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183277次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138039次下载 | 免费
评论
查看更多