《嵌入式Linux软件设计》
课程设计报告
姓名   
学号
班级
题目mp3播放器madplay在ARM上的移植
成绩
评语
日期
项目名称:mp3播放器madplay在ARM实验箱上的移植
项目需求分析:
基本功能:在实验箱上实现MP3文件的播放。
实现方法:
硬件:PC机1台   
软件:Linux操作系统、嵌入式Linux开发环境、madplay-0.15. 、libid3tag-0.15. 、libmad-0.15. 、zlib-1.2.
在PC机上交叉编译生成静态链接的可执行文件madplay,通过nfs方式将madplay和mp3文件放在实验箱上并运行,实现mp3文件的播放。
项目分工:单人完成
概要设计:
软硬件流程图如图所示:
Ubuntu虚拟机
ARM9超级终端
GNU交叉编译
ARM实验板
预处理
汇编
编译
链接
.C源程序
    NFS
预处理器交叉编译器汇编器连接器
先编译madplay所依赖的库,再编译生成可执行文件madplay。首先编译三分之一理想zlib-1.2.3因为libid3tag-0.15.1b的安装依赖这个库文件。然后libid3tag-0.15. 、libmad-0.15. 、 madplay-0.15. 均采用静态编译。
详细设计:
1.解压源代码包到/madplay
# tar -zxvf zlib-1.2.
# tar -zxvf libid3tag-0.15.
# tar -zxvf libmad-0.15.
# tar -zxvf madplay-0.15.
2.编译madplay及其所依赖的库文件
桃花小妹下载
(1)新建目录/madplay/libz
(2)编译zlib,因为libid3tag依赖于这个库文件
陈道明女儿陈格打开/madplay/zlib-1.2.3
目录下的Makefile文件,按以下内容修改并保存:
CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar rcs
RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib
# ./configure --prefix=madplay/libz
# make
# make install
(3)编译libid3tag
# cd ../libid3tag-0.15.1b
在线试听# ./configure CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc --host=arm-linux --prefix=madplay/libz --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/madplay/libz/include LDFLAGS=-L/madplay/libz/lib
# make
# make install
(4)编译libmad
# cd ../libmad-0.15.1b
# ./configure CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc --host=arm-linux --prefix=madplay/libz --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/madplay/libz/include LDFLAGS=-L/madplay/libz/lib
# make
# make install
(5)编译madplay
# cd ../madplay-0.15.2b
# ./configure CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc --host=arm-linux --prefix=madplay/libz --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/madplay/libz/include LDFLAGS=-L/madplay/libz/lib
# make
但是,这样得到的是动态链接。如果在madplay-0.15.2b目录中执行arm-inux-gcc命令,并且在最后加上-static,运行以后就可以得到静态链接的程序,如(6)所示。
(6)静态链接
# /opt/host/armv4l/bin/armv4l-unknown-linux-gcc -Wall -O2 -fomit-frame-pointer -pt.o getopt1.ain.oplayer.o
audio.oaudio_aiff.oaudio_cdda.oaudio_hex.oaudio_null.oaudio_raw.oaudio_snd.oaudio_wave.oaudio_oss.o -L/home/madplay/lib /home/madplay/lib/libmad.a /home/madplay/lib/libid3tag.a -lz -lm -static
执行完毕后,生成静态链接的可执行文件madplay
3.下载madplay和1.mp3到开发板运行测试
(1)将madplay和1.mp3拷贝到nfs共享目录/home/arm/nfs芙蓉减肥前后照片
(2)在虚拟机终端运行telnet 192.168.0.11。将PC机的/home/arm/nfs挂载到实验箱的/tmp目录,在实验箱上执行:#mount -t nfs 192.168.0.10:/home/arm/nfs /tmp
(3)运行程序./madplay 1.mp3即可听到歌曲。
调试结果与改进方案:
1. 通过--disable-shared和--enable-static方式编译产生madplay,通过file madplay或arm-linux-readelfd madplay命令均可得出生成的madplay是动态链接的。在实验板上运行也提
示加载共享库失败。这说明--disable-shared和--enable-static并不能进行静态编译。复制在编译madplay时的最后一条gcc命令,并在末尾加上-static并运行,所需的动态链接库就添加到了可执行文件中。再执行file madplay显示可执行文件是statically linked。
2. 第一次进行最后的静态编译时不能通过,经检查发现编译zlib-1.2.3时只修改了Makefile.in文件而未修改Makefile,所以进行的不是交叉编译。修改Makefile的响应指令即解决。
3. 如果将源码包文件夹和存放生成库文件的文件夹放在一个目录下,即使修改CPPFLAGS和LDFLAGS也无法到安装zlib时生成的libz.a。解决方法是将存放生成的库文件的文件夹libz放在源码包文件夹madplay中。
4. 第一次下载的libmad-0.15.解压时出错未完全解压导致编译失败。重新下载另一个libmad-0.15.即解决。
参考文献:
1】孙天泽,袁文菊,张海峰.嵌入式设计及Linux驱动开发指南——基于ARM 9处理器.北
京:电子工业出版社,2005
【2】  鄢舒.嵌入式Linux软件课程设计课件.武汉.华中科技大学电信系.
阿兰犬夜叉