版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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类函数,它本身
16、就“死亡”了,系统把代码段替换成新的程序的代码,废弃原有的 数据段和堆栈段,并为新程序分配新的数据段与堆栈段,唯一留下的,就是进程号,也就是说,对系统而言,还是同一个进程,不过已经是另一个程序了。(不过exec类函数中有的还允许继承环境变量之类的信息。) 那么如果我的程序想启动另一程序的执行但自己仍想继续运行的话,怎么办呢?那就是结合fork与exec的 使用。 熟悉和系统 调用的朋友一定知道DOS/WINDOWS也有exec类函数,其使用方法是类似的,但DOS/WINDOWS还有spawn类函数, 因为DOS是单任务的系统,它只能将“父进程”驻留在机器内再执行“子进程”,这就是spawn类的
17、函数。 WIN32已经是多任务的系统了,但还保留了spawn类函数,WIN32中实现spawn函数的方法同前述UNIX中的方法 差不多,开设子进程后父进程等待子进程结束后才继续运行。UNIX在其一开始就是多任务的系统,所以从核 心角度上讲不需要spawn类函数。 另外,有一个更简单的执行其它程序的函数system,它是一个较高层的函数,实际上相当于在SHELL环境 下执行一条命令,而exec类函数则是低层的系统调用。(四) Linux的进程与Win32的进程/线程有何区别 熟悉WIN32编程的人一定知道,WIN32的进程管理方式与UNIX上有着很大区别,在UNIX里,只有进程的概念 ,但在WI
18、N32里却还有一个“线程”的概念,那么UNIX和WIN32在这里究竟有着什么区别呢? UNIX里的fork是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面, 它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。 WIN32里的进程/线程是继承自OS/2的。在WIN32里,“进程”是指一个程序,而“线程”是一个“进程” 里的一个执行“线索”。从核心上讲,WIN32的多进程与UNIX并无多大的区别,在WIN32里的线程才相当于UNIX 的进程,是一个实际正在执行的代码。但是,WIN32里同一个进程里各个线程之间是共享数据段
19、的。这才是与 UNIX的进程最大的不同。 下面这段程序显示了WIN32下一个进程如何启动一个线程:(请注意,这是个终端方式程序,没有图形界面 ) D WINAPI ChildProcess LPVOID lpParameter printf This is Child Thread: %dn, g ExitThread 0 int threadID CreateThread NULL, 0, ChildProcess, NULL, 0,threadID printf This is Parent Thread: %dn, g 在WIN32下,使用CreateThread函数创建线程,与UNIX
20、不同,线程不是从创建处开始运行的,而是由 CreateThread指定一个函数,线程就从那个函数处开始运行。此程序同前面的UNIX程序一样,由两个线程各打 印1000条信息。threadID是子线程的线程号,另外,全局变量g是子线程与父线程共享的,这就是与UNIX最大 的不同之处。大家可以看出,WIN32的进程/线程要比UNIX复杂,在UNIX里要实现类似WIN32的线程并不难,只 要fork以后,让子进程调用ThreadProc函数,并且为全局变量开设共享数据区就行了,但在WIN32下就无法实 现类似fork的功能了。所以现在WIN32下的C语言编译器所提供的库函数虽然已经能兼容大多数UNI
21、X的库函数, 但却仍无法实现fork。 对于多任务系统,共享数据区是必要的,但也是一个容易引起混乱的问题,在WIN32下,一个程序员很容 易忘记线程之间的数据是共享的这一情况,一个线程修改过一个变量后,另一个线程却又修改了它,结果引 起程序出问题。但在UNIX下,由于变量本来并不共享,而由程序员来显式地指定要共享的数据,使程序变得 更清晰与安全。 Linux还有自己的一个函数叫clone,这个函数是其它UNIX所没有的,而且通常的Linux也并不提供此函数 (要使用此函数需自己重新编译内核,并设置CLONE_ACTUALLY_WORKS_OK选项),clone函数提供了更多的创建 新进程的功能
22、,包括象完全共享数据段这样的功能。 至于WIN32的“进程”概念,其含义则是“应用程序”,也就是相当于UNIX下的exec了。第四章 工作原理第五章 系统设计综述5.1 嵌入式系统概述嵌入式系统是以应用为中心、以计算机技术为基础、软件硬件可裁剪、对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它包括硬件和软件两部分。在嵌入式系统中,计算机系统一般作为智能终端控制部件嵌入到整个应用系统中,是整个系统的控制中心,主要用于对系统的信息处理部件和用户交互界面加以控制。在这种情况下,用户并不知道嵌入式系统的存在,系统控制软件一般被固化在嵌入式计算机中,嵌入式计算机一般不需要被用户重新编程,通
23、过特殊的输入、输出设备与系统进行交互。任何嵌入式系统都包括硬件和软件两个方面。硬件包括处理器微处理器、存储器及外设器件和IO端口、图形控制器等。软件部分包括操作系统软件(OS)(要求实时和多任务操作)和应用程序。应用软件控制着嵌入式系统的运作和行为,而操作系统则为应用程序提供必要的底层支持,它一般是通过提供应用编程接口(API)来实现的。因为嵌入式系统是面向应用、产品和用户的,具体的应用将决定对硬件和软件的需求,如芯片、存储器、IO扩展和操作系统、应用程序编制等。和通用计算机不同,嵌入式系统的硬件和软件都必须高效率的设计,量体采用,去除冗余,尽量以最小的系统、最低的成本去实现目标功能。它通常都
24、具有低功耗、体积小、集成度高等特点,能够把通用CPU中许多由板卡完成的任务集成在芯片内部,从而有利于嵌入式系统设计趋于小型化,移动能力大大增强,跟网络的结合也越来越紧密。5.2 硬件特性嵌入式系统总是面向特定应用的,与通用Pc的硬件相比,它的硬件系统具有以下特性:对实时多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时内核的执行时间减少到最低的限度。具有功能很强的存储区保护功能。这是由于嵌入式系统的软件结构已模块化,为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断。可扩展的处理器结构,以便能够迅速地开发出满足各种应用
25、需求的高性能嵌入式微处理器。5.3 嵌入式操作系统和应用软件嵌入式操作系统是支持嵌入式系统应用的操作系统软件,它是嵌入式系统极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。与通用操作系统相比较,嵌入式操作系统在系统实时高效性、硬件的依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。嵌入式操作系统的出现,将大大提高嵌入式系统开发的效率,改变以往嵌入式软件设计只能针对具体的应用从头做起。在嵌入式操作系统之上开发嵌入系统将减少系统开发的工作量,增强嵌入式应用软件的可移植性,使嵌入式系统的开发方法更具科学性。嵌入式计算机系统同
26、通用型计算机系统相比具有以下特点:嵌入式软件的研发与硬件紧密相关。由于嵌入式软件的开发是针对具体硬件平台进行的,硬件驱动方面的开发是软件开发的重要一部分。软件代码高效率和高可靠性。由于嵌入式系统中软件运行空间有限,内存,因此在软件的编译过程中必须时刻注意软件的运行效率,并选用高质量的编译工具。嵌入式软件还具有异常处理、快速复位等特点。为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。嵌入式系统本身不具备自举开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发。嵌入式系统具有不同程
27、度的实时性要求;嵌入式系统在体积、功能、能耗等方面受工作环境和生产成本的限制;嵌入式系统的软硬件环境复杂多变,需要操作系统根据这些环境实现可移植性、可配置性和可裁减性,以便能灵活地适应不同应用需要,而linux具有的种种优点,使其特别适合嵌入式的系统开发。5.4 嵌入式系统开发模式嵌入式系统的设计可以分为硬件平台设计,软件平台设计。通过软件在硬件系统的运行来验证硬件系统功能和设计的正确性。操作系统的移植和驱动程序测试需要应用程序配合。而应用程序的测试则按照软件工程理论测试的方法来进行。5.4.1 硬件平台设计系统选用$3c2410处理器芯片作为MCU。本系统以$3c2410处理器芯片为核心,配
28、备NOR Flash、SDRAM、USB接口、串口转换等芯片完成系统所要求的核心模块。5.4.2 软件平台设计Linux以其内核稳定、功能强大、支持多种硬件平台、应用软件繁多、兼容性好、低廉的价格以及众多开发人员的维护成为嵌入式操作系统的首选。同时硬件平台众多的存储器资源为运行Linux提供了强大的物质基础。软件平台一般包括如下四部分:1Boot Loader引导程序。能实现系统的快速引导,首先完成对CPU环境的最初初始化,如:芯片引脚、外部控制器、输入输出设备等,然后负责将Linux内核加载到内存,将控制权交给内核初始化程序。具体工作包括:寻找或将指定的内核映像文件解压至内存,然后解压文件系
29、统,将控制权移交给内核。2Linux内核。Linux是一个单一内核操作系统,但可以动态装入和卸载内核中的部分源代码。Linux内核由内存管理、进程管理、定时器中断管理、模块管理、虚拟文件系统、接口文件系统、设备驱动程序、进程间通信、网络管理、系统启动等构成。3设备驱动程序。设备驱动程序是内核的一部分,它像内核中其它代码一样运行在内核模式。Linux设备驱动程序的主要功能有:对设备进行初始化;使设备投入运行和退出服务;从设备接收数据并将它们送回内核;将数据从内核送到设备;检测和处理设备出现的错误。4应用程序。嵌入式应用软件是针对特定应用领域,基于某一固定的硬件平台,用来达到用户预期目标的计算机软
30、件,由于用户任务可能有时间和精度上的要求,因此有些嵌入式应用软件需要特定嵌入式操作系统的支持。嵌入式应用软件和普通应用软件有一定的区别,它不仅要求其准确性、安全性和稳定性等方面能够满足实际应用的需要,而且还要尽可能地进行优化,以减少对系统资源的消耗,降低硬件成本。5.4.3 调试环境的建立嵌入式系统通常为一个资源受限的系统。直接在此嵌入式系统的硬件平台上编写软件是不可行的。因此采用的办法是,先在通用计算机上编写程序,然后,通过交叉编译,生成目标平台上可运行的二进制代码,最后通过串口或者网口下载到目标平台上的特定位置上运行,具体步骤如下:第一步,建立嵌入式Linux交叉开发环境。采用开放的交叉开
31、发环境,典型的代表是GNU工具链,目前已经能够支持X86、ARM、MIPS、PowerPC等多种处理器。交叉开发环境是指编译、链接和调试嵌入式应用软件的环境。它与运行嵌入式应用软件的环境有所不同,采用宿主机目标机模式。第二步,交叉编译和链接。在完成嵌入式软件的编码之后,进行编译和链接,生成可执行代码。开发过程是在Intel公司X86系列CPU的通用计算机上进行,而本课题目标环境的处理器芯片为ARM微处理器,这要求在建立好的交叉开发环境中进行交叉编译和链接。本系统基于ARM体系结构,采用gcc交叉编译工具。嵌入式系统在链接过程中通常都要求使用较小的函数库,以便最后产生的可执行代码能够尽可能地小,
32、因此实际运用时一般使用经过特殊处理的函数库。对于嵌入式系统来讲,功能越来越强、体积越来越大的C语言函数库glibc和数学函数库libm已经很难满足实际的需要,因此需要采用它们的简化版本uClibc、uClibm和newlib等。第三步,交叉调试。调试是软件开发过程中必不可少的一个环节,而在嵌入式软件开发中,调试时采用的是在宿主机和目标机之间进行的交叉调试,调试器仍然运行在宿主机的通用操作系统之上,但被调试的进程却是运行在基于特定硬件平台的嵌入式操作系统中,调试器和被调试进程通过串口或者网络进行通信,调试器可以控制、访问被调试进程,读取被调试进程的当前状态,并能够改变被调试进程的运行状态。硬件调
33、试。编制程序使CPU直接在其内部实现调试功能,并通过在开发板上引出的调试端口,发送调试命令和接收调试信息,完成调试过程。软件调试。在嵌入式系统的整个开发过程中,不同层次上的软件调试需要使用不同的调试方法。在嵌入式Linux系统中,Linux系统内核调试,可以先在Linux内核中设置一个调试桩(debug stub),用作调试过程中和宿主机之间的通信服务器。然后,可以在宿主机中通过调试器的串口与调试桩进行通信,并通过调试器控制目标机上Linux内核的运行。嵌入式上层应用软件的调试可以使用本地调试和远程调试两种方法。如果采用的是本地调试,首先要将所需的调试器移植到目标系统中,然后就可以直接在目标机
34、上运行调试器来调试应用程序了;如果采用的是远程调试,则需要移植一个调试服务器到目标系统中,并通过它与宿主机上的调试器共同完成应用程序的调试。在嵌入式Linux系统的开发中,远程调试时目标机上使用的调试服务器通常是gdbserver,而宿主机上使用的调试器则是gdb。两者相互配合共同完成调试过程。第四步,系统测试。测试技术指的是软件测试的专门途径,以及能够更加有效地运用这些途径的特定方法。在嵌入式软件测试中,常常要在基于目标机的测试和基于宿主机的测试之间做出折衷。基于目标机的测试需要消耗较多的时间和经费,而基于宿主机的测试虽然代价较小,但毕竟是在仿真环境中进行的,因此难以完全反映软件运行时的实际
35、情况。这两种环境下的测试可以发现不同的软件缺陷,关键是要对目标机环境和宿主机环境下的测试内容进行合理取舍。嵌入式软件测试中经常用到的测试工具主要有:内存分析工具、性能分析工具、覆盖分析工具、缺陷跟踪工具等,这一部分不是本项目的重点,不作详述。第六章 开发板环境搭建6.1 Madplay的移植madplay 是友善之臂移植的一个基于控制台下的mp3 播放器。它有多种播放控制模式,可以运行“madplay -h”查看其使用帮助。其移植过程主要包括源代码的获取,相应库的安装,详细过程如下所示:(1)准备源代码。可以到http : //project/showfiles.
36、php?qroup id=12349 下载Madplay源代码和相关依赖包:Madplay-0.15.2b.tar.gzLibid3tag-0.15.2b.tar.gzlibmad-0.15.2b.tar.gz(2) 安装zlib-1.2.3。新建目录install。作为库文件的安装路径。解压zlib-1.2.3.tar.gz,在当前目录下生成的zlib-1.2.3目录就是zlib-1.2.3源代码所在路径。$ mkdir install$ tar xzvf zlib-1.2.3.tar.gz编译zlib-1.2.3。进入zlib-1.2.3目录,在交叉编译时需要修改Makefile文件的CC
37、=arm-linux-gcc,profix=$(PWD)/install,然后进行编译。$ make$ make install(3) 编译安装Libid3tag-0.15.2b。解压Libid3tag-0.15.2b.tar.gz,在当前目录下生成的Libid3tag-0.15.2b目录就是安装目录。使用configure命令配置库编译选项,包括C编译器、编译选项、链接选项和安装路径等,然后用ARM编译工具交叉编译libid3,将编译好的库安装到指定目录下,然后用以下目录安装到指定目录下。$ make$ make install(4) 编译安装libmad-0.15.2b。解压libmad-
38、0.15.2b.tar.gz,在当前目录下生成的libmad-0.15.2b就是安装路径。使用configure命令配置库编译选项,包括C编译器、编译选项、链接选项和安装路径等,然后用ARM编译工具交叉编译libid3,将编译好的库安装到指定目录下,然后用以下目录安装到指定目录下。$ make$ make install(5)可执行文件的拷贝编译成功后生成的可执行文件madplay/opt/FriendlyARM/mini2440/madplay/target-arm/bin目录下,编译成功后生成的madplay的库文件/opt/FriendlyARM/mini2440/madplay/tar
39、get-arm/lib目录下。将可执行文件放到开发板的/usr/bin目录下将madplay的库文件放到开发板的/usr/lib目录下方法:u盘,nfs,ftp等。(6)madplay在开发板上的测试最简单的测试方法在开发板终端输入“madplay XXXX. mp3”,此时将以缺省模式播放XXXX. mp3。在文件系统的“/root/Documents”下存放一首名为Test.mp3,输#madplay/root/Documents/Test.mp3,就能听到美妙的歌曲了。图4.1 使用madplay播放MP3格式的歌曲6.2 u-boot的移植1. 首先格式化nand flash;在viv
40、i界面下 输入f;2.将已经制作好的uboot.bin烧写到nand flash 的 bootloader 分区 (1):在vivi界面下输入q 进入命令界面: (2):在vivi界面下输入part show 查看 nand flash 的分区情况: (2):在vivi界面下输入命令 load flash 0 0x u 将uboot.bin 烧写到nand flash 的boot loader 分区: (3):烧写完成后,使mini2440开发板从 nand flash 启动: 3.将制作好的uImage 烧写到 nand flash 对应的内核分区:(1):运行命令“tftp 0x 192.
41、168.1.1:uImage”,将内核镜像uImage 下载到内存 0x地址处: (2):运行命令 “nand erase 0x 0x”檫除 nand flash 中位于0x60000地址处的整个kernel 分区:(3):运行命令“nand write 0x 0x ”将位于0x出的内核镜像烧写到nand flash的整个内核分区:4.将制作好的uImage 烧写到 nand flash 对应的root分区:(1):运行命令“tftp 0x :rootfs.img”,将rootfs镜像rootfs.img 下载到内存 0x地址处:(2):运行命令 “nand erase
42、0x 0x010dd0000”檫除 nand flash 中位于0x地址处的大小为10dd000的root 分区:同时运行命令 “nand write 0x 0x 10dd000”写入 nand flash 中位于0x地址处的大小为10dd000的root 分区:5.设置环境变量以及开机启动参数6.加载运行成功第七章 程序的详细设计与实现7.1 流程图7.2 主要功能模块实现第八章 源代码/* Fliename : new_mp3.c Author : group Data : 2011.8 Description : 实现音乐的播放,顺序播放,可以切换上一曲、下一曲 暂停、继续,可以调节音量
43、 Function list : remind() */#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define START 1#define PAUSE0#define YES1#define NO0 int iLeft = 60; /*定义音频左值*/int iRight = 20;int remind() /*提示界面*/printf(*Mp3
44、Player*n);printf(_remind information_n);printf( k1 start/overn);printf( k2 stop/resumen);printf( k3 next songn);printf( k4 prior songn);printf( k5 voice upn);printf( k6 voice downn);printf(_n);struct song /*歌曲结构题*/pid_t id;char music_name30; /* 文件名 */struct song *next; /* 下一首 */ struct song *prior;
45、/* 上一首 */ ;struct song *p1,*p2,*head;struct song *shm_buf; /*共享内存的buffer*/int shmid; /*共享内存 ID */int NameLen;pid_t ChildPid; /*子进程ID*/int ContinuePauseFlag = PAUSE; /*暂停*/struct tm *ptr;time_t t; /*获取时间*/void *shm_memory = (void *)0;/* Function : song *create_mp3_list Description : 创建歌曲链表 Call : fop
46、en(),strcpy() Call by : main() */struct song *create_mp3_list(void)FILE *list_fd; /* 文件指针 */ size_t size; /*读取文件中信息成功的返回值*/size_t len;struct song *p;char *line = NULL;system(ls /home/mp3/songsong_list); /* 打开文件 并做出错判断 */if(list_fd = fopen(song_list.txt,r) = NULL)perror(open song list failure!n);exit
47、(1);/* 为p1分配内存 */p1 = (struct song *)malloc(sizeof(struct song);if(NULL = p1) /*进行分配检查*/printf(malloc error!n);exit(0); /* 将文件中的len个字符传到字符指针中 一行一行的读取*/size = getline(&line,&len,list_fd);/* 将line复制到p1的music_name中 */strncpy(p1-music_name,line,strlen(line);head = p1;/* 陆续的从文件中读取数据将其插入到歌曲链表中 双向循环链表*/while(size =getline(&line,&len,list_fd) != -1) p2 = p1;p1 = (struct song *)malloc(sizeof(struct song);strncpy(p1-music_name,line,strlen(line);p2-next = p1;p1-prior = p2;p1-ne
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024行政处罚委托与投诉处理合作协议3篇
- 第3课-第1单元课题2-化学是一门以实验为基础的科学-【暑假先学】2022年新九年级化学新课知识梳
- 制药行业生产流程总结
- 医疗行业的权利下放与管理实践
- 美容客服工作总结
- 零售行业销售员工作总结
- 家电维修员工作总结
- 商业策略在学院专业国际竞赛中的运用与反思
- 小型餐饮店面的装修与布局优化策略
- 2024影视拍摄户外场地租赁标准协议版B版
- (高速公路)工程施工便道施工方案-
- 电磁阀培训(精选)课件
- 家禽常用原料代谢能估测表
- 古代诗歌鉴赏思想内容ppt
- 初一上学期期末测试卷英语
- 上海沃陆变频器VL600型变频器说明书概要
- 2023年高考物理一轮复习:抛体运动与圆周运动(附答案解析)
- VRV空调技术要求和质量标准
- Q∕GDW 10721-2020 电力通信现场标准化作业规范
- 公安警察工作汇报PPT模板课件
- 直肠癌个案护理范文结肠癌个案护理.doc
评论
0/150
提交评论