嵌入式系统设计实习报告 安卓音乐播放器设计报告

2024-05-07

嵌入式系统设计实习报告 安卓音乐播放器设计报告(共5篇)

篇1:嵌入式系统设计实习报告 安卓音乐播放器设计报告

机械与电子工程学院

嵌入式系统设计实习报告

题目:简易音频播放器设计

目录

第一章 引言·····················································3 1.1课题研究目的·····················································3 1.2课题研究意义·····················································3 1.3课题可行性分析···················································3 1.3.1课题调研····················································3 1.3.2可行性分析··················································3 第二章 开发环境安装和配置··································4 2.1开发包及其工具介绍···············································4 2.2Android开发平台搭建步骤··········································4 第三章 程序逻辑架构··········································5 3.1程序工程结构图···················································5 3.2工程各文件简介···················································5 3.2.1程序源文件夹src简介·········································5 3.2.2程序外部资源文件夹res简介···································6 3.2.3其他文件简介················································7 第四章 程序设计················································8 4.1主界面musicActivity设计···········································8 4.1.1onCreat函数··················································8 4.1.2关键代码讲解················································8 4.2音乐播放服务LocalService设计·····································10 4.2.1onCreat函数·················································10 4.2.2关键代码讲解···············································10 4.3数据库Helper类MusicListdbHelper设计······························11 4.3.1构造函数MusicListdbHelper···································11 4.3.2关键代码讲解···············································11 第五章 程序测试···············································13 第六章 分工与总结············································14

第一章 引言

1.1 课题研究的目的

1.熟悉一下eclipse工具和安卓的环境配置及开发的过程;

2.熟练掌握java的组件如button,textview,listView,menu等组件的灵活应用; 3.熟练掌握安卓的一个关于数据保存的方式SQLite3; 4.锻炼一下自己遇到问题,然后解决问题的能力。

1.2 课题研究的意义

随着3G技术的成熟和智能手机的不断普及,移动应用的需求与日俱增,移动应用开发成为当下最热门的技术之一。在google和android手机联盟的共同推动下,android在众多移动应用开发平台中脱颖而出。

Android操作系统是google最具杀伤力的武器之一。苹果以其天才的创新,使得iphone在全球迅速拥有了数百万忠实的“粉丝”,而android作为第一个完整、开放、免费的手机平台,使开发者在为其开发程序时拥有更大的自由。与windows mobile,symbian等厂商不同的是,android操作系统是免费向开发人员提供,这样可节省近三层得成本。

我们知道,无论是产品还是技术,商业应用都是它最大的发展动力。android如此受到厂商与开发者的青睐,它的前景一片光明。国内对于安卓这方面的市场还没有完全开发出来。

只要我们努力学习android,对理想、对生活都会有很大的补益。

因此,开发这样一套很简单的音乐播放器软件对我们来讲是一件很有必要的事情,在下面的各章中我们将以开发安卓音乐播放器软件为例,谈谈其开发过程和所涉及到的问题及解决方法。

本文中所做的主要工作如下:

 开发环境及开发工具的安装及配置;

 阐述整个音乐播放器的系统结构及工作原理;  设计实现“主界面activity设计”,“播放器Service设计”,“数据库设计”这三个主要的功能模块;

 分析并解决实现中的若干技术问题,像组件的选择以及保存方式的选择;  进行测试并分析结果。

1.3 课题的可行性分析

1.3.1 课题调研

(1)与实践活动和相关的文件和资料由作者本人网络查找,以及老师帮助;(2)具有遇到问题,具有独立思考,耐心钻研,向老师虚心求教的良好态度;(3)关于技术方面的难题,跟指导老师面谈。1.3.2 可行性分析

1)技术可行性-----本项目仅需要一台装有eclipse及配置好android开发环境的计算机即可,对计算机本身有一定的要求,它可以使用windows xp及其以上版本,mac os,linux等操作系统;

2)经济可行性-----由于本软件开发只需要一台电脑就行,基本不需要太大的成本。在经济上完全可行;

3)操作可行性-----界面设计时充分考虑用户的习惯以及手机方面的局限性,程序必须要很简单;本程序只涉及到开发环境配置,安卓组件的熟悉,以及安卓平台上的数据存储,并没有太大的难度,所以,该项目完全有可操作性。第二章 开发环境的安装和配置

2.1 开发包及其工具的介绍

Android以java作为开发语言,jdk是进行java开发时必需的开发包.eclipse是一款非常优秀的开源IDE,在大量插件的“配合”下,完全可以满足从企业级java应用到手机终端java游戏的开发.Google官方也提供了基于Eclipse的android开发插件ADT,所以本软件开发选择Eclipse作为开发IDE.2.2 Android开发平台搭建步骤

首先到http:///downloads/下载Eclipse集成开发环境并且解压,这里推荐下载Java EE 集成版本,可以为平台的搭建省下不少工作。接着再去http://java.sun.com/javase/downloads/index.jsp 站点下载SDK后安装,下载http://dl.google.com/android/android-sdk-windows-1.5_r1.zip,Android SDK1.5后解压。第一步下载工序就结束了。

②双击Eclipse解压后目录中的eclipse.exe然后启动,选择Eclipse菜单中的Help-> Install New Software-> 选项卡上的Available Software,点击右侧的“Add”输入http://dl-ssl.google.com/android/eclipse/后确定,然后在“Work with”下拉菜单中选择刚才输入的网址。过一会就会出现一个Developer Tools选项,勾上以后点击Next以后Eclipse会自动网上查找Android 开发工具插件,然后找到Android DDMS和Android Development Tools,选中这两个点击Finish,Eclipse就会自动下载并安装Android插件了,最后会提示重启Eclipse。

③重启后选择Eclipse菜单中的Windows-> Preferences 在左侧的Android项目中SDK Location中填入Android SDK解压后的目录,然后点击Apply。

④在Windows的系统变量中的path变量中添加一个值,该值指向解压后的Android SDK目录下的tools文件夹。

第三章 程序逻辑架构

3.1 程序工程结构图

下放两图即为程序的整个工程的结构图,左方为工程的整体结构图,右方为res文件中的各类用到的资源文件视图。

3.2 工程各文件简介

3.2.1 程序源文件夹src简介

源文件夹src下包含两个包com.terry与com.lyric,分别用于程序主要功能的实现和提供歌词同步显示的控件。

先分析歌词包com.lyric。其中com.lyric.LyricView.java设计了一个歌词显示的View控件LyricView,提供给主程序并作为一个控件显示出来;com.lyric.SongLyric.java设计了歌词类用以从sd卡中寻找到响应歌词文件并进行初始化操作。

主程序类包com.terry中,musicActivity和SdCardList均为Activity,前者为播放器的主界面进行各种播放控制操作,后者用来从SD卡中选择MP3文件添加到播放列表中;LocalService是音乐播放的Service,用于进行音乐播放并在通知栏中显示消息;MusicListdbHelper为自定义的数据库Helper类,将歌曲的名字和路径存入数据库,提供对歌 曲数据库的增加和删除的操作;另外两个均为辅助类,一个用于从文件夹中选择后缀名为mp3的文件(MusicFilter.java),另一个用于整合控件(viewHolder.java),代码如下:

MusicFilter.java

viewHolder.java

3.2.2 程序外部资源文件夹res简介

外部资源文件夹主要为程序提供各种外部资源,如图片等,这里主要介绍一下我们用到的布局文件夹Layout中的各种xml文件。

layout_gridview.xml、layout_listview.xml、layout_lyricview.xml 这三个xml文件被主界面调用viewGroup整合在主界面中,即程序中出现的左右滑动效果,其中gridview显示了歌曲的专辑图片,listview显示了歌曲播放列表,lyricview显示了同步歌词。

main.xml、main1.xml 主程序的主界面资源文件,同上述三个xml一样,整合在viewGroup中由musicActivity设定为当前界面。其中main决定了各view的布局,main1则是程序下方的进度条及简单控制按钮。

musicitme.xml、sdcard.xml 均被用于SdCardList这个Activity的布局,sdcard提供了SDCardList的主界面,musicitme提供了SDCardList中ListView的样式。progressbar.xml 由LocalService调用,通知信息栏的布局文件。3.2.3 其他文件简介

引入的外部JAR: android-support-v4.jar 为程序了viewGroup以实现左右滑动展示不同的View的效果。AndroidManifest.xml 应用的配置文件,描述应用程序的名称、权限、能力和运行方式等。

gen文件夹

这是必需的,为应用程序自动生成的资源文件夹,它所包含的应用程序资源管理源文件R文件定义了该项目所有资源的索引,不能被编辑。

Android 2.1–update1 这是Android 2.1的系统类库,在编译该项目时用到的环境。我们可以通过相应的配置来选择所需的系统类库。

assets文件夹

主要用于放置多媒体等数据文件。

default.properties 这是自动创建的工程文件,定义了应用程序的target和其所需的选项。

第四章 程序设计

4.1 主界面musicActivity设计

4.1.1 养成良好习惯,先看看onCreat函数

如下图所示即为作为程序入口的musicActivity的onCreat函数。大致的流程是调用父类onCreat函数,隐藏标题栏,设置布局,寻找布局控件,初始化应用,刷新歌词文件,刷新播放列表,绑定监听器,开启标志位检测线程,设定空歌词,启动服务。

4.1.2 关键代码讲解

设置布局函数setView()中,先初始化ListView、GridView还有歌词布局lyricview的内容,完毕后再将其添加到viewPager中从而可以进行滑动切换显示。

初始化程序initApp()如果程序是第一次启动(没有数据库文件),那么就自动初始化一次歌曲播放列表,默认路径为SD卡根目录,将歌曲文件信息添加到数据库并且添加到播放列表中。如果有数据库文件则不进行操作。

初始化程序完成之后就需要开启刷新歌词的线程了,refreshLyric()开启了刷新的线程使用已经定义好的handler hand发送刷新信息并进行相应的响应。

下一步就是列表的刷新显示,当前的播放列表中虽然存储有歌曲信息却没有将它显示 出来,所以我们需要刷新并显示一次播放列表,refreshlist()即可做到这一点,并且在每次对播放列表进行操作后都需要调用一次它。

4.2 音乐播放服务LocalService设计

4.2.1 仍然先看一下onCreat函数

播放服务的流程就比较简单,实例化MediaPlayer对象,从musicActivity中得到音乐列表,开启刷新通知栏和musicActivity中progressbar的线程,设置并显示通知栏信息。4.2.2 关键代码讲解

启动流程中的函数几乎没有什么需要讲解的,音乐播放器的Service中的关键代码当然是播放音乐和对切换歌曲的处理。

进度条更新函数progressbar()这个函数启动了一个更新进度条的线程,同时更新了musicActivity中和通知栏中的进度条。

播放音乐的函数playMusic(String path)函数中的参数为歌曲的路径(包含歌曲的文件名和后缀),返回类型为空,它的作用就是播放该路径的歌曲并且有一个播放完毕的监听器。所有的歌曲控制指令都写在musicActivity中,Service本身并不负责对歌曲列表的操作,所以,如果播放完毕,则给musicActivity一个切换歌曲的指令。

切换歌曲后需要调用的函数changeSong()切换歌曲以后需要重新设定一下progressbar还有正在播放的文件名,专辑图片,歌词信息等。这个函数在musicActivity中被大量调用从而实现对音乐播放的安全控制。

4.3 数据库Helper类MusicListdbHelper设计

4.3.1 构造函数MusicListdbHelper(Context _context)MusicListdbHelper是一个类,类对象的实例化都需要构造函数,数据库的Helper类的构造很简单,就是建立或者打开一个自己定义的数据库

4.3.2 关键代码讲解

需要被应用开始时调用的函数FirstStart()以判断应用是否需要初始化,返回类型为boolean FirstStart()中建立了一个游标查询数据库中的名为“colaconfig”的表,该表也仅作为初始化查询而特别建立,如果该表不存在,则说明数据库中不存在歌曲信息表,则创建该表和歌曲信息表“musicitem”,如果该表存在,则返回false并不进行任何操作。其他函数及其作用:

CreateTable_musicitem()创建歌曲信息表 CreateTable_colaconfig()创建配置表

Musicitem_insitem(String name,String path)添加歌曲到歌曲信息表,返回类型为boolean Musicitem_delitem(String name)从歌曲信息表中删除名为name的条目

getMusicItem()得到歌曲信息表的游标用以查询表中歌曲信息,返回值为Cursor

第五章 程序的测试

1.第一次运行程序的主界面

2.点击“choice”后的歌曲选择界面 3.选定的歌曲在主界面中显示播放进度,也可拖动进度条播放

5.使用返回键退出程序后Service仍在后台运行(歌曲仍在后台播放)

第六章 分工与总结

6.1 人员分工

张润浩:musicActivity、SdCardList的编写以及数据库的建立,同时负责软件后期的调试和修改;

刘博:主要负责Service的编写,包括通知栏和主Activity中控件的同步,同时负责报告的书写;

6.2 课程总结

通信软件设计设计是一门紧跟时代步伐的课程,顺应了当下移动互联网的发展浪潮,通过这门课程使我们大学生将课堂所学的知识逐步转化为社会所需要的才能,令我们获益匪浅。这次的作品在短短两周内,虽然并非一切顺利,但也算磕磕绊绊地完成了。途中遇到过难以解决的问题,虽然厌烦但还是逼着自己搞定了。说几个具体的吧,通过这次的课程设计,主要得到了这么几个经验。首先,在开发之前,如果是比较生疏的领域最好将资料准备完备,否则在做扩展的时候将会后悔莫及;其次,效率永远是第一位的,如果想睡了的话就不要勉强自己继续工作;最后,询问别人并自己进行思考永远是最快捷的成长途径。总而言之,通过这次的软件开发,通过这门课程,我们培养了自己独立思考和独立作业的能力,更加能够自信地面对即将踏入的社会。

篇2:嵌入式系统设计实习报告 安卓音乐播放器设计报告

题目:java音乐播放器

名 学

号 院

系 班

级 专

业 任课教师

1.设计内容及要求

能够实现简单的音乐播放器功能,如:打开本地文件,播放,暂停,停止,背景播放,单曲循环等等,界面充实,交互友好,可以添加多首歌曲目录

一个简单的基于java语言的音乐播放器,菜单栏:文件,播放控制和播放列表,文件菜单包含打开、循环和退出三个菜单项;播放控制菜单包含播放、暂停和停止三个菜单项,播放列表菜单则是当向里面添加歌曲之后才能够查看到里面所包含的歌曲目录。当播放歌曲时,可以调节音量大小或者设置是否静音;可以查看当前播放音乐的相关属性,如:歌曲名,歌手,发布时间,所属专辑等等。

2.需求分析

1、时间跟踪条:根据歌曲播放的进度,控制条自动进行追踪,用户可以

随时了解歌曲的播放进度

2、音量控制键:可以点击该控键进行音量大小的调节以及是否静音的设

3、属性查询键:通过该控键,用户可以查看当前播放音乐的相属性,获

取关于该歌曲的用户所需的相关信息。

4、菜单栏:

①文件:

打开:用户通过该菜单项打开本地音乐文件,听任何用户想

听的歌曲

循环:通过循环设置,用户可以重复的播放一首喜欢的歌曲

退出:退出音乐播放器,及退出该程序

②播放控制:

播放:选择歌曲之后,通过点击播放菜单项启动播放器播

放音乐

暂停:暂停当前正在播放的音乐

停止:停止当前正在播放的音乐

③播放列表:当用户通过文件打开本地音乐文件后,及相当于在

播放列表里面添加了歌曲,及形成相应的歌曲播放目录

3.总体设计

结合需求分析来看,整个设计包含了简单的菜单栏,根据用户需求设置了三个简单的实现基本操作的菜单,分别是:文件,播放控制,播放列表;根据具体的操作每个菜单还包含了相应的菜单项,文件:打开,循环,退出;播放控制:播放,暂停,停止;播放列表则没有菜单项,该菜单就是用来显示或者查看相应的歌曲目录的。

该音乐播放器设置了两个窗口,运行程序时打开的初始化欢迎界面,用户可以根据自己的需求进行菜单栏里面的基本操作和相应的设置,当用户添加或者打开音乐播放文件的时候,程序将会显示出第二个音乐文件播放窗口,与此同时,第一个初始化窗口将会自动隐藏,在音乐播放窗口里面用户可以进行相关的音乐播放的控制操作。

当用户进入音乐播放窗口时,该窗口有几个快捷控制的控键:时间追踪轴:可以实现播放的前进、后退功能,根据用户需求调节音乐的播放进度等;音量控制:设置静音,打开扬声器或者调节音量大小;播放列表:查看当前播放音乐的相关属性。4.主要功能设计流程

5.系统实现及测试:

(一)JMF(java媒体框架)简介

JMF 即Java媒体框架。其核心框架支持不同媒体,如音频输出和视频输出,包括时间的时钟同步。它是一个标准的扩展框架,允许用户制作纯音频流和视频流。

JMF实际上是Java的一个类包。它包括了一个开放的媒体架构,可使开发人员灵活采用各种媒体回放、捕获组件,或采用他们自己的定制的内插组件。

JMF软件是Java Media系列软件的一部分。采用各种Java Media API,软件开发商人员就能容易、快速地为他们已有的各种应用程序和客户端,Java小程序增添丰富的媒体功能,如流式视频、3D图像和影像处理等。就是 说,各种Java Media API发挥了Java平台的固有优势,将“编写一次,到处运行”的能力扩展到了图像、影像和数字媒体等各种应用领域,从而大大缩减了开发时间和降低了开发 成本。

在开发JMF 应用程序之前要完全理解JMF 的体系架构、接口和类。就拿我们的家用摄像机系统作个例子。首先用摄像机拍摄内容,拍摄下来的内容录制在DV带中。DV带可以放在放像机里播放、放像机提供视频信号给电视机,提供音频信号给音箱,这样我们就可以在电视机上看到画面,从音箱里听到声音。JMF API 提供的也是同样的模型。

JMF 提供的模型可大致分为七类

* 数据源(Data source)

* 截取设备(Capture Device,包括视频和音频截取设备)

* 播放器(Player)

* 处理器(Processor)

* 数据池(DataSink)

* 数据格式(Format)

* 管理器(Manager)

如果只是想观看捕获的内容,只需要使用捕获数据源创建播放器Player即可。如果想把捕获的数据发送到网络或者保存起来,就需要创建处理器Processor。

基本步骤是首先获取视频、音频捕获设备的信息,然后再根据取得的设备信息确定设备的位置。找到设备的位置以后,调用ManageCreatePlayer方法创建Player,当Player开始播放的时候,就开始了捕获的过程。

有多种方法获得捕获设备信息,可以通过查询指定的格式,也可以查询特定的设备名字。Player准备好播放数据,当Player发出这个事件时,就可以获取播放器的可视面板和控制面板了。具体步骤如下:

1.先把所有的捕获设备调出来

2.创建Player,当Play开始的时候,就开始了音频捕获的过程

3.以MediaLocator为参数,创建Player 4.为PLAYER添加监听器,以便监听RealizeComplete事件

(二)代码实现

(1)添加库、包等相关文件 import javax.media.ControllerEvent;import javax.media.ControllerListener;import javax.media.EndOfMediaEvent;import javax.media.PrefetchCompleteEvent;import javax.media.RealizeCompleteEvent;import javax.media.*;import javax.swing.*;import java.awt.*;

import java.awt.event.*;

(2)初始化窗口 ①界面

②代码实现

public void setupMenu(){

Menu f = new Menu(“文件”);

MenuItem mi = new MenuItem(“打开”);

CheckboxMenuItem cbmi = new CheckboxMenuItem(“循环”, false);MenuItem ee = new MenuItem(“退出”);f.add(mi);f.add(cbmi);f.add(ee);

mi.addActionListener(this);cbmi.addActionListener(this);ee.addActionListener(this);f.addSeparator();f.addSeparator();f.addSeparator();

Menu l = new Menu(“播放列表”);Menu c = new Menu(“播放控制”);

MenuItem move = new MenuItem(“播放”);MenuItem pause = new MenuItem(“暂停”);MenuItem stop = new MenuItem(“停止”);move.addActionListener(this);pause.addActionListener(this);stop.addActionListener(this);c.add(move);c.add(pause);c.add(stop);

c.addSeparator();c.addSeparator();c.addSeparator();

MenuBar mb = new MenuBar();mb.add(f);mb.add(c);mb.add(l);

setMenuBar(mb);}

(3)音乐播放窗口机基本功能的实现 ①界面

②代码实现

public void actionPerformed(ActionEvent e){

String cufile, selectfile, currentDirectory;if(e.getActionCommand().equals(“退出”)){

dispose();

return;}

if(e.getActionCommand().equals(“播放”)){ if(player!= null)

player.start();return;

} if(e.getActionCommand().equals(“暂停”))

{

if(player!= null)

player.stop();return;}

if(e.getActionCommand().equals(“停止”)){

if(player!= null){

player.stop();

player.setMediaTime(new Time(0));} return;}

if(e.getActionCommand().equals(“打开”)){

FileDialog fd = new FileDialog(this, “打开媒体文件”, FileDialog.LOAD);fd.setVisible(true);

if(fd.getFile()== null)

return;

selectfile = fd.getFile();

currentDirectory = fd.getDirectory();

cufile = currentDirectory + selectfile;

MenuItem mi = new MenuItem(selectfile);mi.setActionCommand(cufile);MenuBar mb = getMenuBar();Menu m = mb.getMenu(2);mi.addActionListener(this);m.add(mi);} else {

cufile = e.getActionCommand();selectfile = cufile;}

if(player!= null)

player.close();try {

player = Manager.createPlayer(new MediaLocator(“file:” + cufile));}catch(Exception e2)

{

System.out.println(e2);return;}

if(player == null){

System.out.println(“无法创建播放器”);return;}

first = false;

setTitle(selectfile);

player.addControllerListener(this);player.prefetch();}

public void itemStateChanged(ItemEvent arg0){ }

public static void main(String[] args){

new MediaPlayer(“播放器”);}

public void controllerUpdate(ControllerEvent e){

Container tainer = getContentPane();if(e instanceof ControllerClosedEvent){

if(vc!= null){

remove(vc);vc = null;}

if(cc!= null){

remove(cc);cc = null;} }

if(e instanceof EndOfMediaEvent){

player.setMediaTime(new Time(0));if(loop)

player.start();return;}

if(e instanceof PrefetchCompleteEvent){

player.start();return;}

if(e instanceof RealizeCompleteEvent){

vc = player.getVisualComponent();if(vc!= null)

tainer.add(vc, BorderLayout.CENTER);

cc = player.getControlPanelComponent();cc.setBackground(Color.blue);if(cc!= null)

{ tainer.add(cc, BorderLayout.SOUTH);if(vc!= null){

pack();return;}

Else {

setSize(300, 75);setVisible(true);return;} } }

}

6.总结与说明

在做写程序实现功能的过程中,界面和基本功能的设计需要较强的逻辑思维,一不小心就容易出错,在具体的功能设计和实现的过程中要尽可能用最简单的语句实现基本的播放器功能。我觉得可以设计更多的菜单及菜单项目从而实现更多的功能,如:删除,保存等,还可以实现更多的背景效果或者更多可选择的皮肤,还可以对按钮添加音效效果,这样感觉整个音乐播放器更具有灵活性,媒体感更强烈一些,界面会更加丰富和生动一些。

篇3:嵌入式系统设计实习报告 安卓音乐播放器设计报告

远程控制为人们的生活提供了非常便捷的方式, 特别是在当今的信息社会, 随着互联网络的飞速发展, 控制技术越来越受到了人们的关注。远程控制能够将工作与生活有结结合到一起, 使工作效率更高, 家庭生活更加舒适, 因此, 远程控制技术潜力巨大[1]。

当前状态中国市场中, 各种智能设备发展不匀衡, 社会上的产品技术没有统一标准, 但从整个趋势上来看, 人们对智能家居的追求越来越高, 智能化和舒适化将是发展的重要方向。

提出一种应用于微小卫星的嵌入式远程音乐播放器, 通过研究微小卫星的技术现状, 在此基础上对音乐播放器进行嵌入式设计, 通过编程接口将数据进行必要处理, 对远程指令以数据进行处理, 利用网络协议进行微小卫星与终端设备的连接, 完成网络数据传输, 用控制命令进行播放编程。实验表明, 应用于微小卫星的嵌入式远程音乐播放器设计能够实现智能控制, 具有较好的操控性和可扩展性, 具有广泛的应用空间。

二、嵌入式音乐播放器研究现状

嵌入式音乐播放系统是依据高度分散、技术密集、资金密集和不断创新的集成知识系统, 集电子技术、半导体技术、计算机技术和各种具体的应用于一身的综合性产物。嵌入式音乐播放系统的兴起源于网络通信及媒体技术的不断发展, 网络时代为微型计算机打开一个全新的世界, 嵌入式系统作为IT界的新技术, 它的应用成为个人电脑和互联网之后的又一热点[2,3]。

在上个世纪70年代, 微型音乐播放器便应用于各个领域, 因其具有较高的性价比、较低的能耗、较小的体积以及简单的结构, 这种智能微型机对于专业控制人士具有很大的吸引力, 要求在对象体系中要嵌入微型机, 以此实现控制系统智能化[4]。1976年, 英特尔推出世界上第一个单片机——MCS-48, 它仅包含ROM和RAM的简单程序, 并成功将各种CPU微处理器系统外的资源集成到CPU上。1980, 英特尔公司全面提高了MCS-48单片机, 奠定了嵌入式系统单片机应用模型的基础。至今, 到1984年, 随着Intel公司推出16位8096系列, 嵌入式微控制器得到更广阔的使用市场, 这使得嵌入式在微处理机领域出现。此外, 在1982年, 首枚数字信号处理芯片 (DSP) 实现了高速、实时地处理模拟信号, 进而将数字信号转换成专业的处理器, 其处理速度比当时最快的CPU还快10~50倍。随着集成电路技术的发展, DSP芯片的性能不断提高, 目前已广泛用于通信、控制、计算机等领域[5]。1990年后, 随着网络时代的到来, 网络通信和多媒体技术的快速发展, 8/16位单片机的速度和内存容量已经难以满足的应用程序需求。集成电路技术的发展, 32位微处理器价格下跌, 综合竞争能力已经与8/16单片机相近。基于嵌入式音乐播放器开发模式的发展总共经历3个阶段[6,7,8]:第一阶段是没有操作系统的嵌入式算法阶段, 这时期内的嵌入式音乐播放器主要单片机为核心, 这是由可编程控制器、以单芯片为核心的一种操作系统, 与此同时还具有一些监测、指导设备配合的简单功能。这阶段的嵌入式音乐播放器多数应用于一些专业性非常强的工业控制系统中, 一般都没有操作系统的支持, 而是以汇编语言编程的方式对系统进行直接控制, 现在这种方式已经不在使用。

三、嵌入式远程音乐播放器控制系统

数据命令经过传输加密后通过网络客户端传输到命令的终端, 整个过程经过微小卫星中继, 数据主要以网络协议为通用标准[9]。

3.1 DCT变换

DCT变换, 主要是指将一个远程控制命令以数据形式进行传输, 数据以光强数据进入微小卫星, 在微小卫星内对数据压缩加密, 实现一次向前DCT变换, 一次变换只能完成一个命令。将原始命令数据信息集合视为f (x, y) , 其中x和y分别代表数据命令的空间位置, 用公式表示为[10,11,12]:

DCT变换的原理同离散性傅立叶变换形式一致, 将空间的数据命令变换到卫星传输的域中, 能量主要集中低频区。通过公式 (1) 能够发现, 微小卫星信号传输高频幅值接近于零时, 越有利于数据传输过程。数值较大时, 交流数据信息可逆。

3.2网络协议

TCP/IP协议包含一系的空间和网络通信协议, 该协议由七层网络模型组成, 受到七个方面的制约[13]。其具体分层如图1所示。

这七个网络协议各负责一个方面, 每一层之间都为上层的协议服务。在整个远程命令传输过程中, 从用户端发出一个数据远程控制命令, 先从系统的应用层发起传递, 一层一层直到物理层结束[14]。

其中, OSI指的是遵循的一个统一标准, 一个系统无论在任何空间与地方, 都按照同一的标准去执行通信, 就能将庞大的通信系统简单化。OSI系统采用开放式结构, 每个层次之间都有服务的权限。主要是通过协调来制定协议使用。

四、嵌入式系统

嵌入式系统是现在比较流行的技术, 嵌入式技术主要, 用于控制、辅助操作。具有内核小, 专用性强和系统简单等优点[15]。

4.1嵌入式系统组成

嵌入式系统是由传输设备、嵌入式控制软件、中央处理器以及操作系统构成。其中, 处理器是整个系统的最核心部分, 负责系统的上传下达和指令执行。它具有时时性响应快, 执行时间短等特点。

嵌入式操作平台是基于特定的操作平台, 为达到某个预期的目的, 专为特定的嵌入式领域设计的平台。嵌入式软件需要确保准确、系统安全稳定的运行。其结构图如图2所示。

4.2嵌入式操作系统

在正常情况下, 嵌入式操作系统需要有网络接口、虚拟文件系统、运行操作指令、硬件支持、稳定的运作内核等五大部分组成。这种独特的模块机制来源于客户的需求, 从而依次将这些内核或者插入内核移出系统。这样, 嵌入式操作系统的内核就会显得非常小巧, 适合嵌入式系统的要求, 进而满足用户的需求。

五、结论

篇4:嵌入式系统设计实习报告 安卓音乐播放器设计报告

--嵌入式系统语音采集与播放程序设计

班级: 学号: 姓名:

指导老师:

课程设计时间:2011.6.29---2011.7.8

江苏大学

目录

第一章 引言.........................................................1 1.1 设计目的......................................................1 1.2 设计任务与要求................................................1 第二章 课程设计平台构建与流程.......................................2 2.1 嵌入式系统平台构建............................................2 2.2 课程设计流程..................................................3 2.3 课程设计硬件结构与工作原理...................................3 第三章 BOOTLOADER移植与下载.......................................11 3.1 VIVI源代码安装...............................................11 3.2 VIVI源代码分析与移植.........................................11 3.3 VIVI编译与下载...............................................12 第四章 LINUX内核移植与下载........................................14 4.1 LINUX内核源代码安装..........................................14 4.2 LINUX内核源代码分析与移植....................................14 4.3 LINUX内核编译与下载..........................................15 第五章 课程设计功能模块程序设计与交叉编译..........................24 5.1 课程设计模块功能.............................................24 5.2 功能模块驱动程序设计.........................................24 5.3 功能模块交叉编译.............................................28 第六章 根文件系统建立与文件系统下载................................29 6.1 根文件系统分析...............................................29 6.2 文件系统映像文件生成.........................................30 6.3 文件系统下载.................................................31 6.4 功能模块运行与调试...........................................32 第七章 课程设计总结与体会..........................................34 7.1 得出的结论...................................................34 7.2课程设计过程中遇到的问题及解决方法...........................34 7.3 心得体会.....................................................34 参考文献...........................................................36

第一章 引言

1.1 设计目的

分析Linux操作系统下音频设备驱动的结构,编写应用测试程序,实现UDA1341芯片的实时录音及放音功能,进一步熟悉vivi、Linux内核和根文件系统的编译和烧写至开发板的开发流程。

1.2 设计任务与要求

在Samsung公司S3C2410处理器的edukit-Ⅲ开发板上,在嵌入式linux操作系统环境下,根据语音芯片UDA1341的驱动程序和语音数据的特点编写语音采集与播放的应用测试程序,实现语音数据的采集和实时播放功能。1.要求本系统实时的采集与播放

2.通过麦克风录制一段语音信息,对其进行播放 第二章 课程设计平台构建与流程

2.1 嵌入式系统平台构建

2.1.1软件部分

1)Linux或Windows 98/2000/NT/XP 2)cygwin cygwin是一个在windows平台上运行的unix/Linux模拟环境,是cygnus solutions公司开发 3)Embest IDE 英蓓特提供的一个嵌入式开发的集成环境。4)windows中的超级终端

5)Embest online Flash Programmer for ARM 烧写相关文件到NorFlash中的工具。

6)建立linux的交叉编译环境,各项源代码的安装等 2.1.2硬件部分

1)EduKit-II实验平台 2)S3C2410核心子板 3)PC机 2.2 课程设计流程

图2.1 设计流程

2.3 课程设计硬件结构与工作原理

2.3.1硬件模块(1)

SCLLRCIIS控制器SDOSDIMCL 图2.2 典型的IIS总线上的设备

(2)IIS总线结构

IIS总线只处理声音数据,其他控制信号等则需单独提供。IIS总线使用3根串行总线,分别是:提供分时复用功能的SD线(Serial data,串行数据),WS线(Word select,字段选择(声道选择))和SCK线(Continuous Serial clock,连续的时钟信号)。

音频编解码4 ADDRTxFIFODATASFTRBRFCRxFIFOSDCNTLCHHCSCLKIPSR_APCLKIPSR_BSCLKGLRCKCDCLK

图2.3 IIS总线接口内部结构

S3C2410A IIS总线接口各模块的功能描述如下:

● BRFC 表示总线接口、寄存器区和状态机。总线接口逻辑和FIFO访问由状态机控制。

● IPSR 表示两个5位的前置分频器ISPR_A和ISPR_B,一个前置分频器作为IIS总线接口的主时钟发生器,另一个前置分频器作为外部音频编解码器CODEC的时钟发生器。

● TxFIFO和RxFIFO 表示两个64字节的FIFO。在发送数据时,数据写到TxFIFO,在接收数据时,数据从RxFIFO读取。

● SCLKG 表示主IISCLK发生器。在主设模式时,由主时钟产生串行位时钟。● CHNC 表示通道发生器和状态机。通道状态机用于产生和控制IISCLK和IISLRCK。

● SFTR 表示16位移位寄存器。在发送模式时,并行数据移入SFTR并转换成串行数据输出;在接收模式时,串行数据移入SFTR并转换成并行数据输出。具体的相关寄存器的位功能描述请参观相关资料。2.3.2 工作原理

常用的数字音频处理集成电路包括A/D、D/A、DSP、数字滤波器和数字音频I/O接口及设备(麦克风、话筒)等。麦克风输入的模拟音频信号经A/D转换、音频编码器实现模拟音频信号到数字音频信号转换,编码后的数字音频信号通过控制器送入DSP或微处理器相应的处理。音频输出时,数字音频信号(音频数据)经控制器给音频解码器,经D/A转换后由扬声器输出。

数字音频涉及概念很多,重要的是理解:采样和量化。采样就是每隔一定时间读一次声音信号的幅度,而量化则是将采样得到的声音信号幅度转换为数字值。从本质上讲,采样是时间上的数字化,而量化则是幅度上的数字化。

根据奈奎斯特(Nyquist)采样理论采样频率应高于输入信号的最高频率两倍。为了保证声音不失真,采样频率应该在40kHz左右。常用的音频采样频率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,要达到DVD的音质需要采用更高的采样频率。

量化是对模拟音频信号的幅度数字化,量化位数决定模拟信号数字化以后的动态范围,常用的有8位、12位和16位。量化位越高,信号的动态范围越大,数字化后的音频信号就越接近原始信号,但所需要的存储空间也越大。

声道有单声道、双声道和多声道。双声道又称立体声,在硬件中有两条线路,音质和音色都优于单声道,但数字化后占据的存储空间的大小要比单声道多一倍。多声道能提供更好的听觉感受,不过占用的存储空间也更大。

数字音频数据有PCM、MP3、WMA、WAV、Ogg Vorbis、RA、AAC、ATRAC 3等多种不同的文件格式。

1)IIS总线

IIS总线(IIS,Inter-IC Sound Bus,数字音频集成电路通信总线)是Philip公司提出的音频总线协议,它是一种串行的数字音频总线协议,是音频数据编码或解码常用的串行音频数字接口。

(1)IIS总线的传输模式

数据的发送方和接收方需要采用相同的时钟信号来控制数据传输,数据传输方(主设)必须产生字段选择信号、时钟信号和需要传输的数据信号。在一个复杂的数字音频系统中,可能会有多个发送方和接收方,通常采用系统主控制模式,主控制模块控制数字音频数据在不同集成电路(设备)间的传输,数据发送方就需要在主控制模块的协调下发送数据。IIS总线的三种传输模式如图2、3、4所示,这些模式的配置一般需通过软件来实现。

clock SCKTRANSMITTERword select WSdata SDRECEIVERTRANSMITTER=MASTER

图2.4发送器为主设时的传输模式

clock SCKTRANSMITTERword select WSdata SDRECEIVERRECEIVER=MASTER

图2.5 接收器为主设时的传输模式

CONTROLLERclock SCKTRANSMITTERword select WSdata SDRECEIVERCONTROLLER=MASTER

图2.6 控制器为主设时的传输模式(2)IIS总线时序 1串行数据(SD)○串行数据的传输由时钟信号同步控制,且串行数据线每次传输1字节的数据。当音频数据被数字化成二进制流后,传输时先将数据分成字节(如8位、16位等),每个字节的数据传输从左边的二进制位MSB(Most Significant Bit)开始。当接收方和发送方的数据字段宽度不一样时,发送方不考虑接收方的数据字段宽度。如果发送方发送的数据字段宽度小于系统字段宽度,就在低位补0;如果发送方的数据字段宽度大于接收方的宽度,则超过LSB(Least Significant Bit)的部分被截断。

2字段选择(WS)○音频系统一般包含有左右两个声道,字段选择(WS)用来选择左声道或者右声道,WS=0表示选择左声道;WS=0表示选择左声道。如果不在外部加以控制,WS会在MSB传输前的一个时钟周期发生变化,使数据接收方和发送方保持同步。此外,WS能让接收设备存储前1字节,并且准备接收后1字节。

3时钟信号(SCK)○在IIS总线中,任何一个能够产生时钟信号的电路都可以称为主设备,从设备从外部时钟输入得到时钟信号。IIS的规范中制定了一系列关于时钟信号频率和延时的限制。

图2.7 IIS总线时序

(3)IIS总线接口的工作方式

IIS总线接口是用来连接外部的标准编解码器(CODEC)的接口。S3C2410A提供一个IIS总线接口,能用来连接一个外部8/16位立体声音频CODEC,支持IIS 总线数据格式和MSB-justified数据格式。该接口对FIFO的访问提供DMA传输模式,而不是采用中断模式。它可以同时发送数据和接收数据,也可以只发送或只接收数据。在只发送和只接收模式,S3C2410A的IIS总线接口有以下三种工作方式。

1正常传输方式 ○在正常传输方式,对于发送和接收FIFO,IIS控制寄存器有一个FIFO就绪标志位。当FIFO准备发送数据时,如果发送FIFO不空,则FIFO就绪标志位为“1”;如果发送FIFO为空,该标志为“0”。在接收数据时,当接收FIFO是不满时,FIFO就绪标志位为“1”,指示可以接收数据;若接收FIFO满,则该标志为“0”。通过FIFO就绪标志位,可以确定CPU读/写FIFO的时间。

2DMA传输方式 ○在DMA传输方式,利用DMA控制器来控制发送和接收FIFO的数据存取,由FIFO就绪标志来自动请求DMA的服务。

3发送和接收方式 ○在发送和接收方式,IIS总线接口可以同时发送和接收数据。(4)S3C2410A IIS总线接口的音频串行接口格式

S3C2410A的IIS总线接口支持IIS总线数据格式和MSB-justified数据格式。IIS总线格式 ○IIS总线有IISDI(串行数据输入)、IISDO(串行数据输出)、IISLRCK(左/右通道选择)和IISCLK(串行位时钟)4条线,产生IISLRCK和IISCLK信号的为主设备。串行数据以2的补码发送,首先发送是MSB位。首先发送MSB位可以使发送方和接收方具有不同的字长度,发送方不必知道接收方能处理的位数,同样接收方也不必知道发送方正发来多少位的数据。

当系统字长度大于发送器的字长度时,数据发送时,字被切断(最低数据位设置为0)发送。接收器接收数据时,如果接收到的数据字长比接收器的字长更长时,则多的数据位被忽略。另一方面,如果接收器收到的数据位数比它的字长短时,则缺少的位设置为0。因此,MSB有固定的位置,而LSB的位置与字长度 有关。在IISLRCK发生改变的一个时钟周期,发送器发送下一个字的MSB位。

发送器发送的串行数据可以在时钟信号的上升沿或下降沿同步。然而,串行数据必须在串行时钟信号的上升沿锁存到接收器,所以发送数据使用上升沿进行同步时会一些限制。

左右通道选择线指示当前正发送的通道。IISLRCK可以在串行时钟的上升沿或者下降沿改变,不需要同步。在从模式,这个信号在串行时钟的上升沿被锁存。IISLRCK在MSB位发送的前一个时钟周期内发生改变,这样可以使从发送器同步发送串行数据。另外,允许接收器存储前一个字,并清除输入以接收下一个字。

2MSB-justified数据格式 ○MSB-justified总线格式在体系结构上与IIS总线格式相同。与IIS总线格式唯一不同的是,只要IISLRCK有变化,MSB-justified格式要求发送器总是发送下一个字的最高位。

2)音频编解码芯片UDAl341TS UDA1431TS可把通过麦克风音频输入通道输入的立体声模拟信号转化为IIS格式的数字信号,传送给S3C2410的IIS控制器,然后CPU使用DMA控制器把得到的数字信号存放的一块内存空间上;同样DMA控制器也能把已存的数字信号通过IIS格式发送给UDAl341TS芯片,由该芯片转换成模拟信号,通过耳机音频输出通道输出。利用UDA1341TS内部的PGA(可编程增益放大器)、AGC(自动增益控制)功能对模拟信号进行处理。对于数字信号,UDA1341TS提供DSP(数字音频处理)功能。

S3C2410A的IIS接口线分别与UDA1431TS的BCK、WS、DATAI、SYSCLK相连。当UDA1431TS芯片工作在微控制器输入模式时,使用UDA1431TS的L3总线(L3DATA、L3MODE和L3CLOCK)。L3DATA、L3MODE和L3CLOCK分别表示与微处理器接口的数据线(L3DATA)、模式控制线(L3MODE)和时钟线(L3CLOCK)。微控制器通过对UDA1431TS中的数字音频处理参数进行配置。S3C2410A没有与L3总线配套的专用接口,可以利用通用I/O口进行控制。第三章 Bootloader移植与下载

3.1 Vivi源代码安装

进入cygwin,Vivi源代码的安装:

$> source /tmp/edukit-2410/set_env_linux.sh// Linux编译环境变量设置,第一次打开Cygwin必须设置。

$> cd $WORKDIR $> tar-xvjf /tmp/edukit-2410/source/vivi/vivi-20030929.tar.bz2 $> ls

„ vivi „ „为$WORKDIR目录下其他内容

正确解压后,可以看到多了一个vivi目录,即vivi源代码的安装目录,后面的vivi配置及编译都得进入vivi目录进行。再为EduKit2410实验系统打入vivi源代码的补丁文件:

$> cd vivi $> patch-p1

vivi的代码包括arch,init,lib,drivers和include等几个目录,共200多条文件。

Vivi主要包括下面几个目录:

arch:此目录包括了所有vivi支持的目标板的子目录,例如s3c2410目录。drivers:其中包括了引导内核需要的设备的驱动程序(MTD和串口)。MTD目录下分map、nand和nor三个目录。

init:这个目录只有main.c和version.c两个文件。和普通的C程序一样,vivi将从main函数开始执行。lib:一些平台公共的接口代码,比如time.c里的udelay()和mdelay()。include:头文件的公共目录,其中的s3c2410.h定义了这块处理器的一些寄存器。Platform/smdk2410.h定义了与开发板相关的资源配置参数,我们往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。

3.3 Vivi编译与下载

1)Vivi源代码的编译

然后执行以下命令进行编译:

$> source /tmp/edukit-2410/set_env_linux.sh Linux编译环境变量设置

$> cd $WORKDIR/vivi $> make clean

图3.1 vivi编译

$> make menuconfig输入配置smdk2410-amd:Nor Flash boot

smdk2410:Nand boot

图3.2 图形界面下配置内核文件

其中,运行make menuconfig后,选择Load an Alternate Configuration file,配置文件名称如下:

smdk2410:编译 vivi 在 Nand Flash(K9S5608)中运行; smdk2410-amd:编译 vivi 在 Nor Flash(AM29LV160DB)中运行。这两个配置文件在usrlocalsrcedukit-2410viviarchdef-configs中,须复制

到usrlocalsrcedukit-2410vivi中;或者可以在 menuconfig 中输入全部路径。配置好后,输入:$> make

图3.3 vivi映像文件生成

如果编过程中没有出现错误,则编译后的执行文件存放于 vivi 目录下。2)下载:

在下载模式下,vivi为用户提供一个命令行人机接口,通过人机接口可使用vivi提供的一些命令。如嵌入式系统没有键盘和显示,可以利用vivi中的串口,将其和宿主机连接起来,利用宿主机中的串口软件(如Windows中的超级终端或Linux中的minicom)来控制。第四章 Linux内核移植与下载

4.1 Linux内核源代码安装

linux源代码安装

运行cygwin,执行以下命令完成cygwin 环境下的Linux源代码的安装: $> source /tmp/edukit-2410/set_env_linux.sh Linux编译环境变量设置

$> cd $WORKDIR $> tar –xvjf /tmp/edukit-2410/linux-2.4.18-rmk7-pxa1-mz5-i2c.tar.bz2 $> ls „ kernel „ „为$WORKDIR 目录下其他内容

图4.1 linux内核安装

正确解压后,相比之前可以看到多了一个kernel目录,即kernel源代码的安装目录,后面的Linux配置及编译都得在kernel目录进行。

实验中提供的linux内核已经包含了Linux源代码的补丁文件、I2C和网络驱动模块

4.2 Linux内核源代码分析与移植

4.2.1 Linux源代码分析

Linux内核由5个主要的子系统组成。这5个子系统分别是进程调度(SCHED)、内存管理(MM)、虚拟文件系统(Virtual File System,VFS)、网络接口(NET)和进程间通信(IPC)。

进程调度控制着进程对CPU的访问。当需要选择下一个进程运行时,由调度 程序选择最值得运行的进程。可运行进程实际是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。

内存管理允许多个进程安全地共享主内存区域。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码、数据和堆栈的总量可以超过实际内存的大小,操作系统只将当前使用的程序块保留在内存中,其余的程序块则保留在磁盘上。必要时,操作系统负责在磁盘和内存之间交换程序块。内存管理从逻辑上可以分为硬件无关的部分和硬件相关的部分。硬件无关的部分提供了进程的映射和虚拟内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。

虚拟文件系统隐藏了各种不同硬件的具体细节,为所有设备提供了统一的接口,虚拟文件系统还支持多达数十种不同的文件系统,这也是Linux较有特色的部分。虚拟文件系统可分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2、fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

网络接口提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序两部分。网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱动程序

4.2.2 Linux内核及硬件模块驱动移植

内核和文件系统、图形用户系统(GUI窗口系统)可以分开,它们的开发、移植、下载甚至运行都是可以分开的。内核移植是一个比较复杂的任务,也是嵌入式系统开发中非常重要的一个过程。内核移植一般包括内核配置、内核编译和内核下载3大步骤。

4.3 Linux内核编译与下载

4.3.1 Linux内核源代码安装

运行cygwin,执行以下命令完成cygwin环境下的Linux内核源代码的安装: $> source /tmp/edukit-2410/set_env_linux.sh //Linux 编译环境变量设置 $> cd $WORKDIR $> tar –xvjf /tmp/edukit-2410/linux-2.4.18-rmk7-pxa1-mz5-i2c.tar.bz2 $> ls „ kernel „ //„为$WORKDIR 目录下其他内容

正确解压后,可以看到多了一个kernel目录,即kernel内核源代码的安装目录,后面的Linux内核配置及编译都得进入kernel目录进行。实验中提供的linux内核已经包含了Linux源代码的补丁文件、IIC和网络驱动模块。4.3.2 Linux内核的编译 $> cd kernel

图4.2 $> make mrproper 清除所有的旧的配置和旧的编译目标文件等 $> make xconfig 在图形界面下对内核进行配置(配置方法之一)执行make xconfig 后,弹出如图4.3的内核定制界面:

图4.3 内核定制界面

选择按钮”Load Configuration from File”,如图4.4输入smdk2410:

图4.4 内核配置文件

选择配置sound ,设置Sound support为y:

设置BT878 audio dma为y: 设置SMDK-2410 audio support为y:

设置OSS sound modules为y:

根据提示加载配置文件后,点击按钮”Store Configuration to File”,如图4.5输入audio1:

图4.5 存储配置文件

保存,Save and Exit。如图4.6

图4.6 $> make dep //搜索Linux编译输出与源代码之间的依赖关系并生成依赖文件。

图4.7

$> make clean //清除构造内核时生成的目标文件、模块文件和临时文件。$> make zImage //生成压缩的内核映像文件。

图4.8 编译通过后,在/usr/local/src/edukit-2410/kernel/arch/arm/boot/目录下生成内核的压缩映像文件为“zImage”,此文件是最后要烧写到开发板的内核映像文件。

4.3.1 Linux内核下载

内核下载:

1)启动超级终端(波特率为115200),连好串口线,在开机瞬间快速按空格键,进入vivi控制台命令行下;打开S3C2410&NandFlash_vivi.cfg,在Flash Programmer的Progarm页中选择:vivi.bon&load.bin文件进行烧写。如图4.9

图4.9 烧写界面

点击按钮Progarm开始烧写,直到烧写成功;连接串口到PC机COM1,运行成功;连接串口线到 PC 机 COM1,运行光盘中提供的 Windows 超级终端 Hyper Terminal.ht;开发板重新加电,程序运行后,在超级终端上可以看到串口输出类似以下信息:

图4.10 超级终端界面

看到以上信息后,表示正在等待用户从超级终端下载文件。这时,请点击超 级终端菜单“传送”选择 Xmodem 方式下载 vivi.nand 文件,点击 OK 后等待下载烧写结束即可。

图4.11 添加传送文件

图4.12 下载vivi nada 2)在vivi启动等待中,敲入空格键进入vivi界面环境,并输入以下命令: vivi> load flash kernel x <回车> 烧写更新内核约4分钟即可烧写完毕,如图4.13

图4.13 等待下载

3)立即选择要发送的文件,比如zImage文件,这里Linux环境下源代码arch/arm/boot目录下的zImage内核映像文件已转移到 windows某目录下。要选择合适的xmodem协议。以上操作完成 后,单击“发送,几分钟后即可发送完毕。

图4.14 发送zImage

图4.15 下载成功 第五章 课程设计功能模块程序设计与交叉编译

5.1 课程设计模块功能

5.1.1 三个模块:

I2S音频总线接口电路 ;音频编解码器芯片udal41; DMA控制器; 5.1.2工作过程:

麦克风输入的模拟音频信号在音频编解码器中经过A/D转换和编码将模拟信号转换成数字信号,将这些数字信号先传给I2S音频总线接口电路中的FIFO,再由DMA控制器送入DSP中做相应的处理,这是录音的过程;DMA控制器将DSP中存储的信号传送给I2S音频总线接口电路中的FIFO,再发送给音频编解码芯片进行D/A转换,通过耳机输出模拟信号。

5.2 功能模块驱动程序设计

5.2.1 关于驱动结构体

由于目前许多硬件厂商在出售各种产品时,一般都不带Linux下的设备驱动程序,而且编写驱动程序的工作量占整个系统工作量的很大的一部分,这使得Linux下设备驱动程序的开发变得越来越重要。

本课程设计不要求自己编写驱动程序,但要求分析UDAl341TS驱动程序,以便编写出语音采集与播放的应用测试程序,同时为以后编写驱动程序打好基础。嵌入式Linux系统下的IIS音频驱动程序是在/usr/local/src/edukit-2410/drivers/sound 中,3c2410-uda1341.c 文件即是。

关于结构体:

在音频驱动程序中有2个比较重要的结构体: typedef struct { int size;/* buffer size */ char *start;/* point to actual buffer */(内存虚拟地址起始地址)dma_addr_t dma_addr;/* physical buffer address */(内存物理地址起始地址)

struct semaphore sem;/* down before touching the buffer */ int master;/* owner for buffer allocation, contain size when true */(内存大小)

} audio_buf_t;typedef struct { audio_buf_t *buffers;/* pointer to audio buffer structures */ audio_buf_t *buf;/* current buffer used by read/write */ u_int buf_idx;/* index for the pointer above */ u_int fragsize;/* fragment i.e.buffer size */(音频缓冲区片大小)

u_int nbfrags;/* nbr of fragments */(音频缓冲区片数量)dmach_t dma_ch;/* DMA channel(channel2 for audio)*/ } audio_stream_t;audio_stream_t是一个管理多缓冲区的结构体,为音频流数据组成了一个环形缓冲区。audio_buf_t管理一段内存,audio_stream_t管理N个audio_buf_t。

音频驱动的两个file_operations结构定义如下: static struct file_operations smdk2410_audio_fops = { llseek: smdk2410_audio_llseek, write: smdk2410_audio_write, read: smdk2410_audio_read, poll: smdk2410_audio_poll, ioctl: smdk2410_audio_ioctl, open: smdk2410_audio_open, release: smdk2410_audio_release };static struct file_operations smdk2410_mixer_fops = { ioctl: smdk2410_mixer_ioctl, open: smdk2410_mixer_open, release: smdk2410_mixer_release };这里定义了两种类型设备的file_operations结构,前者是DSP设备,后者是混频器设备。Linux 内核内部通过file结构识别设备,通过file_operations数据结构体提供文件系统的入口点函数,也就是访问设备驱动程序里的函数。file_operations结构体原型是在 中定义的函数指针表。5.2.2关于函数:

read()、write()、open()和ioctl()是struct file_operations结构体中的接口函数。

1)read()函数:由已打开的文件读取数据,即播放。

(1)函数定义:ssize_t read(struct file *file, char *buffer, size_t count, loff_t * ppos);(2)函数说明:把参数file所指的文件传送count个字节到buffer指针所指的内存中;若参数count为0,则read()不会有作用并返回0;(3)返回值:返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。如果正确会返回实际读到的字节数,最好能将返回值与参数count作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read()被信号中断了读取动作。当有错误发生时则返回-1,错误代码存入errno中,而文件读写位置则无法预期;2)write()函数:将数据写入已打开的文件内,即录音。

(1)函数定义:ssize_t write(struct file *file, const char *buffer, size_t count, loff_t * ppos);(2)函数说明:把参数buffer所指的内存写入count个字节到参数file所指的文件内。当然,文件读写位置也会随之移动;(3)返回值:若正确会返回实际写入的字节数;当有错误发生时则返回-1,错误代码存入errno中。

3)open()函数:打开音频设备。

(1)函数定义:int(*open)(struct inode *inode, struct file *file);(2)函数说明:参数inode为设备特殊文件的incode(索引结点)结构的指针,参数file是指向这一设备的文件结构的指针。open()的主要任务是确定硬件是否处在就绪状态,验证次设备号的合法性,控制使用设备的进程数;

(3)返回值:如果打开文件成功,open会返回一个文件描述符,以后对文件的所有操作就可以对这个文件描述符进行操作。比如程序中open()函数的返回值赋给了应用程序中的devfd,后面则可以对其进行操作;若打开失败返回负数。

4)ioctl()函数:用于设置编码比特、采样频率和选择声道。(1)函数定义:int ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg);(2)函数说明:设备驱动程序中对设备的I/O通道进行管理的特殊控制函数,可以通过它向设备传递控制信息或从设备取得状态信息,实现用户程序命令和驱动命令的相互联系;

(3)返回值:执行成功返回正数,失败返回-1。

5)s3c2410_uda1341_init()函数:动态加载驱动模块时的初始化函数。(1)函数定义:int __init s3c2410_uda1341_init(void);

(2)函数说明:该函数首先会初始化I/O和UDA1341 芯片,然后申请2个DMA 通道用于音频传输。将输出音频缓冲区的DMA通道设为通道2,输入音频缓冲区的DMA 通道设为通道1。最后调用register_sound_dsp()和register_sound_mixer()两个函数来分别注册驱动设备;

(3)返回值:初始化成功,返回0;DMA 通道初始化设置失败,返回负数。6)void __exit s3c2410_uda1341_exit()函数:动态卸载驱动模块时调用的函数。

(1)函数定义:void __exit s3c2410_uda1341_exit(void);

(2)函数说明:注销音频设备,分两次调用audio_clear_dma()函数来分 别释放已申请的音频输入和音频输出的DMA 通道;

(3)返回值:无。

5.3 功能模块交叉编译

用命令Makefile来编译:

图5.1 编译测试文件

将test文件拷贝到D:cygwinusrlocalsrcedukit-2410rootbin中 执行以下命令生成新的文件系统映象:

$>cd $WORKDIR/ $>$SOURCEDIR/mkcramfs root root.cramfs.new

图5.2 生成系统映像文件

生成文件系统映象文件root.cramfs.new。第六章 根文件系统建立与文件系统下载

6.1 根文件系统分析

6.1.1 cramfs 目录结构

一个完整的根文件系统通常包含以下几个目录: /bin 应用程序存放目录。

/sbin 系统管理员服务程序,其中最重要的就是供内核初始化之后执行的/sbin/init 进程。

/lib 存放程序运行所需要的动态库。/proc 系统状态文件目录。/dev 驱动程序存放目录。

/etc 系统配置文件及用户数据存放目录。

/mnt 用于设备安装的目录,通常包含etc 子目录和为块设备安装保留目录。/usr 用于存放用户程序和配置文件的目录,可以根据需要进行设置。一般情况下都要把已经规划好的目录结构转换成一个映象文件,即使用命令工具mkcramfs(cygwin下为mkcramfs.exe),把相应的cramfs 目录树压缩为单一的映象文件。其命令格式为:

mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile 使用mkcramfs.exe 在cygwin 下编译生成文件系统映象文件root.cramfs,再固化到开发系统FLASH 上运行。6.1.2 构建cramfs 文件系统

按照本节实验原理中自行构建一个cramfs 文件系统。运行cygwin,执行以下命令解压安装:

$> source /tmp/edukit-2410/set_env_linux.sh //Linux 编译环境变量设置

$> cd $WORKDIR/

图6.1 构建文件系统

$> tar-xvjf /tmp/edukit-2410/root.cramfs.tar.bz2 $> ls „ root „ root 文件夹中就是我们想要的cramfs 文件系统

6.2 文件系统映像文件生成

6.2.1 编译一个应用测试程序test.c 按设计原理要求编写一个应用程序test.c,存放在/home/app/audio目录下,进入该目录后执行以下命令编译链接测试程序:

$> cd /home/app/audio $> make(也可以编写Makefile 来编译)

图6.2 编译test文件

6.2.2 拷贝测试程序到文件系统中,并编译生成文件系统映象

把刚才编译输出的test文件拷贝到文件系统所在的工作目录 root/usr/audio 目录下,执行以下命令生成新的文件系统映象:

$> cd $WORKDIR/ $> $SOURCEDIR/mkcramfs root root.cramfs.new

图6.3 生成映象

刚刚编译生成的文件系统映象root.cramfs.new 中已经包含测试程序。

6.3 文件系统下载

(1)首先SW104 设为短接(从Nand Flash 启动),确定已经成功烧写vivi 和linux kernel,加电运行可以看到vivi 启动信息,输入空格进入命令状态;

(2)双击运行Download.pjf 工程文件(将启动Embest IDE 环境),点击连接Remote connect,程序应该正在运行(此时命令按钮STOP 为红色);在超级终端输入help 看看有没有反应,如果没反应,点击IDE 按钮:Reset->Start(F5);再输入help 测试,直到有反应为止;

(3)如果超级终端可以输出一些信息,再点击IDE 中的Stop,配置Debug 的Download 地址为0x30000000,并点击IDE 菜单Project 选择Settings 项,在Download 页下拉Category 到Download 项,在Download File 选择root.cramfs.new 文件,路径为d:Cygwinusrlocalsrcedukit-2410点击确定后:

图6.4 选择加载的文件

首先点击IDE 菜单DEBUG 选择Download 下载文件系统映象 约1-2 分钟

图6.5 下载成功

其次下载完毕后,点击Start(F5)然后在超级终端里输入:load flash root j(烧写更新文件系统)

图6.6 烧写

注意:只能在“vivi的烧写”和linux内核操作完成后,才可以按以上方法正确烧写root映象到NandFlash。重起实验板,观测超级终端窗口提示信息,引导整个系统启动到linux行命令输入状态。在超级终端输入一些linux命令查看执行结果是否正确。

6.4 功能模块运行与调试

重新加电,在超级终端根据提示启动Linux,按提示输入cd bin、./test指令。

图6.7 输入指令

图6.8 在控制台下运行测试程序

程序执行完后。如图6.9。

图6.9 程序运行时超级终端的输出

第七章 课程设计总结与体会

7.1 得出的结论

通过按上述步骤执行相关应用程序,可以实现对语音的实时采集和播放。需改进的地方:通过录制一段语音信息,录制完成后再播放

7.2课程设计过程中遇到的问题及解决方法

1.在给vivi打补丁时,$> patch-p1

2.在图形界面下进行内核配置时按实验指导书配置导致少了sound这一步导致出错。

3.重新在图形界面下配置后,发现无法生成压缩映像文件。请教研究生后解决了。原来之前配置错误生成了boot文件夹,要把之前boot删掉后重新编译。4.在调试时输入cd bin,./test指令后超级终端无反应。查找后发现,原来在根文件系统编译时没把生成的test文件复制到文件系统所在的工作目录root/bin目录下。重新编译后把生成的test文件复制后在调试后可以进行录放测试。

7.3 心得体会

课程设计刚开始的时候,思绪全无,我真的感到 “书到用时方恨少”,所以又重新把书和实验指导看了几遍,对知识系统而全面进行了梳理,对许多不理解的地方通过上网搜索翻阅图书弄懂,终于熟练掌握了基本理论知识,而且领悟诸多平时学习没有注意到的细节步骤,学会了如何思考的思维方式,找到了设计的灵感。

虽然每天要顶着30多度的高温在宿舍跟实验室之间往返,流了不少汗水,感觉确实不舒服,可最后看到自己的成果后心里很充实很高兴。

在课程设计过程中遇到了这样那样的困难。有时候是电脑出问题了,有时候

是实验箱出毛病,有时候是自己在操作过程中操作错误无法继续,可在研究生学长和其他同学的帮忙下都一一解决。使我深深感觉到团队力量的强大。

最后再次感谢陈老师这学期兢兢业业地给我们传授知识,感谢三位研究生牺牲自己的时间在炎热的夏天帮助我们解决遇到的问题!

参考文献

[1]徐英慧,等.ARM9嵌入式系统设计——基于S3C2410与Linux[M].北京:北京航空航天大学出版社,2007.[2]于明,等.ARM9嵌入式系统设计与开发教程[M].北京:电子工业出版社,2006.[3]田泽.ARM9嵌入式开发实验与实践[M].北京:北京航空航天大学出版社,2006.[4]孙天泽,等.嵌入式设计及Linux驱动开发指南——基于ARM9处理器[M].2版.北京:电子工业出版社,2007.[5]周立功,等.ARM9&WinCE实验与实践——基于S3C2410[M].北京:北京航空航天大学出版社,2007.[6]Samsung Electronics.S3C2410A-200MHz

&

266MHz

32-Bit

篇5:嵌入式系统基础课程设计报告

嵌入式系统基础课程设计报告

系 部: 电子通信工程系 专 业: 班 级: 学生姓名: 学 号:

2012年 06月

嵌入式系统基础课程设计任务书

1.时间:2012年06月11日~2012年06月15日 2.课程设计单位:河南机电高等专科学校

3.课程设计目的:深入学习单片机编程技巧,熟悉电子产品设计制作全过程。能够利用汇编语言完成十字路口交通灯的设计。4.课程设计任务:

按交通灯的具体要求来写

―――-红色文字为说明,写报告时请先删除!!

嵌入式系统基础课程设计报告

前言:

×××××××××××××××××××××××××××××××××××××××××××××××-----宋体,小四,不加粗,单倍行距

实训报告: ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

„„„„„„

×××××××××××××××××××××××××××××××

―――-红色文字为说明,写报告时请先删除!!

心得体会: ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

„„„„„„

××××××××××××××××××××××××××××××××××××××××××××××××××

参考文献:

„„„以下红色文字为“参考文献”的示例,写报告时请先删除!!填写上你自己的“参考文献”

上一篇:春天来了范文200字下一篇:创意绘本diy教学设计