TMSC6713DSK DSP/BIOS多任务程序设计
2013-06-13杜广超杜松蒲孙慧慧
杜广超,陈 锋,杜松蒲,孙慧慧
(中国人民解放军63888部队,河南济源459000)
0 引言
DSP/BIOS由TI公司开发的DSP实时操作系统,在基于DSP/BIOS的DSP程序开发中,每一个算法程序是对任务(TSK)、软件中断(SWI)和硬件中断(HWI)等的一种裁剪和组合,其程序架构具有共同性[1]。C6713DSK是TI公司针对C6713推出的学习开发板,以方便DSP初学者对DSP软硬件设计的把握,在国内众多高校和科研院所作为DSP的学习平台,具有极为广大的用户基础。针对该平台,设计了DSP/BIOS多任务程序,实现了多任务处理,并从功能设计到程序设计进行了详细论述,克服了C6713DSK和DSP/BIOS相关应用文献论述的笼统性[2-4]。
1 基于C6713DSK的多任务功能设计
C6713DSK硬件上由C6713最小音频应用系统、板上JTAG仿真电路和用户交互电路等部分构成[5],包 含 C6713 DSP、CPLD、8M FLASH、4M SDRAM、AIC23 Codec音频编解码等芯片,是以音频处理为目标应用领域的。DSP通过2个McBSP串口和AIC23 Codec相连,其中 McBSP0采用 SPI模式,专门用于配置AIC23 Codec时由DSP向其发送控制字,数据传输时处于空闲状态,McBSP1采用DSP模式,作为双向数据传输通道,AIC23 Codec和音频输入输出口相连组成音频处理系统,所设计的一些功能即基于此。还提供双拨开关DIP可以方便用户对DSP状态进行控制,提供LED指示灯可以对电路板状态进行显示,以及响应用户的操作。
基于DSK的构成和特点,根据DIP四个开关的状态可设置DSP处于不同的工作状态,实现多任务设计:
① DIP=“0000”时,LED按一定规律明灭;
② DIP=“0001”时,从音频输出口输出单音信号;
③DIP=“0010”时,从音频输出口输出 BPSK信号;
④DIP=“0100”时,从音频输入口输入声音,由DSP和另外一段音频混音,并叠加一定功率噪声后由音频输出口输出,实现音频的实时处理;
⑤ DIP=“1000”时,从音频输入口输入音频信号,由DSP对其进行频谱分析后由LED等输出信号频率值;
⑥自始至终,如果有中断产生,进入中断服务程序,播放10 s预存录音。
该多任务设计类型丰富,包括了对DSK板上用户交互电路的充分利用,实现了LED灯控制、音频信号生成、音频信号监测分析、音频实时处理和中断处理等任务。由于DIP有4个开关,可以组合出16种状态,那么利用DSK就可以相应实现16种任务,如果再考虑HWI和周期函数(PRD),那么DSK可以处理的任务量会更多。
2 多任务程序设计
考虑以上几点功能的实现,根据任务是否使用音频数据通道,可以将它们分以下几类:
①使用双向数据通道的,主要是音频的实时处理,需要输入输出通道;
②使用单向数据通道的,主要是信号的生成和监测,分别使用输出和输入通道;
③不用数据通道的,包括对LED等的控制,以及中断服务程序等。
以上3种情况下,需要根据任务的不同,分别打开输入、输出数据通道,以保证正确的数据流向,这是通过对DSP内部EDMA的控制来实现的。整个程序需要对DIP的状态不断查询,根据DIP的状态进入不同的任务处理,这就需要不同任务之间相互切换时准确对一些状态位进行设置和查询。同时在所有任务处理中,一旦有中断发生,就必须马上切换到中断服务程序,即预存录音播放。据以上分析,播放预存录音任务用HWI实现,其他任务用TSK实现,需要优先级区别时可以提高相应任务的优先级级别,甚至用SWI实现。程序处理主要的流程图如图1和图2所示。
图1 基于C6713DSK的多任务程序流程
图2 基于C6713DSK的多任务程序流程
在 main()函数完成 C6713、AIC23 Codec、McBSP、EDMA初始化设置之后,DSP/BIOS被启动,开始任务调度。由硬件中断INT6实现预存录音播放功能,由任务TSK0实现对其他功能的区分并转入相应处理,数据通道的控制由EDMA中断INT8完成,现在对关键点说明如下:
硬件中断INT6级别最高,可以在任何时刻抢占正在运行线程的运行。INT6中断服务程序会设置一个状态位,表示发生了INT6中断,该状态位既用于判别触发INT8中断的中断源,也用于TSK0任务当INT6中断发生时屏蔽对EDMA通道参数的错误设置。
由于只要利用到了数据通道,就会触发EDMA内部中断INT8中断,而INT8中断服务程序只有一个,这就需要在INT8中断服务程序中对中断源进行判别和处理,使得INT8中断服务程序处理较为复杂。为保证INT8中断服务程序不过多占用DSP芯片处理时间,在INT8中断服务程序中触发软件中断SWI0,所有与数据通道相关的处理均在SWI0中完成。在SWI0中首先需要判别是否INT6触发的EDMA中断,之后需要查询双拨开关DIP的状态,根据DIP状态根据对数据通道的使用情况把数据放入数据输出通道,或者从数据输入通道取出数据以进行分析。
任务TSK0是程序的主循环,DSP没有硬件中断、软件中断和周期性任务等,处理时会一直查询DIP的状态,按照DIP状态打开或者关闭音频数据输入或者输出通道,并触发EDMA内部中断INT8,为执行相应的信号产生或分析任务做准备。闪灯不需要音频数据通道的参与,单独用一个任务函数实现,TSK0每执行一次,闪灯任务函数执行一次,完成一个周期的闪灯。
程序设计好后,下载到C6713DSK运行,切换DIP双拨开关状态,可以正常实现各个任务间正常切换,并通过板上U21的管脚“6”电平的改变可以触发INT6中断,正常播放预存录音。
3 关键处理
3.1 音频数据输入输出过程
上述程序设计中,为保证音频数据传输的流畅,数据传输基于ping-pong机制进行,程序需要设置4个 缓 冲 区 gBufferXmtPing、gBufferXmtPong、gBufferRcvPing、gBufferRcvPong分别作为发送或者接收的ping或者pong缓冲区,并把它们配置为句柄hEdmaReloadXmtPing、 hEdmaReloadXmtPong、hEdmaReloadRcvPing、hEdmaReloadRcvPong 所代表EDMA通道的源或目的地址[6],并和McBSP1的源和目的地址相关联,最后将 EDMA通道hEdmaReloadXmtPong、hEdmaReloadXmtPing 以 及hEdmaReloadRcvPong、hEdmaReloadRcvPing 分别相链接。发送和接收数据的过程如图3和图4所示。
图3 音频数据的发送过程
图4 音频数据的接收过程
下面是EDMA配置的一些关键代码及注释:
/*hEdmaReloadXmtPong源地址为 gBufferXmtPong,同样hEdmaReloadXmtPing源地址为gBufferXmtPing*/
gEdmaConfigXmt.src=EDMA_SRC_OF(gBufferXmt-Pong);
EDMA_config(hEdmaReloadXmtPong,&gEdmaConfigXmt);
……
/*EDMA发送目的地址是McBSP1的发送地址,McBSP1把数据发送到AIC23 Codec经音频口输出*/
gEdmaConfigXmt.dst=MCBSP_getXmtAddr(hMcbsp1);
……
/*hEdmaReloadXmtPong和hEdmaReloadXmtPing通道相链接,实现数据连续发送[7]*/
EDMA_link(hEdmaReloadXmtPong,hEdmaReloadXmt-Ping);
EDMA_link(hEdmaReloadXmtPing,hEdmaReloadXmtPong);
……
/*hEdmaReloadRcvPong目的地址gBufferRcvPong,同样hEdmaReloadRcvPing目的地址gBufferRcvPing*/
gEdmaConfigRcv.dst= EDMA_DST_OF(gBuffer-RcvPong);
EDMA_config(hEdmaReloadRcvPong,&gEdmaConfigRcv);
……
/*EDMA接收源地址是McBSP1的接收地址,数据经音频口到AIC23 Codec后经McBSP1输入*/
gEdmaConfigRcv.src=MCBSP_getRcvAddr(hMcbsp1);
……
/*hEdmaReloadRcvPong和hEdmaReloadRcvPing通道相链接,实现数据连续接收*/
EDMA_link(hEdmaReloadRcvPong,hEdmaReloadRcvPing);
EDMA_link(hEdmaReloadRcvPing,hEdmaReloadRcvPong);
在SWI0服务程序中需要适应ping-pong机制,判断当前正在发送或者接收的数据是ping缓冲区数据还是pong缓冲区数据,如在信号生成时由如下语句完成:
if(pingPong==PING)/*pingPong为所设置的状态量,用于判断进行ping还是pong处理*/
{
copydata(data,gBufferXmtPing,BUFFSIZE);/* 把数据data拷贝到gBufferXmtPing发送*/
pingPong=PONG;/*更改pingPong的状态*/
}
else
{
copydata(data,gBufferXmtPong,BUFFSIZE);
pingPong=PING;
}
如果没有在代码上适应这种ping-pong机制,本来应该生成波形连续的信号变成了占空比为1/2的间断性信号。同时还要注意对数据data的幅度进行调整,以防止出现截顶,使得本来应该生成的正弦波信号变成矩形波信号。
3.2 频率分析结果输出方法
在频谱分析任务中,需要对输入音频信号进行FFT变换,分析其频率值,并把分析结果通过DSK板上资源输出。由于DSK板上仅仅有音频输出口或者LED灯可以用于用户交互时输出有关信息,可以考虑用2种方法实现分析频率值的输出。
①利用音频输出口。该方法需要提前录好数字0~9和Hz的读音,然后逐字符把频率值所对应的字符读音选出并从音频输出口播放即可。所有字符读音总长至少约10 s才能分辨清楚,所以该方法需要较大的存储空间,而板上存储空间有限,INT6中断所播放录音长度已经是板上资源的极限,所以不宜采用该方法。
②利用LED灯。该方法需要建立LED灯明灭和数字0~9和Hz之间的对应关系,LED灯全明表示“Hz”,LED灯按照BCD编码明灭表示数字0~9。每个字符对应LED明灭持续1 s,每次以LED灯全明输出Hz为结束,之后循环输出分析得到的频率值。
4 结束语
DSP/BIOS最初在工程控制领域较为广泛,随着DSP芯片处理能力的不断提升,基于DSP/BIOS可以方便实现多任务处理,有助于DSP芯片潜力的充分发挥,在DSP信号处理程序开发中应用也日益广泛。本文基于DSP/BIOS设计的多任务处理程序,充分结合了硬件电路的资源,其架构可以方便移植到定制电路板的DSP程序开发之中。
[1]陈 煌,胡剑凌,王 超.基于 DSP/BIOS的TI DSP应用程序框架设计[J].微计算机信息,2009,25(5):130-132.
[2]丁宜栋,华 芸.基于DSP/BIOS的软件系统设计[J].舰船电子工程,2001(5):52-55.
[3]曾 雯,邓成良,尹俊勋.基于DSP/BIOS的实时语音混沌加密系统[J].微计算机信息,2009,25(4):199-201.
[4]闫群民.基于DSP/BIOS的数字滤波器设计与实现[J].陕西理工学院学报(自然科学版),2010,26(1):16-19.
[5]Spectrum Digital,INC.TMS320C6713 DSK Technical Reference[S],2003.
[6]Texas Instruments.TMS320C6000 DSP Enhanced Direct Memory Access(EDMA)ControllerReferenceGuide[S],2005.
[7]李方慧,王 飞,何佩琨.TMS320C6000系列DSPs原理与应用[M].北京:电子工业出版社,2003.