基于TMS320C6204DSP中DMA操作的无阻塞请求实现
摘 要:本文介绍了DMA在DSP处理器中的作用,分析了基于TMS320C6204 CSL中的DAT接口特性。提出并实现了一种基于TMS320C6204 DMA操作无阻塞请求的方法,并说明了该方法较EDMA中相关的高级特征所具有的优点。
关键词:TMS320C6204 DMA 无阻塞请求
一、TMS320C6204芯片及DMA简介:
在DSP(Digital Signal Processor,数字信号处理器)中,DMA控制器实际类似于一个外部设备,首先,它与其它集成的串口、片外内存接口、主机接口等等都挂在系统外部设备总线上,能够在没有CPU参与的情况下完成映射存储空间中数据的搬移。其次,DMA控制器具有一组相关的控制/状态/数据寄存器,允许CPU直接进行访问。在DSP中,内存是统一进行编址的,包括:片上内存,程序与数据分别进行存储;接在EMIF上的片外内存,如SDRAM;外设的控制/数据寄存器地址也是由内存地址映射(memory-mapped)而来的,所以,DMA可以用于内存与外设之间进行数据通信。
TI公司生产的TMS320C6204芯片是一种的定点DSP芯片,可以完成大运算量的音、视频信号处理功能。在该芯片中,集成了4个DMA接口,2个多通道缓存串口(McBSP),2个32bit计时器;每个DMA控制器具有4个相互独立编程的传输通道,允许进行4个不同内容的DMA传输;此外,片上还有一个专门的HPI接口通道。这些通道支持1D-1D、1D-2D、2D-1D以及最常用的2D-2D数据传送,能够同时完成30路的音、视频编解码。每路成本为3美元,大大低于以前系列的DSP,非常适合用于无线基站、无线PDA、组合Modem、GPS导航等需要大运算能力的应用场合。
二、DMA数据传输中存在的问题:
在DSP中由于CPU访问片外资源的时间一般比较长,周期数也不确定,不利于数据传输的实时性和确定性,所以不鼓励CPU直接访问片外数据,。片上内存有时也能够配置成为缓存(cache),缓存控制器会根据一定策略,使用DMA方式切换片外的数据进出缓存,最终使得用户能够在片上访问数据,这个切换过程对用户来说是透明的。而正因为缓存的机制是透明的,所以也是比较难控制的。比如,一段调用频率很高的代码很可能会被不常用的部分挤出缓存,原因是它们在内存中的映射相同,但这段代码随后又被很快地调入,因此反复的进行出入缓存的数据调用,造成局部的效率降低。
目前,许多公司生产的处理器不具备缓存控制器,不支持片上内存作为缓存,如C6205的片上数据内存就不能够配置为缓存,所以主动使用DMA移动数据不可避免。
三、在灰度图像处理上的应用分析:
在TI的CSL(Chip Support Library,芯片支持库)中,DAT模块在执行操作时可以允许CPU在前台进行算法处理任务,具体的处理框架如下:
…..
task=DAT_copy(…);//启动第一个DAT任务
….
While(not_finished){
DAT_wait(task);//结束本次task
Task=DAT_copy(…);//启动下次的DAT任务
elf_alg_process(…);//处理本次传送的数据
…};
在这个处理过程中,启动DAT任务与处理数据是按先后顺序进行的,不需要进行任务的并行执行;但是如果传送的视频信号是4:2:0YUV图像(planar模式)序列,在处理某一区域时,实际就是在相同的时间片内处理Y、U、V三块数据,而Y、U、V数据是不连续的,因此,必须同时使用三个DMA操作。处理的大体框架如下:
….
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_elf_process(…);
…..};
通过上面的处理过程分析,由于TMS320C6204的DMA通道一次只能接受一个传送请求,即:传送请求必须在该DMA通道完全空闲时才能进行该信道进行传送。所以在taskY和taskU在后台进行操作时,前台是无法启动taskU和taskV,也就是说在前台没有处理任务,而由于这三个dat任务是捆绑在一起的,在启动时机上很难分开,所以在传输中浪费了处理器资源。如果能够实现DMA请求的连续提交,就可以使DSP的处理效率得到提高。
四、DMA无阻塞请求的实现:
实现DMA无阻塞请求,最关键的问题在于如何构造一个具有任务调度功能的处理模型。如果能够明确掌握程序流或数据流的运转特征,不使用缓存模式,而是由用户通过DMA进行自定义的调度,就可以避免前面所提到的问题,从而提高DSP的处理效率。TI的CSL对于使用DMA提供了坚实的技术支持,有专门的DMA模块。特别是对DAT模块,使用DMA进行内存数据传送(如函数DAT\_copy()和DAT\_file()就非常类似于我们常用的内存操作函数memcpy()、memset()),所以只需要在API( Application Programming Interface,应用编程接口)接口指出源地址、目的地址和数据长度,或者其他的维数属性等参数就可以,而不再需要设置具体的寄存器的值。这样就可以利用CSL实现DMA的无阻塞请求的提交。
设计将DMA通道看作一个单处理单元,每个DMA操作看作一个任务,这样就构成了一个单处理单元多任务的处理模型,任务调度使用FIFO。定义如下:
1、定义DMA通道请求上下文为一个数据结构:
该数据结构中包含有启动一次DMA传送所需要的寄存器参数集合,如源地址(Source address)、目的地址(Destination address)、数据长度、index寄存器等等。
2、定义DMA通道请求的上下文队列,并将该队列用来缓存DMA请求:
如果DMA请求上下文队列为空,标志DMA通道空闲,可以启动DMA请求进行数据传输;如果DMA请求上下文队列非空,则从队列中取出第一个DMA请求上下文,来进行相应的寄存器启动DMA操作。
3、定义DMA中断服务程序:
要说明的是,由于在DAT模块中是不能使用ISR的,所以DSP只是通过该程序来查询对应标志位,来判断DMA传送是否完成。在DMA模块中,中断控制标志存放在辅助控制寄存器中。当该通道的TCINT(传输控制器中断信号)位置1,所有状态位信号相或的结果就会产生DMA_INTn信号并送往CPU。但是,对一个COND(控制域)写入1是无效的,这意味着用户不能以手工的方式强制激发一个状态。
通过以上的定义及配置,完成了在多DMA请求任务中,加入具有任务调度功能的处理模型,使得DMA可以通过任务调度来进行DMA通道时间片占有量的有序的分配,从而保证了DMA通道的使用率,提高了处理能力。
五、与EDMA在无阻塞请求上的特点比较:
在 TI公司推出的TMS320C64xx系列定点芯片中,采用了EDMA。EDMA(enhanced-Direct memory access,增强型直接存储器访问)将DMA的部分功能进行了改进,主要有:提供了64个信号通道;每个通道的优先级可以由用户自行设置。在EDMA通道控制器中EDMACC中有专门的PRAM(parameter RAM)来缓存DMA请求参数,而EDMA的事件参数表中包括了标志位和LINK address,这些参数用于判断在上个DMA传送结束后 ,是否有新的DMA请求参数需要重新载入操作寄存器中; EDMA数据的传输格式和控制都是通过设置EDMA控制寄存器和参数RAM来实现的,因而 EDMA的链表机制,使得每个通道在两次数据传输之间不需要中断处理程序(CPU)介入,减轻了CPU的负担,保证了传输的连续性,大大提高了传输效率。
但由于EDMA是通过对DSP硬件结构进行改进来实现DMA的无阻塞请求,所以使得基于EDMA的DSP芯片(如64系列)的成本大大提高,不适合于需要大规模运算的应用场合。而本实现方法基于TMS320C6204软实现了DMA的无阻塞请求,在硬件结构上没有增添新的专门的控制寄存器,保证了较低的成本价格,更适合在需要大规模运算的工程中使用。
六、结语:
本文通过构造一个单处理多任务的处理模型,在TMS320C6204上实现了DMA无阻塞请求,使DSP的处理效率大大得到了提高。
|