基于Intel Xscale的嵌入式音频系统的研究与实现

   2024-02-18 互联网900
核心提示:  目前,随着以PDA、信息家电、机顶盒等为代表的嵌入式系统应用的广泛发展,嵌入式系统已经越来越走近普通人的生活,随之而来的,

  目前,随着以PDA、信息家电、机顶盒等为代表的嵌入式系统应用的广泛发展,嵌入式系统已经越来越走近普通人的生活,随之而来的,就是对嵌入式软、硬件设计的广泛需要。在嵌入式系统设计当中,音频控制模块已成为不可缺少的一部分。

  1 系统硬件实现

  音频系统设计包括软件设计和硬件设计两方,本设计主要基于Intel Xscale PXA270处理器,在硬件上使用了基于IIS总线的音频系统体系结构。IIS(Inter-IC Sound bug)又称I2S,是菲利浦公司提出的串行数字音频总线协议。目前很多音频芯片和MCU都提供了对I2S的支持。

  I2S总线只处理声音数据。其他信号(如控制信号)必须单独传输。为了使芯片的引出管脚尽可能少,I2S只使用了三根串行总线。这三根线分别是:提供分时复用功能的数据线、字段选择线(声道选择)、时钟信号线。

  在Intel公司的Xscale芯片中,为了实现全双工模式,使用了两条串行数据线,分别作为输入和输出。I2S控制器可以通过PIO或者DMA方式来访问。

  在DMA方式下,DMA控制器只能通过串行音频数据寄存器(SADR)访问FIFO。DMA控制器通常以8,16或32字节大小的块存取先进先出(FIFO)队列数据的。I2S控制器向DMA控制器发送的DMA请求中Transmit FIFO请求信号主要依赖于TFTH(transmit trigger-threshold)设置值,而Receive FIFO请求信号主要依赖于RFTH (receive trigger-threshold)设置值。

  本设计用到的主要芯片是Intel Xscale PXA270和TI 的TSC2101音频控制器。在该体系结构中,为了实现全双工通信,数据传输使用了两个DMA通道,分别用来播放和录音的。

  

  2 WinCE下音频设备底层软件设计

  在嵌入式系统中,由于各种硬件设备有所不同,且种类繁多,因此通常都得为各种设备编写驱动程序。

  本设计是在Windows CE操作系统下开发音频设备的驱动程序。设备驱动程序是将操作系统和设备连接起来,使得操作系统能够识别设备,并为应用程序提供服务。Windows CE支持广泛的基于各种CE平台的设备驱动程序,也提供一些用于驱动开发的模型,其中包括来自其他操作系统的驱动程序模型。

  目前,Windows CE提供了四种设备驱动模型,其中两种是专用于Windows CE的模型:流接口驱动(Stream Interface Driver)和本地设备驱动(Native Device Driver),另外两种外部模型来自其他的操作系统。音频设备驱动程序采用流接口驱动类型,它主要由设备管理器模块(Device Manager)以DLL(动态链接库)的形式加载并管理。

  

  当设备需要驱动程序的服务时,基于Windows CE的平台要使用中断通知操作系统。Windows CE把中断处理分成两部分---核心码和用户码部分,这样使得功能和实现的简易性比较平衡。核心码部分叫做中断服务例行程序(ISR),而用户码部分叫做中断服务线程(IST)。中断服务例行程序(ISR)把物理中断映射到逻辑中断。

  如图3所示,中断过程如下:

  首先,某硬件设备发出中断请求,系统首先跳到异常处理,经过中断控制器处理之后,返回一个物理中断号,根据该物理中断号,执行相应的ISR。

  其次,ISR做一些简单的中断处理,比如中断屏蔽,清相应中断位等,最后返回一个逻辑中断号。在系统头文件里,OEM可以自定义逻辑中断号,但总数不能超过24。

  由于,驱动程序在初始化时向内核注册了逻辑中断号和相应的IST,并且通过InterruptINItialize()这个系统API函数将逻辑中断号与相应中断事件进行绑定,于是,当ISR返回逻辑中断号给Kernel后,Kernel将会触发相应中断事件,使一直处于等待状态的IST正常地运行下去。

  

  3音频实时性的研究与实现

  音频设备驱动程序设计中,由于设备应具有很高的实时性,所以DMA缓存区设计以及合理地利用缓存区加快对音频数据的处理,减少延时变得十分重要。

  在Intel Xscale PXA270中,DMA控制器没有内置存储区域,因而在系统设计中,将规定SDRAM的某段物理空间供音频设备使用。然后在其DMA通道寄存器的地址寄存器中设置缓存区的地址。于是接收的数字化音频数据通过DMA控制器存放在规定的DMA缓存区中,等待CPU来处理。

  在具体设计当中,最重要当属缓存区块的设计。在本设计当中,分别采取了单缓存区和双缓存区两种方案,以下分别是两种设计方案的研究与实现。

  单缓存区的研究与实现:

  对于单缓存区DMA通道设计来说,由于CPU和DMA控制器都处理同一个DMA缓存区,一般情况下,当CPU在处理DMA缓存区时,DMA控制器将挂起,暂停对DMA缓存区的处理,而当DMA控制器开始处理缓存区数据时,此时,CPU将会被挂起,待DMA控制器处理完后唤醒它。

  在驱动程序设计当中,当CPU在处理缓存区数据时,如果此时将DMA控制器挂起,那么在每次往DMA缓存区里写新数据的前后,都要把DMA Channel关开一次。由于DMA数据传输完全是由硬件完成,传输速度较快,因而会造成DMA Channel开关次数过于频繁,并且开关的过程中还大量占用CPU资源,使音频数据产生很大的延迟。

  为了解决上述问题,在设计当中,当CPU在处理缓存区数据的同时,允许DMA控制器也能正常工作。

  在PXA270处理器的设计中,DMA与CPU采用交替访问内存的方式。因而,在单缓存区设计当中,以播放为例,新的音频数据在CPU控制下写到DMA缓存区的数传率(V1)与DMA缓存区数据通过DMA Channel传送到I2S控制器的数传率(V2)大小之间的关系显得尤为重要。一般情况下,当V1>V2时,才能保证新的音频数据都能够正确传到I2S控制器中。而当V1

  综上所述,可以得出以下结论:在单缓存区设计中,驱动程序处理缓存区中数据的速度依赖于缓存的大小和数据传输速率。在这里数据传输速率(V2)主要取决于I2S控制器所设置的位时钟频率(I2S_BITCLK)以及每次DMA请求所传送的数据大小。

  在缓存区大小、位时钟频率大小以及软硬件条件相同的条件下,作以下实验:

  该实验说明,在V1保持不变的条件下,V2越大,造成数据丢失产生杂音的可能性越大。

  在上述实验条件下,粗略估算驱动程序处理缓存区数据需要1.38ms。但如果在CPU负载较大的情况下,将可能出现数据丢失的现象。

  当音频应用I/O数据量大的时候,使用较大的缓存区能缓解CPU因负载较大而出现数据丢失的问题。但在实际当中,DMA缓存区的大小应该偏小一些较好。因为大的缓存区需要更长的填充时间,在使用时会出现延时,并可能占用过多的CPU资源。所以,在应用中根据CPU的处理能力等因素来估算DMA缓存区的大小十分关键。

  双缓存区的研究与实现:

  由以上单缓存区设计所遇到的问题中可以看出,若使用双缓存区,当CPU正在处理某一个缓存区数据的同时,DMA控制器可以完成另一个缓存区数据的传输,这样交替下去,既可以提高系统的并行能力,又可以避免单缓存区驱动程序设计所带来的种种问题,提高音频处理的实时性。

  双缓存区驱动程序设计当中,以播音为例,新的音频数据在CPU的控制下先写到Buffer1中,此时DMA控制器正在处理Buffer2的数据传输。当Buffer2的数据全部传完之后,将会产生一个DMA中断,该中断通知CPU开始往Buffer2里写新的音频数据,与此同时,DMA也转向处理Buffer1的数据传输。

  如此循环下去,由于任何时刻,CPU和DMA都没有处理同一段DMA缓存区,不仅减少了资源访问的冲突,而且能够最大程度上保证音频数据的不丢失,提高音频处理的实时性。同时,由于使用双缓存区,使CPU和DMA可以并行地处理缓存区的数据,提高了系统的并行能力。

  在和以上单缓存区设计实验条件相同的条件下,使用双缓冲区的结果如下:

  由此可以看出,采用双缓存区设计,造成数据丢失的可能性很小。

  4结束语

  双缓存区设计思想对音频控制系统的研究与实现有着十分现实的意义。本文在单、双缓存区的对比分析实验中可以得出:双缓存区设计既可以提高系统的并行能力,又可以避免单缓存区设计所带来的种种问题,提高了音频处理的实时性,并且在实际应用中取得了良好的效果。


 
举报收藏 0打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  隐私政策  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  RSS订阅