基于Linux QT掌上多媒体系统的设计和实现

发布者:平静的33号最新更新时间:2011-10-15 关键字:ARM  Linux  QT  掌上多媒体系统 手机看文章 扫描二维码
随时随地手机看文章

0 引言

    随着人们生活水平的提高,消费结构发生了巨大变化,消费者用于娱乐方面的支出在总支出中所占的比例正在不断扩大。掌上多媒体系统可以满足人们对于试听以及便携的需求,另外还可以实现一些其他功能,如图片浏览、网络下载、以及影音录制等。目前市场上的掌上多媒体系统多是Windows CE、Symbian、Palm OS等商用操作系统,其开放的程序不够高,而且价格偏高,不适于第三方应用软件的移植。ARM体系作为专用嵌入式系统设计的通用处理器内核,具备高性能、低功耗、易扩展的特点。本系统基于ARM9、嵌入式Linux操作系统设计并实现了一个更为开放的嵌入式平台,来实现掌上多媒体系统的诸多功能。

1 多功能掌上媒体播放器系统的硬件设计

    多功能掌上媒体播放器系统的硬件设计如图1所示。LCD采用的是Sharp的TFT屏,3.52in,分辨率240×320;音频控制器是IIS接口的音频控制器,解码芯片是UDA1314TS;另外扩展了用于视频录制的Philips的视频解码芯片SAA7113和ADI的JPEG压缩芯片。视频录制的框图如图2所示。

2 多功能掌上媒体播放器系统的软件设计

    系统设计和软件设计是本系统的难点。系统软件设计的总体框架如图3所示。

2.1 嵌入式Linux操作系统

    Linux最初由Linux Torvalds编写,后来在网络上被众多的Linux爱好者加以修改和维护,具有内核高效稳定、开源、可移植性强、内核可定制可裁剪、多线程多任务等特点,因此选择其作为本媒体播放器系统的操作系统。

    首先定制裁剪并移植了Linux2.6的内核,然后为使各硬件能正常工作编写了键盘驱动、LCD驱动、触摸屏驱动、音频驱动、USB驱动等驱动。多功能掌上多媒体系统的正常工作首先是进入ARM-Linux操作系统,然后加载各个硬件的驱动程序并初始化各外围设备,接着就进入基于QT/Embedded库的Qtopia桌面系统编写的GUI图形界面程序的播放器,最后选择要进行的操作。

    对于Linux内核的移植首先要移植bootloader,系统采用的是VIVI,其功能包括:分区管理、参数管理、启动Linux操作系统、文件系统管理、支持网络、通过串口下载程序到Flash或者RAM等。建立嵌入式开发环境,使得能够交叉编译源代码,对VIVI的源代码进行交叉编译,生成能在ARM Linux上运行的bin文件,通过开发板的JTAG口将其烧写到开发板的Flash中。

    对内核的移植首先要对内核进行修改MAKEFILE文件指定编译器以及目标平台,然后配置内核,交叉编译生成内核镜像,通过UART口(串口)下载到开发板上。移植相应的文件系统。文件系统中的文件是数据的集合,不仅包含着文件中的数据,而且还有文件系统的结构,所有Linux用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。在设计过程中把文件系统设置为可读写,这样操作性强一些,在投入到生产中的时候应该把文件系统设置为只读的,这样整个掌上多功能媒体播放器的操作系统就加载好了。

2.2 驱动程序的设计

    本系统共涉及到键盘驱动、触摸屏驱动、LCD驱动、音频驱动和USB驱动等驱动。因为多媒体功能是本系统的重点,所以播放器部分很重要,这里主要介绍音频驱动的编写。

    目前Linux下常用的音频驱动程序主要有两种类型:OSS(Open Sound System) 和ALSA。最早出现的Linux上的编程接口是OSS,它由一套完整的内核驱动程序模块组成,可为大多数音频芯片驱动提供统一的编程接口。在嵌入式系统中,对于特定的处理器(如本系统采用的S3C2410),可以按照OSS接口标准来编写音频驱动程序,以满足Linux上的应用程序。OSS接口已经足够简单,需要完成的主要的工作就是对音频设备(本系统采用的是Philips的UDA1314TS)的read,write和ioctl等操作。

    系统音频驱动主要是对UDA1314TS进行驱动编写,包括对UDA1314TS的L3接口的控制。首先初始化I/O和UDA1 314芯片,然后申请两个DMA(Direct Memory Access)通道用于音频传输(音频数据的发送和接收都通过一个先入先出的队列FIFO,但是只靠FIFO要保证音频的连续播放是很困难的,所以申请DMA通道来解决此问题)。OSS标准中由两个最基本的音频设备:混音器(Mixer)和数字信号处理器(DSP)又称编解码器,其中混音器主要用来控制输入输出音量的大小,只有open和release以及几个接管OSS标准的iotcl。而DSF设备驱动的方法比较复杂,主要包括open、release、read、write、poll、ioctl。其中主要在write和read方法中实现音频的播放和录音。以播放音频来说明DSP驱动程序的编写,对应了驱动程序中的open和write方法,它们利用DMA实现了音频的播放。在open中,首先判断设备打开的方法:读取、写入和读/写,分别对应音频的录音、播放以及录音同时回放,然后申请两个与音频DMA缓冲区相关的,在初始化DMA时要用到,最后程序可以根据设备打开模式的初始化S3C2410的工作模式,并清空所需的DMA缓冲区(在write方法被调用时创建)的数据结构,把它留给缓冲区创建。在这里,因为使用了两个DMA音频数据传输,DMA缓冲的建立发生在第一次调用wri te将音频数据传送到设备,而OSS驱动的调用者通常要在打开音频设备时就期望获得DMA缓冲的信息,然而因为缓冲尚未建立,会使得缓冲大小为0这个结果,解决办法时在两个与音频DMA缓冲区相关的程序部分一定不能少了以下代码:

    if(!output_stream.buffer&&audio_setup_buf(&out stream))
    return-ENOMEM;

    在Write方法中首先判断设备文件打开的方式,具有write特性打开的设备才可以写入,然后判断是否没有建立DMA缓冲区,若没有,则通过audio_setup_buf()来创建,定义一个结构体(audio_stream_t)的指针如下:


2.3 GUl程序的设计与播放器的实现

2.3.1 GUI程序的设计和实现

    播放器的图形界面在Qtopia视窗环境下运行,采用Qt/Embedded2.3.7作为底层图形库,用于生成用户界面。QT是一个跨平台的c++图形用户界面库,Qt/Embedded是面向嵌入式系统的版本,其最大的特点就是使信号和槽用于对象间的通信,Qt的窗口部件有多个预定义的信号,槽是一个可以被调用处理特定信号的函数。Qt的窗口部件有多个预定义的槽,当一个特定事件发生的时候,一个信号被发射,对应感兴趣的槽就会调用对应的相应函数。播放器界面主要包括主界面窗口、文件操作窗口、播放列表窗口。主界面窗口有一个显示屏和一些控制按钮,包括播放、暂停、快进、快退、下一首、上一首、音量调整以及播放进度条和播放时间显示。文件操作窗口可以使用户选择要播放的文件。播放列表用来播放最近播放的五个多媒体文件。

2.3.2 播放器的实现

    Linux下的播放器Mplayer是Linux上最优秀的多媒体播放器,它能够使用众多的编解码器,支持多种输出设备。可以播放市面上几乎所有的音视频格式。本系统选择其作为播放器,对其进行优化和移植。进行的优化主要有:

    (1)Mplayer在系统上运行的时候颜色会有偏差,因此编程校正Mplayer的色彩;

    (2)Mplayer正常模式不能在FramBuffer的中间显示,带-fs的全屏参数播放后,只能将播放位置移到中间,并不放大,修改播放显示位置,让它和Nplayer图形界面的调用相符合;

    (3)编程实现播放时对键盘事件正常化;

    (4)Mplayer采用的自带的mp3lib浮点音频解码库的解码效率很低,在播放音频时会很卡,通过采用使用定点运算的libmad音频解码库替代原来的mp3lib库进行音频解码;

    (5)使用Mplayer的-input选项,通过FIFO从GUI向后端程序传递控制信息。通过优化后,对Mplayer交叉编译,移植到系统上可以流畅地播放mp3等音频文件以及mpeg-1、mpeg-2、avi等视频格式。

2.4 影音录制

    影音录制的系统框架见图2。通过扩展用于视频录制的Philips的视频解码芯片SAA7113和ADI的JPEG压缩芯片来实现。首先输入的模拟视频信号经过SAA7113转换为数字信号,然后传输给ADI的JPEG压缩芯片JPEG2000,压缩为JPEG图像信号,并通过扩展的总线接口传输到系统上。音频信号则直接通过音频输入接口送到音频解码芯片,并转化为数字信号进行编码。编写应用程序使传到的音视频数字信号一起转化为Motion JPEG编码的AVI格式的多媒体文件,并存入扩展的存储设备(微硬盘或者MMC/SD卡),这样就可以被Mplayer播放。

3 性能优化

    尽管ARM9处理器主频可以高达200MHz以上,但是为了降低功耗,本系统在保证满足实时播放的前提下,对系统进行优化。所以,在一个资源受限的处理器上要实现多媒体文件的实时播放,性能优化成为关键。本系统主要通过解码程序优化,打开Cache等措施来提高系统性能。

3.1 对解码程序的优化

    由于解码过程绝大部分是计算,以MP3音频文件为例,其解码过程主要是高精度乘法和矢量运算,其中80%的CPU时间用于数值计算,因此对于解码部分主要采用了以下方法进行优化:

    (1)整数运算。在没有硬件浮点单元的CPU上,浮点运算是仿真方式,因此解码代码中应直接采用整数运算方式编码,而避免浮点运算;

    (2)通过查表方式代替很多运算式获取计算结果,对调用频繁的小函数采用inline修饰;

    (3)关键代码采用汇编语言编程,以获得更高效的目标代码,来提高系统的运行性能。

3.2 打开Cache

    ARM9处理器带有独立的16 kB数据Cache和16 kB的指令Cache。本系统中,打开指令Cache肯定能在一定程度上提高性能。至于数据Cache,由于从SD卡或者U盘读进来解码的数据使用完毕后就再也不会使用了,解码产生的数据也是一样,使用一次就会被丢弃,因此数据访问的时间局限性基本是不存在的。但是,系统在访问数据时存在很强的"空间局限性",所以打开数据Cache后可以提高性能,因为:

    (1)Cache和IDRAM之间通过Burst方式传递数据,提高了总线带宽,从而降低读数据的延迟。

    (2)Cache一次读128bit或256bit,当读已在Cache中的数据时就会命中。

    (3)通过WriteBuffer或WriteBack方式读内存时,没有写DRAM的延迟。

    但是这样也会带来数据不一致的问题,主要是DMA造成数据的不一致,因为SD卡或USB的传输是通过DMA进行的,其传输过程无需CPU干预,DMA操作直接访问内存,但不会跟新Cache和写缓存相应的内容,这样就造成了数据的不一致,可用以下方法解决:

    (1)将SD卡或USB和CPU共享的控制数据空间设置为uncachable,否则无法保证CPU读到的Cache中的数据是最新数据,从而可能造成系统运行错误。

    (2)SD卡或USB输入模块通过DMA像主存传输文件数据时,写数据的缓冲区是由文件系统提供的。该缓冲区的特点是存储空间比较大而且是顺序访问的,可将其设置为cachable。

    经过上述方法的优化以后,系统性能得到了大幅度的提高。经过测试表明,优化后解码所需的时间为优化前的15%左右,均小于正常播放所需的时间,完全满足实时播放的要求。

4 结束语

    本系统以ARM9处理器为核心建立嵌入式多媒体系统,并在其上移植Mplayer播放器,扩展其功能,使mpeg-1、mpeg-2、avi等视频格式以及MP3、WMA等音频格式都能在其上流畅地播放,并实现了影音录制功能。在测试中各模块工作正常,达到了能全屏播放视频,流畅播放音频,能够将摄像头拍到的视频传送到Mplayer进行播放,能读取外接U盘或者SD卡中的多媒体文件进行播放,能从网络下载多媒体文件到扩展存储设备被Mplayer播放的设计要求。随着多媒体技术的广泛应用,掌上多功能媒体播放器会有更广阔的应用前景。

关键字:ARM  Linux  QT  掌上多媒体系统 引用地址:基于Linux QT掌上多媒体系统的设计和实现

上一篇:基于ARM公司STM32的智能电机保护器设计
下一篇:恩智浦免费提供ARM微控制器使用的emWin图形库

推荐阅读最新更新时间:2024-03-16 12:43

三星采用ARM技术用于全球首台商用蓝光光碟播放器
ARM Jazelle 技术为三星蓝光光碟播放器带来互动多媒体加速性能 ARM 今天宣布:三星电子授权获得 ARM Jazelle 软件技术,用于市场上首台商用蓝光光碟播放器——三星 BD-P1000 。三星蓝光光碟播放器使消费者可以在 HDTV (高清电视)上欣赏高清晰度光碟( HD ),并通过 ARM Jazelle Java 加速技术实现先进的互动功能,享受超乎寻常的多媒体体验。蓝光技术是下一代 DVD 格式,受到全球 170 多 家领先的消费电子、个人电脑和多媒体设备厂商的支持。它的清晰度几乎是传统 DVD 的五倍,并大量使用 Java 来管理互动内容。 三星所授权获得的 ARM J
[焦点新闻]
MDK 中调试ARM出现硬件错误的问题
在不少项目中,发现总是出现硬件错误,运行到中断函数: /** * @brief This function handles Hard Fault exception. * @param None * @retval None */ void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ while (1) {} } 其原因是硬件上的问题造成,然而并不是说硬件设计有问题造成的。其实就是堆栈空间的设置不合理造成的,和MDK中全面变量被篡改是一样的。所以适当的修改堆栈空间就可以解决问题
[单片机]
ARM汇编语言程序结构示例
详细介绍ARM汇编语言之前,先给出一个汇编源程序示例,使读者对ARM汇编语言程序的结构有一个大概的了解。 CODE32 ;32位的ARM指令段 AREA codesec, CODE, READONLY ;代码段,名称为codesec,属性为只读 main PROC ;函数main STMFD sp!,{lr} ;保存必要的寄存器和返回地址到数据栈 ADR r0,strhello ;取标签strhello代表的地址值 BL _ printf ;调用C运行时库的_printf函数打印 ;“Hello world!”字符串 BL welcomefun ;调用子函数welcomfun LDMFD sp!,{pc} ;恢复寄存器值 st
[单片机]
ARM中断区别-LPC2142与S3C2440的区别
/*************************************************** *说 明 :ARM中断区别-LPC2142与S3C2440的区别 ***************************************************/ LPC 与三星ARM的区别就是三星固定了中断向量的地址,而LPC的就没有。例如三星的S3C2440 所有的中断源都有相对应的中断向量。 关于三星ARM (1)使用向量中断 ENTRY b ResetHandler ; 0x00 b HandlerUndef ; 0x04 b
[单片机]
如何在非实时linux上实现实时应用程序与内核模块之间共享存储器
linux并不是严格意义上的实时操作系统,为了实际需要,工程师们必须想尽办法来祢补这一不足,于是出现了rtlinux和rtai等并不强调商业性的软件。免费的rtlinux显然庞大而并不兼容大部分的嵌入式平台,最新版本的rtlinux也只能支持I386和PPC而已。Rtai是不错的选择,但要把它移植到你的平台上去,为了适应你的linux版本,你的CPU,你必须的花费许多的工作,比如说最近比较流行的AT91RM9200DK,光修改linux版本补丁就要花费许多的功夫。Rtlinux和rtai为了增强linux操作系统的实时性,主要是通过开辟内核模块与应用程序之间可以共享的内存快来实现的。它们在内核空间控制硬实时任务的运行,并通过一个名
[嵌入式]
ARM7&ARM9双核平台的技术分析
目前嵌入式系统教学平台市场上的主导产品都是基于ARM7或ARM9架构的,一般都认为ARM7属于低端产品、ARM9属于高端产品,也出现了所谓的“ARM7&ARM9覆盖高端&低端的教学平台”。宣传“两套 CPU 子板都是可以自由插拔,一套实验系统变化为两套, ARM7 的实验系统可以实现基础的 ARM 嵌入式教学,主要包括指令实验,基础接口实验, UCOS-II 操作系统实验和 uCLinux 操作系统实验; ARM9 的实验系统可以实现高端的 ARM 嵌入式教学,主要包括扩展接口实验, Linux 操作系统实验和 WinCE 操作系统实验。” 这种观点有误导用户的嫌疑。因为ARM9和ARM7同属于ARMv41,是属于中
[单片机]
Azure ARM (13) 从现有VHD文件,创建新的ARM VM
  本文参考了Git Hub的ARM Template:    https://github.com/Azure/azure-quickstart-templates/blob/master/201-vm-specialized-vhd-existing-vnet/azuredeploy.json   但是Git Hub上的Template不包含Availability Set   笔者修改了这个Template,可以设置高可用集Availability Set:    https://github.com/leizhang1984/AzureChinaPowerShell/tree/master/ARM/VMSpecial
[单片机]
Azure <font color='red'>ARM</font> (13) 从现有VHD文件,创建新的<font color='red'>ARM</font> VM
linux-at91——sama5d3.dtsi
/* * sama5d3.dtsi - Device Tree Include file for SAMA5D3 family SoC * applies to SAMA5D31, SAMA5D33, SAMA5D34, SAMA5D35, SAMA5D36 SoC * * Copyright (C) 2013 Atmel, * 2013 Ludovic Desroches ludovic.desroches@atmel.com * * Licensed under GPLv2 or later. */ #include skeleton.dtsi #include dt-bind
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved