实验六 DMA实验 实验目的:学习DMA的原理的使用方法 实验内容:用DMA方法接收McBSP接口语音芯片的数据
DMA是直接存储器存取,是一种传送不占用CPU处理时间的大批量数据传送的有效方式。我们用以下实例来说明它的应用: 如果我们要做一个音频处理系统,需要连续用McBSP接口的语音芯片采集若干个样本进行处理,比如频谱分析、音频压缩等。本例假设要每采集256个样本进行一次处理。上例用的是查询方式,占用了所有CPU资源。可以用中断方式,结合前面的实验不难做到,请同学们自行完成。在这个实验中我们将介绍一个更有效的DMA传送方式。我们比较一下用中断方式和DMA方式的效率有何不同: 一、中断方式:每当中缓冲串口接收一个16bit样本的数据,触发一次串口接收中断,将数据转移到一个256 word的数据接收缓冲区并计数。当计数达到256个,即缓冲区满时,将256个数据转移到数据处理存储区,并通知主程序进行处理。 二、DMA方式:我们使用一个通道自动接收McBSP传来的数据并存入接收缓冲区,当缓冲区满时触发DMA中断,将256个数据传送到数据处理存储区,传送完毕触发通知主程序进行处理。 由上比较可见,每接收一批样本,用中断方式将触发256次中断,也就是主程被打断256次去接收数据。而用DMA方式,只在全部256个样本全部接收完毕时发生一次中断,这时主程序应该已经处理完上一批的数据。 进一步考虑,当数据处理完毕后还需要将数据送走,这时又可以采用另一个DMA通道完成这个任务,将CPU释放出来等待进行下一批样本的处理。 事实上DMA传送并非比用CPU直接处理快,例如在内部存贮器之间传送时,用CPU需要2cycle/word,而用DMA要4cycle/word。DMA的优势在是把CPU解放出来做其它的事。 以下是两个DMA通道与CPU协调工作的情况(阴影部分表示空闲)。 DMA0①①① CPU②③
②③
② DMA1 ④
④
①从McBSP接收数据 ②DMA中断,将数据从接收缓冲区转移到数据处理存储区 ③对对数据进行处理 ④将处理完的数据送走 估计一下各步的时间,设采样频率是8kHz,CPU时钟频率100MHz。因此一个处理周期为1/8kHz*256=32ms。 ②传送256个点至少需要256word*2cycle/word=512cycle=5.12us。 假设处理完后数据量不变,④需要256word*4cycle/word=1024 cycle=10.24us。 ③所需要的时钟周期取决于算法的复杂度了。 计算好各步所需要的时钟周期,就可以根据情况灵活选择如何使用DMA,例如如果CPU有足够的空闲时间送走数据就不必要④;如果CPU仍然不足,就需要再增加个一个DMA来做②的任务。如果数据的输出也是从McBSP输出,还要用一个DMA通道进行McBSP的发送。 总之要合适地使用DMA通道,使用不当也会使程序变得更加复杂,例如多个DMA通道优先级的问题等等。 C54x系列有6个DMA通道,但不同型号C54x系列DSP DMA通道的使用不全相同,如C5402只能将DMA通道用于内部数据存贮器之间传送、McBSP和HPI接口,而C5410可用于内部、外部数据、程序存贮器之间传送。详细介绍请参阅SPRU302 TMS320C54x DSP Reference Set, Volume 5: Enhanced Peripherals和各DSP的数据手册。 实验7.1 FIR ;============================================================= ; fir4.asm ;用用循环缓冲区和双操作数寻址方法实现FIR滤波器 ;先用matlab,选择80点汉明窗设计一个截止频率为0.2π的低通滤波器 ; 本例与前不同的是系数直接引用程序存储器的系数表 ;N=5 y(n)=h0*x(n)+h1*x(n-1)+h2*x(n-2)+h3*x(n-3)+h4*x(n-4) ;============================================================= .title "fir4.asm" .mmregs .def start ;分配数据存储区 .bss y,1 ;y xn .usect "xn",80 ;xn h .usect "h",80 ;h PA0 .set 0000H ;数据输出端口 PA1 .set 0001H ;数据输入端口 ;参数表 .data table: .word -7,-18,-24,-22,-9,11,33,48 ;已在Matlab中转成十六进制的小数 .word 46,20,-24,-73,-104,-97,-43,49 .word 146,204,187,81,-91,-268,-371,-337 .word -144,162,476,661,603,261,-297,-894 .word -1283,-1222,-562,697,2373,4142,5618,6456 .word 6456,5618,4142,2373,697,-562,-1222,-1283 .word -894,-297,261,603,661,476,162,-144 .word -337,-371,-268,-91,81,187,204,146 .word 49,-43,-97,-104,-73,-24,20,46 .word 48,33,11,-9,-22,-24,-18,-7 start: SSBX FRCT ;小数乘法 ;把参数表复制到数据存储区 STM #h,AR1 RPT #79 MVPD #table,*AR1+ ;把x(n)-x(n-79)赋始值0 STM #xn,AR1 RPT #79 ST #0,*AR1+ STM #xn+79,AR3 ;x(n-79)---AR3 STM #h+79,AR4 ;h(n-79)---AR4 STM #80,BK ;循环缓冲区大小80 STM #-1,AR0 ;指针调整值-1 LD #xn,DP ;DP指向xn所在页 PORTR PA1,@xn ;输入数据 LD #y,DP ;DP指向y所在页 FIR: RPTZ A,#79 ;进行一次FIR运算 MAC *AR3+0%,*AR4+0%,A;A=(AR3)*(AR4)+A, AR3=AR3+AR0,AR4=AR4+AR0 STH A,@y ;保存计算结果 PORTW @y,PA0 ;输出结果 BD FIR ;读入下一个数据并进行下一次计算 PORTR PA1,*AR3+0% ;新数据覆盖了最旧的数据 .end |