linux下MP3实现与设计文档.doc

上传人:marr****208 文档编号:156944155 上传时间:2020-12-20 格式:DOC 页数:33 大小:549.50KB
返回 下载 相关 举报
linux下MP3实现与设计文档.doc_第1页
第1页 / 共33页
linux下MP3实现与设计文档.doc_第2页
第2页 / 共33页
linux下MP3实现与设计文档.doc_第3页
第3页 / 共33页
linux下MP3实现与设计文档.doc_第4页
第4页 / 共33页
linux下MP3实现与设计文档.doc_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《linux下MP3实现与设计文档.doc》由会员分享,可在线阅读,更多相关《linux下MP3实现与设计文档.doc(33页珍藏版)》请在金锄头文库上搜索。

1、 苏嵌教育 项目名称:linux下MP3的设计与实现 组长姓名: 李 昀 组员姓名:黄文钦 张欣 刘勇军 指导教师: 梁 庚 目 录摘 要3第一章 绪论41.1.研究背景.41.2研究内容4第二章 开发环境5第三章 应用技术53.1.linux下的设计和用户界面53.2.linux下的编程53.3.多线程的概念6第四章 工作原理9第五章 系统设计105.1.嵌入式系统概述45.2.硬件特性55.3.嵌入式操作系统和应用软件5 5.4.嵌入式系统开发模式5第六章 开发板平台搭建10第七章 详细设计与实现11 7.1.流程图117.2.主要功能模块实现13第八章 源代码17第九章 总结与展望68第

2、十章 参考文献及声明69摘 要随着消费类电子产业的蓬勃发展,越来越多的嵌入式电子产品走进了千家万户。电脑的形态也不再局限于以前的PC机,各式各样的嵌入式系统出现在了众多的行业和应用中,其中ARM和Linux结合的产品在市场上最受青睐。ARM由于其低功耗、高性能、小体积、低成本受到了越来越广泛的重视,成为众多公司产品开发的主流硬件。而Linux则因其开放的源代码,可裁剪的内核,便利的开发环境,各硬件平台的通用性,逐渐成为嵌入式开发的主流操作系统。本项目的嵌入式MP3设计就是基于ARM和linux平台的。本课题实现了一个完整的嵌入式系统,选用s3c2440开发板为目标平台,linux作为目标操作系

3、统,在这样的软硬件环境下研究实现MP3播放器。文章首先综述了嵌入式系统开发方法,介绍了ARM处理器及其特点,Linux操作系统,嵌入式系统的开发模式以及如何搭建交叉开发环境,然后介绍了所选硬件平台s3c2440目标板的各种资源,在系统软件开发中,介绍Uboot、Linux的裁剪和移植,根文件系统的制作以及核心驱动程序的开发,应用程序开发中,介绍了MP3的原理,移植Madplay MP3播放器,最后成功对Madplay播放器实现了综合控制。第一章 绪论11研究背景随着现代社会逐渐进入信息时代,信息技术正以前所未有的速度应用到现代社会生活的方方面面,改变着人们的衣食住行,对人类社会政治、经济、军事

4、和文化等各方面都产生了深远的影响。信息技术的发达程度已经成为衡量一个国家实力的重要标尺,这也是当今社会各个国家都在不遗余力的支持和发展的一个产业。进入20世纪80年代,随着超大规模集成电路技术的发展,处理器的性能不断增长,在摩尔定律的指引下,集成电路的规模每隔18个月增加一倍,性能也提升一倍,并且随着PC的价钱逐渐降低,以前高不可攀的昂贵的PC也飞入了寻常百姓家。在PC极大推动信息的技术发展的同时,消费类电子产品也因其新颖、便携的特点受到越来越多人的关注和青睐,其随时随地都能提供计算能力以及超轻便长续航能力的特点使其能用于以前其控制不到的地方,成为Pc之后IT市场的又一增长点,并且极大助力了市

5、场的增长。肝3作为一种音频格式,将以前CD格式的容量压缩到十分之一,而音质却相差无几,为其在网络的传播打下了坚实的基础,随着闪存式仲3播放器的出现,其较好的音质,良好的便携性使人们随时随地可以欣赏高品质音乐的要求得到了满足。之前的MP3播放系统大都基于多芯片设计,随着ARM器件性能的不断提升,以前需要两块甚至多块芯片才能处理的数据,现在大都可以通过单块ARM芯片完成,在降低系统成本的同时,还简化了系统的设计过程。而且,嵌入式linux操作系统的出现,使得应用软件的开发也变得相对简单,由于linux天生的多平台兼容性,使其移植到ARM平台相对简单,再加上其可裁剪的优点,裁剪后精简的体积使其能够更

6、好的满足嵌入式系统这种特殊硬件环境的要求,因此,嵌入式l inux成为当前嵌入式开发的主流系统。1.2研究内容本课题将MP3技术与嵌入式Linux技术相结合,选用三星公司的S3C2410处理器,实现了MP3文件的软解码播放。ARM920处理器及嵌入式Linux系统的优越性能,有力保证了系统功能。本课题的主要研究内容包括:1、了解嵌入式Linux的工作原理,掌握嵌入式Linux的移植方法。2、了解主流Bootloader Uboot的工作原理。3、掌握嵌入式Linux字符设备驱动程序开发方法。4、掌握嵌入Linux下应用程序的开发、编译、调试、执行技术。5、掌握MP3播放程序madplay的移植

7、与测试。拟解决的关键问题:嵌入式linux的移植裁剪按键驱动程序设计及测试MadPlay MP3播放程序移植及测试第二章 开发环境搭建 开发我们主要在虚拟机下的红旗linux系统实现的。第三章 主要相关技术介绍3.1 Linux的设计和用户界面基于Linux内核的系统是一种模块化的类Unix系统。它继承了Unix在上纪70、80年代发展起来的基本设计原则。这种系统使用单内核(与此相对应的是使用微内核的Windows)来处理进程控制、网络连接、外设和文件访问等应用。设备驱动和内核直接集成在一起。与内核交互的单独项目提供了系统的高级别功能。GNU用户区(userland)是大多数基于Linux系统

8、的重要组成部分,它提供了最多的C库的常用实现,比如shell和一些其它的Unix工具。这些工具可以处理一些基本任务。基于Linux的系统可以用命令行(CLI)、图形用户界面(GUI通常也是系统的默认设置)等方式进行控制。在嵌入式设备上,也可以用设备本身的控制器进行控制。在桌面系统上,虽然存在很多图形用户界面,但GNOME、KDE和Xfce是其中最流行的。大多数流行的用户界面运行于X Window系统之上,它提供了网络透明性,可以让一台机器上的图形界面来控制另一台机器上运行的程序。当然,它也可以控制本机上的程序,这就是Linux 图形用户界面的实现策略。也就是说,天生就考虑到了远程控制。用远程控

9、制的思想来操纵本机上的程序,这对于Linux在大规模集群中的应用非常重要。3.2 Linux下的编程大多数Linux发行版支持几十种编程语言。对于Linux用户程序和Linux操作系统本身来说,最常用的工具是同样的GNU工具链,它包括GNU编译器集合(GNU Compiler Collection, GCC)和GNU build system。Linux内核本身就是使用GCC编译的。GCC支持的语言非常广泛,其中就包括Ada、C、C+、Java和Fortran,但最重要的是C。GCC的原名叫做GNU C Compiler,是Richard Stallman专门为C语言开发的自由编译器。本文中的

10、程序也将完全基于C语言。大多数发行版也包括了对Perl、 Ruby、ython等动态语言的支持,还支持一些不大广泛使用的语言,这里的一个例子是通过Mono项目提供了对C#的支持。许多Java虚拟机和开发包也可以在Linux上使用,包括原版的Sun Microsystem JVM(HotSpot),以及IBM的J2SE RE,还有很多开源的项目例如KaffeError! Reference source not found.。 两个开发图形用户界面程序的主要框架是GNOME和KDE。这两个项目分别基于GTK和Qt widget toolkits。GTK和Qt widget toolkits也可以

11、单独使用(本文中就是单独使用GTK,而不依赖于GNOME环境)。这两种框架都支持多种开发语言。Error! Reference source not found.Linux中还有很多集成开发环境,如Anjuta、ode:Blocks、Ecpse、Kvelop、KnoDevelop、NBeans和Omnis Studio。但历史悠久的两大编辑器,将在本文中使用的Vim和另一种Emacs还是很流行。3.3多进程的概念(一) 理解下进程的结构 Linux下一个进程在内存里有三部份的数据,就是“数据段”,“堆栈段”和“代码段”,其实学过汇编 语言的人一定知道,一般的CPU象I386,都有上述三种段寄存

12、器,以方便的运行。“代码段”,顾名 思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。 堆栈段存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。而数据段则存放程序的全局 变量,常数以及动态数据分配的数据空间(比如用malloc之类的函数取得的空间)。这其中有许多细节问题, 这里限于篇幅就不多介绍了。系统如果同时运行数个相同的程序,它们之间就不能使用同一个堆栈段和数据 段。(二) 如何使用fork 在Linux下产生新的进程的系统调用就是fork函数,这个函数名是英文中“分叉”的意思。为什么取这个 名字呢?因为一个进程在运行中,如果

13、使用了fork,就产生了另一个进程,于是进程就“分叉”了,所以这 个名字取得很形象。 那么调用这个fork函数时发生了什么呢?一个程序一调用fork函数,系统就为一个新的进程准备了前述三 个段,首先,系统让新的进程与旧的进程使用同一个代码段,因为它们的程序还是相同的,对于数据段和堆栈 段,系统则复制一份给新的进程,这样,父进程的所有数据都可以留给子进程,但是,子进程一旦开始运行, 虽然它继承了父进程的一切数据,但实际上数据却已经分开,相互之间不再有影响了,也就是说,它们之间不 再共享任何数据了。而如果两个进程要共享什么数据的话,就要使用另一套函数(shmget,shmat,shmdt等) 来操

14、作。现在,已经是两个进程了,对于父进程,fork函数返回了子程序的进程号,而对于子程序,fork函数 则返回零,这样,对于程序,只要判断fork函数的返回值,就知道自己是处于父进程还是子进程中。 读者也许会问,如果一个大程序在运行中,它的数据段和堆栈都很大,一次fork就要复制一次,那么fork 的系统开销不是很大吗?其实自有其解决的办法,大家知道,一般CPU都是以“页”为单位分配空间的, 象INTEL的CPU,其一页在通常情况下是4K字节大小,而无论是数据段还是堆栈段都是由许多“页”构成的, fork函数复制这两个段,只是“逻辑”上的,并非“物理”上的,也就是说,实际执行fork时,物理空间

15、上两 个进程的数据段和堆栈段都还是共享着的,当有一个进程写了某个数据时,这时两个进程之间的数据才有了区 别,系统就将有区别的“页”从物理上也分开。系统在空间上的开销就可以达到最小。(三) 如何启动另一程序的执行 下面我们来看看一个进程如何来启动另一个程序的执行。在Linux中要使用exec类的函数,exec类的函数 不止一个,但大致相同,在Linux中,它们分别是:execl,execlp,execle,execv,execve和execvp,下面 我只以execlp为例,其它函数究竟与execlp有何区别,请通过manexec命令来了解它们的具体情况。 一个进程一旦调用exec类函数,它本身就“死亡”了,系统把代码段替换成新的程序的代码,废弃原有

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号