GESC通讯中心管理嵌入式软件说明书.docx
- 文档编号:9722681
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:32
- 大小:111.06KB
GESC通讯中心管理嵌入式软件说明书.docx
《GESC通讯中心管理嵌入式软件说明书.docx》由会员分享,可在线阅读,更多相关《GESC通讯中心管理嵌入式软件说明书.docx(32页珍藏版)》请在冰豆网上搜索。
GESC通讯中心管理嵌入式软件说明书
GESC通讯中心管理嵌入式软件说明书
摘要
嵌入式项目T-CAR智能小车是嵌入式技术和物联网技术结合的产物。
TCAR以三星高端微处理器为主控实现主要控制工作,将WIFI无线通信与ZIGBEE近距离无线组网通信相结合实现近距离和远程无线控制、信息采集等功能。
T-CAR即可作为互联网终端、物联网网关,也可以和工业控制、智能家居等系统融合使用。
本课题目的是在ARM-Linux嵌入式环境下实现网络功能,系统主要由硬件层、内核层、应用层三部分构成。
由于Linux具有可移植度高、自由、免费等特性,最近几年,它在移动设备和个人电脑领域的应用也越来越广泛,因此我们选择Linux操作系统,鉴于以上应用领域对用户界面友好性方面的要求,几乎所有的此类应用都是采用图形用户界面。
播放界面采用Qt设计,Qt是创造图形用户界面的最流行的跨平台GUI工具箱之一。
这里将通过一个使用Qt技术的简单mp3播放器的实现,详细描述Linux环境下的图形界面编程技术。
本实训课程是嵌入式应用开发方向的实训课程,主要介绍嵌入式应用程序的开发技术,课程内容涉及C语法及核心库、嵌入式Linux开发环境、嵌入式Linux应用开发流程。
在内容组织上,以案例贯穿课程的始终。
通过一系列案例的学习使学员能基本掌握嵌入式Linux应用程序开发的基本技术,能开发出有图形界面,可交互,具有一定业务逻辑的嵌入式Linux应用程序。
关键字:
嵌入式;QT;mp3播放器;
前言
随着社会的日益信息化,计算机和网络已经全面渗透到日常生活的每一个角落。
对于我们每个人来说,需要的已经不再仅仅是那种放在桌上处理文档、进行工作管理和生产控制的计算机机器。
任何一个普通人都可能拥有从小到大的各种使用嵌入式技术的电子产品,小到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课程设计环境
环境要求:
操作系统:
windows7+ubuntu虚拟系统
平台:
vim编辑器,GNU工具链,Qtcreator集成开发环境
开发语言:
C/C++
文档环境:
windowsoffice
第二章设计方案
2.1设计功能
音乐播放器功能说明:
服务器实现完整的音乐播放器功能,客户端通过网络实现控制操作。
包括如下:
1、Madplay音乐播放器移植;
2、音乐播放器服务器设计,通过网络接收客户端请求并执行对应动作,实现音乐播放、暂停、上一首、下一首、播放列表、停止等功能;
3、QT客户端界面设计,要求利用qt设计控制客户端界面,实现通过网络向服务器发送命令请求等功能。
2.2设计思路
1、开发环境搭建,虚拟机配置相关vim编辑器,gcc编译器等相关软件配置。
2、madplay音乐播放器移植,包括libmad音频解码库的使用,,所以首先需要移植madplay,具体方法如下:
1)创建安装库的路径sudomkdir/opt/arm/madplay/lib
2)进入madplay源码目录执行./build
3)测试将madplay和库文件复制到根文件系统,配置LD_LIBRARY_PATH,执行madplayxxx.mp3。
3、服务器端程序设计,采用C语言在Linux环境在完成音乐播放器功能。
4、利用Qtcreator设计客户端界面,实现向服务器发送控制命令等功能
第三章软件设计
3.1模块流程图
图1.1模块流程图
3.2Madplay移植
1)首先建立一个mp3文件夹,进入到mp3文件夹后再建立两个文件夹,一个存放源码,一个存放安装文件。
在home下,mkdir两个文件夹:
madplay-src、madplay。
依次解压四个源码包到madplay目录下:
tarzxvfXXX.tar.gz
(2)编译zlib-1.1.4
进入zlib源文件目录,依此执行./configure9/26makemakeinstall
(3)编译libid3tag
进入tag源码目录,依此执行./configuremakemakeinstall
(4)编译libmad
进入libmad源码,依此执行./configuremake
注:
使用的是高版本的ARM-LINUX-GCC如4.4.6编译器,MAKE时可能会出现”CCL:
ERROR:
UNRECOGNIZEDCOMMANDLINEOPTION“-FFORCE-MEM””错误,这是因为这个高版本的GCC没有”-FFORCEMEM”参数,解决的办法是在LIBMAD文件中的MAKEFILE里面查找”-FFORCE-MEM”,将其删除即可makeinstall
(5)编译madplay
进入madplay源码目录,依此执行./configure–-withalsamakemakeinstall
(6)测试madplay
执行命令(配置环境变量):
exportLD_LIBRARY_PATH
=$LD_LIBRARY_PATH/usr/local/lib
运行:
madplayxx.mp3
3.3程序清单
3.3.1音乐播放器服务器程序实现
1.player.c
#include"common.h"
#include"socket.h"
#include"player.h"/*孙子进程id号*/
pid_tgradchild;/*子进程id号*/
pid_tpid;/*共享内存描述标记*/
intshmid;
char*p_addr;/*共享内存内容格式*//*|gradchild(孙子进程PID)|+|空一个字节|+currentsong(当前播放列表的节点指针)
|*//*listheadformusic*/
structsong*head;/*创建歌曲名的双向循环链表*/
structsong*creat_song_list(void)
{FILE*fd;
ssize_tsize;
size_tlen;
char*line=NULL;
structsong*p1;
structsong*p2;
intres=system("ls./song>song_list");
if(res==-1)perror("system");
fd=fopen("song_list","rb");
if(fd==NULL){
perror("fopen");}
p1=(structsong*)malloc(sizeof(structsong));
printf("==================================song
list=====================================\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;
intn=strlen(line);
(head->songname)[n]='\0';
while((size=getline(&line,&len,fd))!
=-1)//从文件中读取一行,直到出错或者到文件尾EOF返回-1
{p2=p1;
p1=(structsong*)malloc(sizeof(structsong));
strncpy(p1->songname,line,strlen(line));
p2->next=p1;
p1->prev=p2;
intn=strlen(line);
(p1->songname)[n]='\0';}
p1->next=head;
head->prev=p1;
p1=NULL;
p2=NULL;
res=system("rm-rfsong_list");
if(res==-1)perror("system");
returnhead;}/*MP3音乐播放器-->播放音乐函数*/
voidplay(structsong*currentsong)
{pid_tnewfd;
char*c_addr;
void*tempaddr;
char*p;
intlen;
charmy_song[2048]="./song/";
while(currentsong)
{printf("currentsongsize=%d\n",strlen(currentsong->songname));/*子进程创建孙子进程*/
newfd=fork();
if(newfd==-1)
{perror("fork");
exit
(1);}
elseif(newfd==0)//孙子进程
{printf("playforksuccess!
\n");/*把歌曲名加上根路径*/
strcat(my_song,currentsong->songname);
p=my_song;
len=strlen(p);/*去掉文件名最后的'\0'*/
my_song[len-1]='\0';
printf("THISSONGIS%ssize=%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("THENEXTSONGIS%s\n",currentsong->songname);}}}}
/*MP3音乐播放器-->调用play函数播放音乐*/
voidstartplay(pid_t*childpid,structsong*my_song)
{pid_tpid;//如果没有音乐正在播放并且不是处于暂停状态
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));}
elseif(0==pid){//子进程/*子进程播放MP3函数*/
play(my_song);}}//如果没有音乐正在播放并处于暂停状态
elseif((play_flag==0)&&(play_pause_flag==1)){
play_flag=1;
play_pause_flag=0;
conti_play(gradchild);}
else
return;}
/*MP3音乐播放器-->暂停播放*/
voidmy_pause(pid_tpid)
{if((play_flag==1)&&(play_pause_flag==0)){
printf("=======================PAUSE!
PRESSPLAYTO
CONTINUE===================\n");
kill(pid,SIGSTOP);//对孙子进程发送SIGSTOP信号
play_pause_flag=1;
play_flag=0;}
else
return;}
/*MP3音乐播放器-->继续播放*/
voidconti_play(pid_tpid)
{printf("===============================CONTINUE=============================\n");
kill(pid,SIGCONT);//对孙子进程发送SIGCONT信号}
/*MP3音乐播放器-->播放下一首*/
/*只有正在播放音乐的状态下,上一首和下一首才有作用*/
voidnext(pid_tnext_pid)
{intres;
if(play_flag==0){
return;}
else{
structsong*nextsong;
printf("===============================NEXTMP3=============================\n");
/*从共享内存获得孙子进程播放歌曲的节点指针*/
memcpy(&nextsong,p_addr+sizeof(pid_t)+1,4);
/*指向下首歌曲的节点*/
nextsong=nextsong->next;
/*杀死当前歌曲播放的子进程,孙子进程*/
res=kill(pid,SIGKILL);
if(res==-1){
perror("killnextpiderror");
return;}
res=kill(next_pid,SIGKILL);
if(res==-1){
perror("killnextnext_piderror");
res=system("killallmadplay");
if(res==-1)perror("system");}
//wait(NULL);
play_flag=0;
startplay(&pid,nextsong);}}
/*MP3音乐播放器-->播放上一首*/
voidprev(pid_tprev_pid)
{intres;
if(play_flag==0){
return;}
else{
structsong*prevsong;
/*从共享内存获得孙子进程播放歌曲的节点指针*/
printf("===============================PRIORMP3=============================\n");
memcpy(&prevsong,p_addr+sizeof(pid_t)+1,4);
/*指向上首歌曲的节点*/
prevsong=prevsong->prev;
/*杀死当前歌曲播放的子进程,孙子进程*/
res=kill(pid,SIGKILL);
if(res==-1){
perror("killprevpiderror");
return;}
res=kill(prev_pid,SIGKILL);
if(res==-1){
perror("killprevprev_piderror");
res=system("killallmadplay");
if(res==-1)perror("system");}
//wait(NULL);
play_flag=0;
startplay(&pid,prevsong);}}
/*MP3音乐播放器-->停止播放*/
voidmy_stop(pid_tg_pid)
{intres;
if(play_stop_flag==1){//如果已经停止,直接返回
return;}
if((play_flag==1)||(play_pause_flag==1)){
printf("=======================STOP!
PRESSPLAYTO
START===================\n");
res=kill(pid,SIGKILL);//对子进程发送SIGKILL信号
if(res==-1){
perror("stoppiderror");
return;}
res=kill(g_pid,SIGKILL);//对孙子进程发送SIGKILL信号
if(res==-1){
perror("stopg_piderror");
res=system("killallmadplay");
if(res==-1)perror("system");}
play_flag=0;
play_stop_flag=1;
play_pause_flag=0;}
else
return;}
/*MP3音乐播放器-->播放列表*/
/*搜索列表音乐名字与歌曲相匹配,并杀死正在播放歌曲进程而播放对应列表音乐*/
voidplaylist(pid_tchildpid,char*listsong)
{intres;
play_flag=0;
if(strncmp(head->songname,listsong,4)==0){
res=kill(pid,SIGKILL);
if(res==-1){
perror("playlistkillpiderror");
return;}
res=kill(childpid,SIGKILL);
if(res==-1){
perror("playlistkillchildpiderror");
res=system("killallmadplay");
if(res==-1)perror("system");}
wait(NULL);
startplay(&pid,head);
return;}
structsong*nextsong=head->next;
do{
if(strncmp(nextsong->songname,listsong,4)==0){
res=kill(pid,SIGKILL);
if(res==-1){
perror("playlistkillpiderror");
return;}
res=kill(childpid,SIGKILL);
if(res==-1){
perror("playlistkillchildpiderror");
res=system("killallmadplay");
if(res==-1)perror("system");}
wait(NULL);
startplay(&pid,nextsong);
return;}
nextsong=nextso
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GESC 通讯 中心 管理 嵌入式 软件 说明书