上层应用程序提供与硬件无关的程序接口3。
本应用系统中设备驱动程序分为两类①字符设备驱动程序包括键盘驱动4、LCD设备驱动、I2C设备驱动5。
②基于IIS总线标准的音频设备的驱动程序。
下面我们介绍音频设备驱动程序的实现机制。
数字音频延时器需要对音频数据实时读写数据吞吐量很大对硬件设备读写操作十分频繁。
因此声卡设备驱动程序的性能要求很高。
目前Linux下常用的声卡驱动程序主要有两种OSSopensoundsystem和ALSAadvancedLinuxsoundarchitec-ture。
OSS是最早出现在Linux上的声卡驱动应用广泛日趋成熟。
ALSA开放源代码近年来发展迅速优势日趋明显。
和OSS相比ALSA除了提供了一组内核驱动程序模块之外还专门为简化应用程序的编写提供了相应的函数库为应用图1系统结构音频信号预处理模块模拟信号整形、滤波、放大AES3信号编码AES3信号解码IIS控制器接口I2C总线接口ARM920TCirrusLogicEp9302以太网物理层线路接口RS232串口通讯调试模块调试模块接口GPIO存储设备接口处理器模块RAMFLASH数据存储模块LCD人机交互模块键盘D/A转换A/D转换图2软件架构各个层面之间信息交互1.Linux操作系统启动前的人机交互2.提供Linux内核启动环境RedbootLinux内核设备驱动程序应用程序加载设备驱动模块驱动模块加载成功调用应用程序系统调用进程管理、内存管理、硬件设备读写操作调用设备驱动程序完成硬件设备读写操作完成系统调用冯义王击基于嵌入式Linux的数字音频延时系统设计201031153395程序开发提供了更加友好的编程接口并完全兼容于OSS6。
本应用系统采用的声卡驱动程序为ALSA。
EP9302的IIS控制器提供DMA支持大大增强了处理器读写音频数据的能力。
在声卡驱动中音频数据的读写过程首先是音频数据与DMA缓冲区DMABuffer的交互的过程。
音频数据写入声卡设备时应用程序通过音频设备驱动首先将音频数据从应用程序缓冲区APPBuffer写入DMABuffer。
接着由DMA控制器把DMABuffer中的音频数据发送至DACdigital-analogconverter设备播放。
从声卡设备读取音频数据时DMA控制器将ADCanalog-digitalconverter设备输入的音频数据写入DMABuffer。
随后应用程序通过驱动程序将DMABuffer的数据读入APPBuffer完成录音的过程。
DMABuffer的存在保证了音频数据的正常播放避免数据欠载现象发生。
但是由于DMABuffer填充过程需要消耗时间导致音频数据由声卡设备采集至写入声卡设备的过程有一段时间的延时降低了驱动程序在声音数据读写方面的实时性能。
为了提高声音数据读写的实时性能ALSA驱动程序采用了多缓冲机制。
多缓冲机制将DMABuffer分为一定数目的缓冲碎片Fragment。
向声卡设备写入音频数据时只要DMABuffer中的前两个Fragment被写满数据就可以以Fragment为单位被音频设备播放。
由声卡设备读取音频数据时只要DMABuffer中的第一个Fragment被写满数据就可以以Fragment为单位读入APPBuffer进行处理7。
对于特定的声卡设备而言DMABuffer的大小是固定的。
Fragment的大小和数目可以在执行读写操作之前进行设置。
设置的原则是在保证音频设备正常负荷的情况下Fragment的大小足够小以减少延时。
Fragment的数目足够多以防止数据欠载的情况出现。
在实际的系统中为了保证硬件设备工作的稳定性Fragment的大小和数目有一定限制对于Ep9302处理器的ALSA驱动Fragment最小容量为2048bytes最大数目为64个。
2.4应用程序设计应用程序采用多线程的程序设计方法实现为两个线程人机交互线程和音频数据实时处理线程。
应用程序实现框架如图3所示。
多线程的实现方式把人机交互任务和音频数据实时处理任务分离改善了整个程序的吞吐量以及各个任务的响应时间8。
应用程序代码结构如下intmainsystem_init//建立音频数据处理线程pthread_createaudio_thread_idNULLaudio_threadvoidaudio_datawhile1user_io//人机交互线程为了保证音频数据读写过程实时、连续音频处理线程应当具有较高的优先级程序代码要有较高的执行效率。
具体实现步骤描述如下1根据输入音频信号的类型、采样频率通过I2C总线配置音频信号预处理模块中的编码、解码芯片的寄存器至相应的工作模式。
2使用openaudio_devmode0系统调用打开声卡设备文件/dev/dsp并返回设备标示符。
通过ioctlaudio_devtypeinfo系统调用依次设置声卡设备的缓冲碎片的大小和个数、声道数量、采样格式和采样率。
至此Ep9302IIS控制器的相应时钟启动。
3使用readsound_devbufsize系统调用读取设备文件/dev/dsp将size字节数的音频数据读入内存。
为了保证声卡设备性能单次读写取音频数据的字节数目应等于所设定的缓冲碎片的大小。
4音频数据存储在内存空间延时时间的大小和音频数据占用内存空间的大小存在线性对应关系录制音频数据每秒所占用内存空间的比特数采样频率量化位数声道数5。
可以通过控制内存数据的更新情况精确地控制延时时间。
也可以通过相应算法对内存中存储的音频数据进行处理可以实现特殊的声音效果。
5使用writesound_devbufsize系统调用将内存中size字节数的音频数据写入声卡设备文件/dev/dsp实现音频数据的播放。
3测试延时精度是延时器性能的重要指标采用的测试方法如下将音频信号源和经过延时器处理后输出的同源音频信号接入PC声卡输入端通过音频分析软件AdobeAudition3分析两路音频信号的波形可以精确地计算出实际延时时间值。
经过多次测量得到测试数据如图4、图5所示。
图4数据表明由于声卡驱动的实现机制决定音频数据读写过程有15ms左右的延时所以目标延时时间小于15ms时实际延时时间大于目标延时时间分布在15ms左右。
目标延时时间大于20ms时实际延时时间趋于准确和目标延时时间的误差在4ms之内满足延时精度的要求。
图5数据表明目标延时时间大于100ms时实际延时间与目标延时时间的误差很小满足延时精度的要求。
图3应用程序YNNYY开始系统初始化初始化完成创建线程人机交互线程线程结束结束音频数据实时处理线程结束N下转第3412页341220103115计算机工程与设计ComputerEngineeringandDesign空间和数据复制的时间而未使用混合编程的计算速率则有下跌的趋势。
4结束语SMP集群在并行计算机中占得比重逐步增大寻找适合它的编程模型的研究也越来越多。
本文首次提出了MPICUDA多粒度混合并行编程的新方法利用此方法在搭建的3节点SMP集群环境中实现了大规模矩阵乘问题的多粒度混合并行计算。
实验证明MPICUDA混合编程模型为装有CUDA-enabledGPU的SMP集群提供了一种可行的并行方法能够充分发挥SMP集群节点间分布式存储和节点内共享存储的优势对于矩阵的阶数大于1000的大规模矩阵乘能够显著提高其并行效率。
参考文献:1刘伟峰杨权一曹邦功等.基于GPU的高度并行MarchingCubes改进算法J.微电子学与计算机2008259:151-157.2钱悦.图形处理器CUDA编程模型的应用研究J.计算机与数字工程20083612:177-180.3NVIDIACUDAcomputeunifieddevicearchitecture:program-mingguideZ.Version2.0beta22008.4王惠春朱定局曹学年等.基于SMP集群的混合并行编程模型研究J.计算机工程2009353:271-273.5陈勇陈国良李春生等.SMP机群混合编程模型研究J.小型微型计算机系统20042510:1763-1767.6向文刘青昆于方等.基于LAM-MPI和OpenMP的机群编程环境配置与应用J.大连民族学院学报20075:41-44.7赵永华迟学斌.基于SMP集群的MPIOpenMP混合编程模型及有效实现J.微电子学与计算机20052210:7-11.8MessagePassingInterfaceForum.MPI-2:Extensionstothemessage-passinginterfaceS.1997.9张锦雄.矩阵相乘并行算法
上一篇:
【精品文档】C语言编译器MINGW的使用说明(整理)
下一篇:
“温魅杯”会员我最红K歌大赛策划书