嵌入式系统综合设计说明书
软件设计说明书(嵌入式软件范例)

软件设计说明书(嵌入式软件范例)一、XXXXX-XXX 热压机自动控制系统软件的设计LCD—液晶显示器,因其具有微功耗、平板化等一系列显著特点而广泛应用于仪器仪表、计算机显示终端、各类电子显示装置等各个方面。
LCD的后工序生产工艺包括COG、COF、FOG、FOB,XXX-XXX 热压机正是为FOG段工艺而开发设计的。
XXXXX-XXX热压机自动控制动系统软件(以下简称XXX系统)是由PLC、气动元件和电动元件组成,其特点是通过传感器采集外部信号,输入到PLC内部进行计算处理,以控制外部执行元件,使之完成一系统的机构动作,达到生产所需的工艺要求。
㈠XXX 系统的性能和结构XXX 系统主要由PLC、GOT(触摸屏)、伺服电机、气缸电磁阀、电磁继电器、光电传感器、磁性传感器、温度处理器、温度传感器以及各种按钮组成。
1、XXX 系统的主要性能和技术参数●主机电源:Vac-----220V AC/50HZ●传感器电源:Vdd-----+24V●PLC接口:40位输入、32位输出、1个RS232通信串口●工作温度:-10℃~+55℃●存储温度:-20℃~+60℃2、XXX 系统的内部地址XXX 系统的内部地址及主要功能部件:●输入继电器—X●输出继电器—Y●辅助继电器—M●定时器—T●计数器— C●数据寄存器— D●变址寄存器—Z㈡㈢指令描述XXX 系统主要有如下指令:㈣人机界面(GOT)1、参数设置人机界面(GOT)可用于参数设置和数据的显示(如图所示)2、手动操作人机界面亦可制作手动调试所需的各种按键,以替代繁琐的按钮(如图)3、生产信息人机界面还可用于显示生产时的各种数据以及PLC内部的信息,比如外部引脚的通断信息、生产时产生的报警信息等(如下图)㈣XXX 系统的接口及编程1、硬件接口XXX系统与电脑的接口可以有两种方式:直接控制方式和间接控制方式。
直接控制方式就是将PLC的RS232接口直接与电脑的RS232接口对接(如图1-1);间接控制方式就是将PLC的RS232接口与触摸屏的RS232接口对接,然后将电脑的RS232接口与触摸屏的RS422接口对接,然后对该外设进行间接操作而实现控制(如图1-2)。
本科专业认证《嵌入式系统设计综合实训》教学大纲

《嵌入式系统设计综合实训》教学大纲课程名称:嵌入式系统设计综合实训英文名称:Embedded System Design Training课程编号:0812200395课程性质:必修学分/学时:3/3周(15天)课程负责人:先修课程:C语言、接口技术A、嵌入式系统(上)、嵌入式系统(下)、嵌入式系统一、课程目标嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
嵌入式系统融合了计算机软硬件技术、半导体技术、电子技术和通信技术,与各行业的具体应用相结合。
自诞生之日起,就被广泛应用于军事、航空航天、工业控制、仪器仪表、汽车电子、医疗仪器等众多领域。
信息技术和网络的飞速发展,消费电子、通信网络、信息家电等的巨大需求加速了嵌入式技术的发展,扩大了嵌入式技术的应用领域。
《嵌入式系统设计综合实训》是学生学习了《嵌入式系统设计》等课程后的一次实际训练课程。
本课程要求学生选择一些比较重要的项目,进行实际的编程训练,以帮助学生巩固先修课程的知识,提高自己的动手能力,为以后从事相关专业技术工作、科学研究工作打好坚实的基础。
通过本课程的学习,达到以下教学目标:1.工程知识1.1 掌握必要的嵌入式系统设计知识。
1.2 能够应用嵌入式系统设计知识解决复杂的系统设计问题。
2.问题分析2.1 能够理解并恰当表述系统设计中的实际问题。
2.2 能够找到合适的解决方法。
3.设计/开发解决方案能够运用嵌入式系统设计知识进行产品规划与设计并体现创新意识。
4.研究能够采用嵌入式系统设计知识进行研究并合理设计实验方案。
5.使用现代工具能够有效使用嵌入式系统设计软件对实际问题进行分析与实现。
6. 终身学习6.1具有自觉搜集阅读与整理资料的能力。
6.2了解本专业发展前沿。
二、课程内容及学时分配本课程采取案例式学习,如表1所示。
三、教学方法作为一门实际训练课程,该课程以实验教学、综合讨论、动手实现等共同实施。
嵌入式开发实验手册

嵌入式系统原理与应用实验栗华编着山东大学信息科学与工程学院二零一四年三月目录第一章实验硬件平台1.1北京博创UP-TECH三合一实验箱简介本实验指导书所依赖的硬件平台为北京博创兴盛科技有限公司生产的一种ARM9/Xscale经典三核心教学科研平台(型号:UP-TECHS2410/S2440/P270),本平台兼容PXA270核心CPU及S3C2410、S2440核心CPU的全部功能,是北京博创多年来嵌入式教学产品开发经验的结晶。
这里选配的是S3C2440核心板。
图1-1UP-CUP三合一实验箱外观应用案例:※支持Linux、WinCE、Vxworks、μC/OS-Ⅱ4套操作系统;※核心板可更换,同时拥有ARM9(S3C2410和S3C2440)和XScale(PXA270);※中国电子学会嵌入式工程师认证考试和师资培训指定平台;硬件资源:软件资源结构说明图1-2UP-TECH三合一实验箱实物结构图1-2UP-TECH三合一实验箱框图结构图1-3UP-TECH三合一实验箱框图结构版图1.2跳线设置参考说明:◆PCB上所有“EXPORT”丝印字符表示168Pin扩展槽◆JP1401RESET-SEL:设置复位电路,位置JTAG20插座下方。
1-2:ICE的ICE-TRST复位信号可以控制系统复位信号RESET。
2-3:ICE的ICE-TRST复位信号不可以控制系统复位信号RESET。
◆JP1402JTAGSEL:选择JTAG电路,位置JTAG20插座下方。
1-2:使能板载的UP-LINKJTAG电路。
2-3:使用外部的JTAG电缆或者ARMICE仿真器。
◆JP1103TXD1-SEL◆JP1104RXD1-SEL:UART1选择扩展槽或者RS232的DB9插座。
1-2:UART1连接RS232-1,从DB9串口插座输出。
2-3:UART1连接到扩展槽。
◆JP1101TXD2-SEL◆JP1102RXD2-SEL:UART2选择跳线,分别为RS485、IrDA、扩展槽1-2:UART2连接到RS485总线上。
3 嵌入式系统的设计方法

3、逐一测试各功能模块的性能
4、整机联调
测试:
用于验证设计的产品是否满足应用的需求
1、功能与性能测试 2、可靠性测试(温度、湿度、振动、冲击、运输 等情况) 3、容错测试 4、长时间、极端情况
文档编制:
非常重要的一环,不可忽视
1、设计报告 2、测试报告 3、产品说明书 4、用户手册 5、维修与安装手册 6、其他
基于ARM处理器的应用系统设计
1、系统设计概述
2、单元电路设计
3、存储器系统设计
4、通过JTAG访问外设
系统设计概述
S3C2410A处理器详解
S3C2410A在包含ARM920T核的同时,增加了丰富的外围资源,如下图所示。 主要片内外围模块包括: 1个LCD控制器,支持STN和TFT液晶显示屏; 外部存储器管理(SDRAM控制器和芯片选择逻辑); 3个通道的UART; 4个通道的DMA,支持存储器和I/O口之间的传输,以猝发模式提高传输率; 4个具有PWM功能的16位定时/计数器和1个16位内部定时器,支持外部时 钟源; 8通道的10位ADC,最高速率可达500kB/s,10位分辨率; 触摸屏接口; IIS总线接口; 2个USB主机接口,1个USB设备接口; 2个SPI接口; SD卡接口和MMC卡接口; 16位看门狗定时器; 117位通用I/O口和24位外部中断源; 8通道10位AD控制器; 电源管理。
嵌入式系统开发过程
嵌入式软件的开发与传统的软件有许多共同点, 它继承了许多传统软件开发的开发习惯。但由于嵌入式 软件运行于特定的目标环境,与传统软件的开发又有着 很大的不同。
嵌入式系统的开发特点
嵌入式系统课程设计_音乐播放器

课程设计说明书课程设计名称:嵌入式系统课程设计课程设计题目:音乐播放器学院名称:信息工程学院专业:计算机科学与技术班级:090451 学号:09045102 :评分:教师:2012年11月30 日摘要: (1)第一章课程设计要求和容 (2)1.1设计目标和要求 (2)1.2 设计容 (2)第二章开发工具介绍 (3)第三章系统设计与实现 (5)3.1 宿主机开发环境配置 (5)3.2功能分析与方案论证 (5)3.2.1 功能分析 (5)3.2.2 可行性分析 (5)3.3 需求分析 (6)3.4详细设计 (6)3.4.1 系统的功能模块设计 (6)3.4.2 界面窗口模块详细设计与实现 (7)3.4.5 MP3 文件播放控制模块详细设计与实现 (10)3.4.6 主要程序文件(代码见附录) (12)第四章调试分析 (12)第五章设计总结 (13)主要参考文献: (13)附录(流程图、源代码): (14)附录1 相关流程图 (14)附录2 系统运行效果 (16)附录3 程序源代码 (17)音乐播放器摘要:随着用户要求的不断提高,越来越多的嵌入式设备使用功能强大、价格低廉的嵌入式Linux作为操作系统并开始采用较为复杂的图形用户界面。
Qt以其强大的功能、良好的可移植性逐渐成为一种被广泛使用的GUI系统。
正是由于嵌入式操作系统及其相应图形用户界面的不断发展,嵌入式软件的开发显得越来越重要,其中嵌入式媒体播放器由于能够满足人们的视听享受已经逐渐成为了系统中不可或缺的重要组成部分,在嵌入式系统上开发媒体播放器已经成为了一个技术热点,当前许多嵌入式产品中都包含媒体播放器。
因此在基于Qt的嵌入式Linux系统中实现媒体播放器具有深刻的意义和实用价值。
本次课程设计运用Qt技术在Linux下进行GUI设计,以一个图形界面为例,运用QT creator软件编程,实现一个简单的音乐播放器。
此播放器能够播放本地的音频文件,在功能方面,它具备一些基本的音乐操作处理功能,如暂停、播放、音量调节、停止等,此外,界面还能显示歌曲信息,比如显示播放列表,播放的时候能够通过按钮来实现歌词显示的功能。
嵌入式系统及应用课程设计说明书

山东建筑大学课程设计说明书题目:基于ARM的网络通信系统的设计课程:嵌入式系统及应用课程设计院(部):信息与电气工程学院专业:电子信息工程班级:电信062学生姓名:**学号:**********指导教师:***完成日期:2009年7月目录摘要 (II)1 设计目的 (1)2 设计要求 (1)3 设计原理 (2)4 设计内容 (5)4.1系统框图 (5)4.1需求分析 (5)4.3器件选型 (6)4.4 系统原理图 (8)4.5 软件设计 (9)总结与致谢 (11)参考文献 (12)摘要在电子设备日趋网络化的背景下,作为目前广泛使用的以太网以及TCP/IP协议已经成为事实上最常用的网络标准之一,它以高速、可靠、分层以及可扩充性使得它在各个领域的应用越来越灵活,很多情况下运用以太网和TCP/IP能够简化结构和降低成本。
但是,目前关于嵌入式以太网的设计方案不是很多,在这不多的方案中大多是基于单片机或DSP的。
两者都存在要外扩很多外设的问题,并且前者速度太慢,后者成本又太高,这在一些对设备尺寸要求很小的场合是不行的。
本设计中,采用了基于ARM内核的微处理器S3C44BOX为基础的嵌入式系统与10 MB 以太网控制芯片RTL8019AS的接口电路实现了网络通信。
本系统可以通过网络接收命令和传送数据,S3C44BOX负责数据的采集和运算处理,通过互联网上任意一台计算机可以配置系统的工作方式和接收本系统采集的数据。
关键词:TCP/IP;ARM;S3C44B0X;RTL8019AS1 设计目的目前,以太网协议已经非常广泛地应用于各种计算机网络,如办公局域网、工业控制网络、因特网等场合,并且还在不断地发展。
基于以太网的新技术和联网设备不断出现,以太网已经成为事实上最常用的网络标准之一。
但是,基于以太网的嵌入式系统目前并不是很多。
其原因除了嵌入式系统本身运行速度较慢、资源较少且不足以实现以太网的各种协议外,更重要是设计以太网的接口及协议相对比较复杂,使人望而却步。
(完整word版)软件设计说明书(嵌入式软件范例)

XXX系统主要由PLC、GOT(触摸屏)、伺服电机、气缸电磁阀、电磁继电器、光电传感器、磁性传感器、温度处理器、温度传感器以及各种按钮组成。
1、XXX系统的主要性能和技术参数
●主机电源:Vac-----220VAC/50HZ
●传感器电源:Vdd-----+24V
●PLC接口:40位输入、32位输出、1个RS232通信串口
ORB
ORM1220
ORM1226
ORM301
ANDM400
ANIM302
OUTM301
PLSM303
DMOVPD662D8340
LDM466
ANDM470
LDM1160
ANDM467
ORB
ORM1410
ORM320
ANDM400
ANIM323
OUTM320
PLSM323
DMOVPD680D8350
㈣XXX系统的接口及编程
1、硬件接口
XXX系统与电脑的接口可以有两种方式:直接控制方式和间接控制方式。直接控制方式就是将PLC的RS232接口直接与电脑的RS232接口对接(如图1-1);间接控制方式就是将PLC的RS232接口与触摸屏的RS232接口对接,然后将电脑的RS232接口与触摸屏的RS422接口对接,然后对该外设进行间接操作而实现控制(如图1-2)。
2、程式流程方框图
A、系统回原点流程图
B、自动运行流程图(左半段)
C、自动运行流程图(右半段)
3、程式代码编写
XXX系统有的程式编写是能过GX Developer以语句表的形式写入,经编译成C++代码后,再写入PLC内部EEPROM。期形式如下:
研华 ARK-1220 无风扇嵌入式工控机 用户手册说明书

用户手册ARK-1220无风扇嵌入式工控机版权声明随附本产品发行的文件为研华公司2019年版权所有,并保留相关权利。
针对本手册中相关产品的说明,研华公司保留随时变更的权利,恕不另行通知。
未经研华公司书面许可,本手册所有内容不得通过任何途径以任何形式复制、翻印、翻译或者传输。
本手册以提供正确、可靠的信息为出发点。
但是研华公司对于本手册的使用结果,或者因使用本手册而导致其它第三方的权益受损,概不负责。
认可声明Award为Award Software International, Inc.的商标。
VIA为VIA Technologies, Inc.的商标。
IBM、PC/AT、PS/2和VGA为International Business Machines Corporation的商标。
Intel和Pentium为Intel Corporation的商标。
Microsoft Windows®为Microsoft Corp.的注册商标。
RTL为Realtek Semi-Conductor Co., Ltd.的商标。
ESS为ESS Technology, Inc.的商标。
UMC为United Microelectronics Corporation的商标。
SMI为Silicon Motion, Inc.的商标。
Creative为Creative Technology LTD.的商标。
CHRONTEL为Chrontel Inc.的商标。
所有其它产品名或商标均为各自所属方的财产。
如需本产品或研华其它产品的更多信息,请访问://ePlatform/如需技术支持与服务,请访问我们的技术支持网站:/support/产品质量保证(两年)从购买之日起,研华为原购买商提供两年的产品质量保证。
但对那些未经授权的维修人员维修过的产品不予提供质量保证。
研华对于不正确的使用、灾难、错误安装产生的问题有免责权利。
如果研华产品出现故障,在质保期内我们提供免费维修或更换服务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学校代码: 10128学号:************嵌入式系统综合设计说明书题目:智能车系统—MP3播放器设计与实现****:***组员:王嘉敏杜继凤学院:信息工程学院班级:计算机11-2班指导教师:庄旭菲王晓强蒋贵良刘志强2014 年3 月15 日嵌入式项目T-CAR 智能小车是嵌入式技术和物联网技术结合的产物。
TCAR 以三星高端微处理器为主控实现主要控制工作,将WIFI 无线通信与ZIGBEE 近距离无线组网通信相结合实现近距离和远程无线控制、信息采集等功能。
T-CAR 即可作为互联网终端、物联网网关,也可以和工业控制、智能家居等系统融合使用。
本课题目的是在ARM-Linux嵌入式环境下实现网络功能,系统主要由硬件层、内核层、应用层三部分构成。
由于Linux具有可移植度高、自由、免费等特性,最近几年,它在移动设备和个人电脑领域的应用也越来越广泛,因此我们选择Linux操作系统,鉴于以上应用领域对用户界面友好性方面的要求,几乎所有的此类应用都是采用图形用户界面。
播放界面采用Qt设计,Qt是创造图形用户界面的最流行的跨平台GUI工具箱之一。
这里将通过一个使用Qt技术的简单mp3播放器的实现,详细描述Linux环境下的图形界面编程技术。
本实训课程是嵌入式应用开发方向的实训课程,主要介绍嵌入式应用程序的开发技术,课程内容涉及C 语法及核心库、嵌入式Linux 开发环境、嵌入式Linux 应用开发流程。
在内容组织上,以案例贯穿课程的始终。
通过一系列案例的学习使学员能基本掌握嵌入式Linux 应用程序开发的基本技术,能开发出有图形界面,可交互,具有一定业务逻辑的嵌入式Linux 应用程序。
关键字:嵌入式;QT;mp3播放器;前言 (1)第一章概述 (2)1.1课程设计目的 (2)1.2课程背景与要求 (2)1.2.1课程设计背景 (2)1.2.2课程设计要求 (3)1.3课程设计环境 (3)第二章设计方案 (4)2.1设计功能 (4)2.2 设计思路 (4)第三章软件设计 (5)3.1模块流程图 (5)3.2 Madplay 移植 (6)3.3程序清单 (6)3.3.1音乐播放器服务器程序实现 (6)3.3.2音乐播放器客户端程序实现 (19)第四章调试过程 (24)4.1硬件连接 (24)4.2软件连接 (24)4.2.1 操作系统 (24)4.2.2 系统软件 (24)4.2.3 工具软件 (24)4.2.4 文档和资源 (25)4.3实验步骤 (25)4.4 出现的问题和解决方法 (25)4.5运行结果截屏 (26)第五章总结 (28)参考文献 (29)前言随着社会的日益信息化,计算机和网络已经全面渗透到日常生活的每一个角落。
对于我们每个人来说,需要的已经不再仅仅是那种放在桌上处理文档、进行工作管理和生产控制的计算机机器。
任何一个普通人都可能拥有从小到大的各种使用嵌入式技术的电子产品,小到MP3、PDA等微型数字化产品,大到网络家电、智能家电、车载电子设备等。
目前,各种各样的新型嵌入式系统设备在应用数量上已经远远超过了通用计算机。
在工业和服务领域中,使用嵌入式技术的数字机床、智能工具、工业机器人、服务机器人正在逐渐改变着传统的工业生产和服务方式。
MP3是嵌入式的最主要应用之一,高端的MP3已经不仅仅着眼于实现音乐播放这一简单功能,而是同时具备了文本浏览、图片浏览、甚至视频播放等强大功能。
本文重点讨论了基于WIFI 智能车的控制系统为主其中MP3的功能的实现,包括开发环境建立、内核配置与编译、Qt开发等一系列详细过程。
近几年,嵌入式系统技术得到了广泛的应用,普适计算、无线传感器网络、可重构计算等新兴技术的出现又为嵌入式系统技术的研究与应用注入了新的活力。
智能手机、信息家电、汽车电子、家用机器人……嵌入式系统已“无处不在”。
嵌入式系统是当今最热门的概念之一。
作为一个系统,往往是在硬件和软件双螺旋式交替发展的支撑下逐渐趋于稳定和成熟,嵌入式系统也不例外。
第一章概述嵌入式项目T-CAR 智能小车是嵌入式技术和物联网技术结合的产物。
TCAR 以三星高端微处理器为主控实现主要控制工作,将WIFI 无线通信与ZIGBEE 近距离无线组网通信相结合实现近距离和远程无线控制、信息采集等功能。
T-CAR 即可作为互联网终端、物联网网关,也可以和工业控制、智能家居等系统融合使用。
1.1课程设计目的嵌入式系统设计与实践课程设计介绍基本设计与实现方法,是为计算机科学与技术专业本科生开设的一门重要的专业课程。
是对以前所学很多知识的汇总和深化。
通过三周的设计,能把以前很多所学的理论联系实际,培养学生的实验动手能力和创新意识,使学生对嵌入式系统有更全面的认识,掌握嵌入式系统的设计与开发的方法,为将来进行嵌入式应用系统的设计与开发奠定基础。
1.2课程背景与要求1.2.1课程设计背景物联网是一个基于互联网、传统电信网等信息承载体,让所有能够被独立寻址的普通物理对象实现互联互通的网络。
物联网通过智能感知、识别技术与普适计算、泛在网络的融合应用,被称为继计算机、互联网之后世界信息产业发展的第三次浪潮。
物联网被视为互联网的应用拓展,应用创新是物联网发展的核心,以用户体验为核心的创新 2.0 是物联网发展的灵魂。
随着物联网的发展,越来越多的物联网控制终端将涌现,对于相关技术的学习需求和基于该领域的就业机会将大增,本智能车就是在此前提下诞生的。
该智能车具有很强的操控性、可玩性,同时融入嵌入式物联网相关技术,使学员可在相对轻松愉悦的环境中学习各种技术,让嵌入式技术的学习变得不在枯燥。
本车设计之初既考虑了可产品化空间,也考虑了技术知识点的涵盖,使学习更能明确目标;同时本项目在选材上也考虑了项目的手工打造的可能性,意在锻炼学员的动手实践能力,只要学习者有兴趣,即可按所提供的材料清单和学习的相关技术自行打造,我们更希望能培养学习者的创客精神和创业欲望与意识。
1.2.2课程设计要求要求采用C/S架构,完成对网络音乐播放器软件的分析、设计、编码、测试等工作。
音乐播放器功能说明:服务器实现完整的音乐播放器功能,客户端通过网络实现控制操作。
包括如下:1、Madplay音乐播放器移植。
2、音乐播放器服务器设计,通过网络接收客户端请求并执行对应动作,实现音乐播放、暂停、上一首、下一首、播放列表、停止等功能;3、QT客户端界面设计,要求利用qt设计控制客户端界面,实现通过网络向服务器发送命令请求等功能。
1.3课程设计环境环境要求:操作系统:windows 7+ubuntu虚拟系统平台:vim编辑器,GNU工具链,Qtcreator集成开发环境开发语言:C/C++文档环境:windows office2.1设计功能音乐播放器功能说明:服务器实现完整的音乐播放器功能,客户端通过网络实现控制操作。
包括如下:1、Madplay音乐播放器移植;2、音乐播放器服务器设计,通过网络接收客户端请求并执行对应动作,实现音乐播放、暂停、上一首、下一首、播放列表、停止等功能;3、QT客户端界面设计,要求利用qt设计控制客户端界面,实现通过网络向服务器发送命令请求等功能。
2.2 设计思路1、开发环境搭建,虚拟机配置相关vim编辑器,gcc编译器等相关软件配置。
2、madplay音乐播放器移植,包括libmad音频解码库的使用,,所以首先需要移植madplay,具体方法如下:1)创建安装库的路径 sudo mkdir /opt/arm/madplay/lib2)进入madplay 源码目录执行./build3 )测试将madplay 和库文件复制到根文件系统,配置LD_LIBRARY_PATH,执行madplay xxx.mp3。
3、服务器端程序设计,采用C语言在Linux环境在完成音乐播放器功能。
4、利用Qtcreator设计客户端界面,实现向服务器发送控制命令等功能3.1模块流程图图1.1模块流程图3.2 Madplay 移植1) 首先建立一个mp3 文件夹,进入到mp3 文件夹后再建立两个文件夹,一个存放源码,一个存放安装文件。
在home 下,mkdir 两个文件夹:madplay-src、madplay。
依次解压四个源码包到madplay 目录下:tar zxvf XXX.tar.gz (2) 编译zlib-1.1.4进入zlib 源文件目录,依此执行./configure9 / 26make make install(3) 编译libid3tag进入tag 源码目录,依此执行./configure make make install(4) 编译libmad进入libmad 源码,依此执行./configuremake注:使用的是高版本的ARM-LINUX-GCC 如 4.4.6 编译器,MAKE 时可能会出现”CCL:ERROR:UNRECOGNIZED COMMAND LINE OPTION “-FFORCE-MEM””错误,这是因为这个高版本的GCC 没有”-FFORCEMEM”参数,解决的办法是在LIBMAD 文件中的MAKEFILE 里面查找”-FFORCE-MEM”,将其删除即可 make install (5) 编译madplay进入madplay 源码目录,依此执行./configure –-with alsa make make install (6) 测试madplay执行命令(配置环境变量):export LD_LIBRARY_PATH=$LD_LIBRARY_PATH/usr/local/lib运行:madplay xx.mp33.3程序清单3.3.1音乐播放器服务器程序实现1.player.c#include "common.h"#include "socket.h"#include "player.h"/*孙子进程id 号*/pid_t gradchild;/*子进程id 号*/pid_t pid;/*共享内存描述标记*/int shmid;char *p_addr;/*共享内存内容格式*//*|gradchild(孙子进程PID) |+ |空一个字节|+ currentsong(当前播放列表的节点指针)|*//*listhead for music*/struct song* head;/*创建歌曲名的双向循环链表*/struct song *creat_song_list(void){FILE *fd;ssize_t size;size_t len;char *line = NULL;struct song *p1;struct song *p2;int res=system("ls ./song > song_list");if(res == -1) perror("system");fd = fopen("song_list","rb");if(fd==NULL){perror("fopen");}p1 = (struct song *)malloc(sizeof(struct song));printf("==================================songlist=====================================\n");res=system("ls ./song");if(res == -1) perror("system");printf("\n");printf("============================================================= ===================\n");size = getline(&line,&len,fd);strncpy(p1->songname,line,strlen(line));head = p1;int n=strlen(line);(head->songname)[n]='\0';while((size = getline(&line,&len,fd)) != -1) //从文件中读取一行,直到出错或者到文件尾EOF 返回-1{p2 = p1;p1 = (struct song *)malloc(sizeof(struct song));strncpy(p1->songname,line,strlen(line));p2->next = p1;p1->prev = p2;int n=strlen(line);(p1->songname)[n]='\0';}p1->next = head;head->prev = p1;p1 = NULL;p2 = NULL;res=system("rm -rf song_list");if(res == -1) perror("system");return head;}/*MP3 音乐播放器-->播放音乐函数*/void play(struct song *currentsong){pid_t newfd;char *c_addr;void *tempaddr;char *p;int len;char my_song[2048]="./song/";while(currentsong){printf("currentsong size=%d\n",strlen(currentsong->songname));/*子进程创建孙子进程*/newfd = fork();if(newfd == -1){perror("fork");exit(1);}else if(newfd == 0) //孙子进程{printf("play fork success!\n");/*把歌曲名加上根路径*/strcat(my_song,currentsong->songname);p = my_song;len = strlen(p);/*去掉文件名最后的'\0'*/my_song[len-1]='\0';printf("THIS SONG IS %s size=%d\n",my_song,strlen(my_song));/*运行madplay 播放器,播放MP3*/execl("/usr/local/sbin/madplay","madplay",my_song,NULL);//播放当前列表MP3 音乐printf("\n\n\n");}else //子进程{/*内存映射*/tempaddr = shmat(shmid,0,0);c_addr = (char *)tempaddr;/*把孙子进程的id 和当前播放歌曲的节点指针传入共享内存*/memcpy(c_addr,&newfd,sizeof(pid_t));memcpy(c_addr + sizeof(pid_t)+1,¤tsong,4);/*使用wait 阻塞子进程,直到孙子进程播放完才能被唤醒;当被唤醒时,表示播放MP3 期间没有按键按下,则继续顺序播放下一首MP3*/if(newfd == wait(NULL)){currentsong = currentsong->next;printf("THE NEXT SONG IS %s\n",currentsong->songname);}}}}/*MP3 音乐播放器-->调用play 函数播放音乐*/void startplay(pid_t *childpid,struct song *my_song){pid_t pid;//如果没有音乐正在播放并且不是处于暂停状态if((play_flag == 0) && (play_pause_flag != 1)){play_flag = 1;play_stop_flag = 0;/*创建子进程*/pid = fork();if(pid > 0){ //父进程*childpid = pid; //子进程PID 初始化sleep(1);/*读取共享内存保存的pid,初始化孙子进程的pid*//*p_addr 指向共享内存,保存的是孙子进程的ID*/memcpy(&gradchild,p_addr,sizeof(pid_t));}else if(0 == pid){ //子进程/*子进程播放MP3 函数*/play(my_song);}}//如果没有音乐正在播放并处于暂停状态else if((play_flag == 0) && (play_pause_flag == 1)){play_flag = 1;play_pause_flag = 0;conti_play(gradchild);}elsereturn;}/*MP3 音乐播放器-->暂停播放*/void my_pause(pid_t pid){if((play_flag == 1) && (play_pause_flag == 0)){printf("=======================PAUSE!PRESS PLAY TOCONTINUE===================\n");kill(pid,SIGSTOP); //对孙子进程发送SIGSTOP 信号play_pause_flag = 1;play_flag = 0;}elsereturn;}/*MP3 音乐播放器-->继续播放*/void conti_play(pid_t pid){printf("===============================CONTINUE===================== ========\n");kill(pid,SIGCONT); //对孙子进程发送SIGCONT 信号}/*MP3 音乐播放器-->播放下一首*//*只有正在播放音乐的状态下,上一首和下一首才有作用*/void next(pid_t next_pid){int res;if(play_flag == 0){return;}else{struct song *nextsong;printf("===============================NEXTMP3======================= ======\n");/*从共享内存获得孙子进程播放歌曲的节点指针*/memcpy(&nextsong,p_addr + sizeof(pid_t)+1,4);/*指向下首歌曲的节点*/nextsong = nextsong->next;/*杀死当前歌曲播放的子进程,孙子进程*/res = kill(pid,SIGKILL);if(res == -1){perror("kill next pid error");return;}res = kill(next_pid,SIGKILL);if(res == -1){perror("kill next next_pid error");res=system("killall madplay");if(res == -1) perror("system");}//wait(NULL);play_flag = 0;startplay(&pid,nextsong);}}/*MP3 音乐播放器-->播放上一首*/void prev(pid_t prev_pid){int res;if(play_flag == 0){return;}else {struct song *prevsong;/*从共享内存获得孙子进程播放歌曲的节点指针*/printf("===============================PRIORMP3=============================\n");memcpy(&prevsong,p_addr + sizeof(pid_t)+1,4);/*指向上首歌曲的节点*/prevsong = prevsong->prev;/*杀死当前歌曲播放的子进程,孙子进程*/res = kill(pid,SIGKILL);if(res == -1){perror("kill prev pid error");return;}res = kill(prev_pid,SIGKILL);if(res == -1){perror("kill prev prev_pid error");res=system("killall madplay");if(res == -1) perror("system");}//wait(NULL);play_flag = 0;startplay(&pid,prevsong);}}/*MP3 音乐播放器-->停止播放*/void my_stop(pid_t g_pid){int res;if(play_stop_flag == 1){//如果已经停止,直接返回return;}if((play_flag == 1) || (play_pause_flag == 1)){printf("=======================STOP!PRESS PLAY TO START===================\n");res = kill(pid,SIGKILL); //对子进程发送SIGKILL 信号if(res == -1){perror("stop pid error");return;}res = kill(g_pid,SIGKILL); //对孙子进程发送SIGKILL 信号if(res == -1){perror("stop g_pid error");res=system("killall madplay");if(res == -1) perror("system");}play_flag = 0;play_stop_flag = 1;play_pause_flag = 0;}elsereturn;}/*MP3 音乐播放器-->播放列表*//*搜索列表音乐名字与歌曲相匹配,并杀死正在播放歌曲进程而播放对应列表音乐*/void playlist(pid_t childpid,char *listsong){int res;play_flag = 0;if(strncmp(head->songname,listsong,4) == 0){res = kill(pid,SIGKILL);if(res == -1){perror("playlist kill pid error");return;}res = kill(childpid,SIGKILL);if(res == -1){perror("playlist kill childpid error");res=system("killall madplay");if(res == -1) perror("system");}wait(NULL);startplay(&pid,head);return ;}struct song *nextsong=head->next;do{if(strncmp(nextsong->songname,listsong,4)==0){res = kill(pid,SIGKILL);if(res == -1){perror("playlist kill pid error");return;}res = kill(childpid,SIGKILL);if(res == -1){perror("playlist kill childpid error");res=system("killall madplay");if(res == -1) perror("system");}wait(NULL);startplay(&pid,nextsong);return;}nextsong=nextsong->next;}while(nextsong!=head);}/*接收客户端命令*/void recvcmd(void){int cmd=0;char buf[SIZE];memset(buf,0,sizeof(buf));while(1){int len = recvfrom(server_sockfd,&cmd,4,0,(struct sockaddr*)&server_addr,&sin_size);if(len<0){continue;}switch (cmd){case PLAY:startplay(&pid,head);break;case PAUSE:my_pause(gradchild);break;case STOP:my_stop(gradchild);break;case NEXT:next(gradchild);break;case PREV:prev(gradchild);break;case LISTSONG:memset(buf,0,sizeof(buf));len=recvfrom(server_sockfd,buf,sizeof(buf),0,(struct sockaddr*)&client_addr,&sin_size);if(len>0){printf("recv listbuf = %s\n",buf);playlist(gradchild,buf);}break;default:puts("not find the cmd!");break;}}}int main(){/*创建播放列表*/head=creat_song_list();/*共享内存:用于存放子进程ID,播放列表位置*/void *tempaddr;if((shmid = shmget(IPC_PRIVATE,5,PERM))== -1)perror("shmget");tempaddr = shmat(shmid,0,0);if(tempaddr == (void *)-1){perror("shmat");}p_addr = (char *)tempaddr;memset(p_addr,'\0',1024);/*初始化MP3 播放停止标志*/play_flag=0;play_stop_flag=0;play_pause_flag=0;//初始化网络int res=create_socket();if(res<0){perror("create_socket");}//接收控制命令(死循环);recvcmd();return 0;}2.play.h#ifndef PLAYER_H#define PLAYER_H/*共享内存申请标记*/#define PERM S_IRUSR|S_IWUSR#define SIZE 1024struct song{char songname[1024];struct song *prev;struct song *next;};char *playsong;/*播放标记*/int play_flag;int play_stop_flag;int play_pause_flag;/*保存接收到的字符串(推送过来的消息)*/ char temp_str[100];unsigned int pos;extern void play(struct song *currentsong); extern struct song *creat_song_list(void);extern void startplay(pid_t *childpid,struct song *my_song); extern void my_pause(pid_t pid);extern void my_stop(pid_t g_pid);extern void conti_play(pid_t pid);extern void next(pid_t next_pid);extern void prev(pid_t prev_pid);extern void playlist(pid_t childpid,char *listsong);#endif3.socket.c#include "socket.h"int server_sockfd;socklen_t sin_size;struct sockaddr_in server_addr;struct sockaddr_in client_addr;int create_socket(){memset(&server_addr, 0, sizeof(server_addr));/* 初始化网络信息*/server_addr.sin_family = AF_INET; //设置为IP 通信server_addr.sin_addr.s_addr = INADDR_ANY; //无限制server_addr.sin_port = htons(8000);if ((server_sockfd = socket(PF_INET,SOCK_DGRAM,0)) < 0) { return -1;}if(bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0) {return -1;}return 1;sin_size = sizeof(struct sockaddr_in);}4.socket.h#ifndef SOCKET_H#define SOCKET_H#include "common.h"#define PLAY 11#define PAUSE 12#define STOP 13#define CONTINUE 14#define NEXT 15#define PREV 16#define LISTSONG 18extern int server_sockfd;extern socklen_t sin_size;extern struct sockaddr_in server_addr; extern struct sockaddr_in client_addr; extern int create_socket();#endifmon.h#ifndef __COMMON_H#define __COMMON_H#include <stdio.h>#include <stdlib.h>#include <string.h>#include <pthread.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <string.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>#include <linux/input.h>#include <termios.h>#include <signal.h>#include <sys/select.h>#include <errno.h>#include <sys/wait.h>#include <string.h>#include <sys/ipc.h>#include <sys/shm.h>#include <fcntl.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <signal.h>#define ERROR -1#endif6.makefilename=*.cBIN=playerFLAGS=-g -O2 -Walldefault:gcc $(FLAGS) $(name) -o $(BIN)__ 3.3.2音乐播放器客户端程序实现1,player.cpp#include "player.h"#include "ui_player.h"#include "listmusic.h"#include "socket.h"player::player(QWidget *parent) : QDialog(parent),ui(new Ui::player){ui->setupUi(this);init_socket();}player::~player(){delete ui;}void player::on_play_clicked(){int cmd = 0;int len;cmd = PLAY;len=sendto(client_sockfd, &cmd, 4,0, (struct sockaddr *)&client_addr, sin_size);if (len < 0) {QMessageBox::question(this, tr("结果"),QString(tr("发送网络数据失败")));return;}}void player::on_pause_clicked(){int cmd = PAUSE;int len=sendto(client_sockfd,&cmd,4,0,(struct sockaddr*)&client_addr,sin_size);if(len<0){QMessageBox::question(this,tr("结"),QString(tr("发送网络数据失败")));return ;}}void player::on_next_clicked(){int cmd = NEXT;int len=sendto(client_sockfd, &cmd, 4,0, (struct sockaddr*)&client_addr, sin_size);if (len < 0) {QMessageBox::question(this, tr("结"),QString(tr("发送网络数据失败")));return;}}void player::on_prev_clicked(){int cmd = PREV;int len=sendto(client_sockfd, &cmd, 4,0, (struct sockaddr*)&client_addr, sin_size);if (len < 0) {QMessageBox::question(this, tr("结果"),QString(tr("发送网络数据失败")));return;}}void player::on_listbutton_clicked(){player xy3;listmusic l;//l.setWindowFlags(Qt::FramelessWindowHint);l.setGeometry(850,250,250,350);//l.show();if(l.exec()==Accepted){xy3.show();}}void player::on_stop_clicked(){int cmd = STOP;int len=sendto(client_sockfd, &cmd, 4,0, (struct sockaddr*)&client_addr, sin_size);if (len < 0) {QMessageBox::question(this, tr("结果"),QString(tr("发送网络数据失败")));return;}}2.play.h#ifndef PLAYER_H#define PLAYER_H#include <QDialog>#include <QtDebug>#include <QTimer>#include <QMessageBox>#include <QFileDialog>#include <QTextCodec>#include <QDateTime>#include <QProgressDialog>#include "socket.h"namespace Ui {class player;}class player : public QDialog{Q_OBJECTpublic:explicit player(QWidget *parent = 0);~player();private slots:void on_play_clicked();void on_pause_clicked();void on_next_clicked();void on_prev_clicked();void on_listbutton_clicked();void on_stop_clicked();private:Ui::player *ui;};#endif // PLAYER_H3.socket.cpp#include "socket.h"/* 网络通信变量*/int client_sockfd;int len;int sin_size;struct sockaddr_in client_addr;void init_socket(){/* 创建socket 跟设备进行通信*/client_addr.sin_family = AF_INET;client_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //服务器IP //client_addr.sin_addr.s_addr = inet_addr("192.168.1.6");client_addr.sin_port = htons(8000);if ((client_sockfd = socket(PF_INET,SOCK_DGRAM,0)) < 0) {printf("socket error\n");exit(-1);}sin_size = sizeof(struct sockaddr_in);}#ifndef SOCKET_H#define SOCKET_H4.socket.h/* 网络数据头文件*/#include <stdio.h>#include <sys/types.h> /* See NOTES */ #include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/time.h>#include <stdlib.h>#define PLAY 11#define PAUSE 12#define STOP 13#define CONTINUE 14#define NEXT 15#define PREV 16#define LISTSONG 18extern void init_socket();extern int client_sockfd;extern int len;extern int sin_size;extern struct sockaddr_in client_addr; #endif // SOCKET_H第四章调试过程4.1硬件连接实训机器的硬件配置要求如下:硬件类型主讲机器学员机器CPU:(主讲机器)基本 Intel Pentium®系列 2.0GHz 以上,推荐Intel Pentium®系列双核;(学员机器)Intel Pentium®系列1.6GHz 以上,推荐Intel Pentium®系列2.0GHz 以上。