基于嵌入式系统LCD播放器的设计

来源:网络收集 时间:2025-04-26 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xuecool-com或QQ:370150219 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

perror(\ return 0; } */ } close(sockfd); // pthread_join(tid1,NULL); // pthread_join(tid2,NULL); // pthread_join(tid3,NULL); // pthread_join(tid4,NULL); } return 0; } void LCD_player() { while (1) { close(fd_pipe[pipe_write]); read(fd_pipe[pipe_read], buff_c, 100); close(fd_pipe[pipe_read]); if (strcmp(buff_c, \ player_lock = 1; if (player_lock == 1) { close(fd2_pipe[pipe_read]); dup2(fd2_pipe[pipe_write], 1); execlp(\ \ //system(\ } } } void *recv_info(void *arg) { int n; char buf[100]; //char buf2[100]; char *buff_temp; char screen_flag = 0; printf(\ /*while ((n = recv(clientfd, buf, 100, 0)) > 0) { buf[n] = '\\0'; printf(\ pthread_mutex_lock(&mutex_g); strcpy(recv_buf, buf); pthread_mutex_unlock(&mutex_g); } */ while (1) { //pthread_mutex_lock(&mutex_g); if ((n = recv(clientfd, buf, 100, 0)) > 0) { buf[n] = '\\0'; printf(\ //strcpy(recv_buf, buf); /*if (strcmp(buf1, recv_buf) != 0) { strcpy(buf1, recv_buf); strcpy(buf, buf1); printf(\

41

pthread_mutex_lock(&mutex_g); */ switch (buf[0]) { //if (buf[0] == 'E') //关于表格 case 'E': { if (screen_flag == 0) { clear_screen(lcdinfo, 0x0a); screen_flag = 1; } Excle_dispose(buf); } break; //else if (buf[0] == 'L' && buf[1] == 'S') //get_dir(); case 'L': { buff_temp = get_dir_song(); pthread_mutex_lock(&mutex_s); strcpy(data_s.buff_s, buff_temp); pthread_mutex_unlock(&mutex_s); } break; //else if (buf[0] == 'S' && buf[1] == 'S') case 'S': { song_num = (int) (buf[2] - 0x30); if (song_num > song_num_max) song_num = song_num_max; play_num_song(); } break; //else if (buf[0] == 'T' && buf[1] == 'U') case 'T': { screen_flag = 0; system(\ } break; //else if (buf[0] == 'C' && buf[1] == 'M') //send_cmd(); case 'C': { screen_flag = 0; if (buf[2] == 'P') PAUSE(); if (cmd_lock == 1) { switch (buf[2]) { case 'I': get_msg(); break; case 'U': play_up_song(); break; case 'D': play_down_song(); break; case 'S': { strcpy(buff_p, \42

close(fd_pipe[pipe_read]); write(fd_pipe[pipe_write], buff_p, strlen(buff_p)); close(fd_pipe[pipe_write]); player_lock = 1; } break; } } } break; } } } return (void *) 0; } void Excle_dispose(char *buf) { int i = 0, j = 0, l = 0, n = 0; int wirth = 3, wirth_NEXT = 0; int Ex_row = 0, Ex_leg = 0, Ex_i = 0, Ex_j = 0, Ex_I = 0; char buf1[100]; char buf3[50]; char buf2[50][50]; //===================添加分行处理======================================== for (i = 0; i < strlen(buf); i++) { if (buf[i] == '\\n') { for (; j <= i; j++) { buf1[l] = buf[j]; l++; } buf1[l] = '\\0'; l = 0; printf(\ strcpy(buf2[n], buf1); n++; } } //======================================================================= for (j = 0; j < n; j++) { strcpy(buf1, buf2[j]); if (strncmp(buf1, \ Ex_row = (int) (buf1[5] - 0x30) * 10 + (int) (buf1[6] - 0x30); else if (strncmp(buf1, \ Ex_leg = (int) (buf1[5] - 0x30) * 10 + (int) (buf1[6] - 0x30); else { Ex_i = (int) (buf1[2] - 0x30) * 10 + (int) (buf1[4] - 0x30) - 1; Ex_j = (int) (buf1[6] - 0x30) * 10 + (int) (buf1[8] - 0x30) - 1; for (i = 9; i < (strlen(buf1) - 2); i++) { buf3[i - 9] = buf1[i]; } buf3[i - 9] = '\\0'; g2u(buf3, strlen(buf3), buf1, 100); if ((Ex_i == Ex_I)) { if (wirth <= strlen(buf1)) wirth = strlen(buf1);

43

mylcd_printf(lcdinfo, wirth_NEXT + 1, Ex_j, 0x0c, 0xff, 1, buf1); } else { Ex_I = Ex_i; wirth_NEXT = wirth; Glib_Line(lcdinfo, (wirth_NEXT * 16 + 5), 0, (wirth_NEXT * 16 + 5), Ex_j * 17, 0x07); mylcd_printf(lcdinfo, wirth_NEXT + 1, Ex_j, 0x0c, 0xff, 1, buf1); } mylcd_printf(lcdinfo, 10, 14, 0x0c, 0xff, 1, \ } } } /*void *dipose_thread(void *arg) { char buf[100]; char buf1[100]; char buf2[100]; char *buff_temp; char screen_flag = 0; //int size = 0; int wirth = 3, wirth_NEXT = 0; //int line_x = 0, line_y = 0; int Ex_row = 0, Ex_leg = 0, Ex_i = 0, Ex_j = 0, Ex_I = 0, i = 0; while (1) { //strcpy(buf1, recv_buf); //pthread_mutex_lock(&mutex_g); if (strcmp(buf1, recv_buf) != 0) { strcpy(buf1, recv_buf); strcpy(buf, buf1); printf(\ pthread_mutex_lock(&mutex_g); switch (buf[0]) { //if (buf[0] == 'E') //关于表格 case 'E': { if (screen_flag == 0) { clear_screen(lcdinfo, 0x0a); screen_flag = 1; } if (strncmp(buf, \ Ex_row = (int) (buf[5] - 0x30) * 10 + (int) (buf[6] - 0x30); else if (strncmp(buf, \ Ex_leg = (int) (buf[5] - 0x30) * 10 + (int) (buf[6] - 0x30); else { Ex_i = (int) (buf[2] - 0x30) * 10 + (int) (buf[4] - 0x30) - 1; Ex_j = (int) (buf[6] - 0x30) * 10 + (int) (buf[8] - 0x30) - 1; for (i = 9; i < (strlen(buf) - 2); i++) { buf2[i - 9] = buf[i]; } buf2[i - 9] = '\\0'; g2u(buf2, strlen(buf2), buf, 100); if ((Ex_i == Ex_I)) { if (wirth <= strlen(buf))

44

5), JUANJUAN\

wirth = strlen(buf); mylcd_printf(lcdinfo, wirth_NEXT + 1, Ex_j, 0x0c, 0xff, 1, buf); } else { Ex_I = Ex_i; wirth_NEXT = wirth; Glib_Line(lcdinfo, (wirth_NEXT * 16 + 5), 0, (wirth_NEXT * 16 + } Ex_j * 17, 0x07); mylcd_printf(lcdinfo, wirth_NEXT + 1, Ex_j, 0x0c, 0xff, 1, buf); mylcd_printf(lcdinfo, 10, 14, 0x0c, 0xff, 1, \YOU } } break; //else if (buf[0] == 'L' && buf[1] == 'S') //get_dir(); case 'L': { buff_temp = get_dir_song(); pthread_mutex_lock(&mutex_s); strcpy(data_s.buff_s, buff_temp); pthread_mutex_unlock(&mutex_s); } break; //else if (buf[0] == 'S' && buf[1] == 'S') case 'S': { song_num = (int) (buf[2] - 0x30); if (song_num > song_num_max) song_num = song_num_max; play_num_song(); } break; //else if (buf[0] == 'T' && buf[1] == 'U') case 'T': { screen_flag = 0; system(\ } break; //else if (buf[0] == 'C' && buf[1] == 'M') //send_cmd(); case 'C': { screen_flag = 0; if (buf[2] == 'P') PAUSE(); if (cmd_lock == 1) { switch (buf[2]) { case 'I': get_msg(); break; case 'U': play_up_song(); break; case 'D': 45

编号:

毕业设计(论文)说明书

课 题: 基于嵌入式系统的

LCD播放器设计

学 院: 电子工程与自动化学院 专 业: 自动化 学生姓名: 学 号:

指导教师单位: 电子工程与自动化学院 姓

名:

职 称:

题目类型: 理论研究 实验研究 √ 工程设计 工程技术研究 软件开发

2013 年 5 月 13日

摘 要

嵌入式系统是一种专用的计算机系统,是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。随着人类进入了PC时代,嵌入式技术得到了飞速发展和广泛应用,嵌入式系统已成为当前最热门、最具发展前途的IT应用领域之一。包括手机、电子字典、可视电话、数字相机(DC)、数字摄像机(DV)、U-Disk、机顶盒(Set Top Box)、高清电视(HDTV)、游戏机、智能玩具、交换机、路由器、数控设备或仪表、汽车电子、家电控制系统、医疗仪器、航天航空设备等都是典型的嵌入式系统。本文提出了一种基于嵌入式LCD的播放器设计与实现的方案,该播放器具有VGA等视屏接口,同时具有网络控制的功能。

本文首先详细分析了嵌入式的体系结构,研究了嵌入式Linux操作系统在ARM9微处理器的移植技术,包括交叉编译环境的建立、引导装载程序应用、移植嵌入式Linux内核及建立根文件系统,并且实现了嵌入式Linux到S3C2440开发板的移植。

由于嵌入式系统本身硬件条件的限制,常用在PC机的图形用户界面GUI系统不适合在其上运行。为此,本文选择了qtopia-2.2.0作为研究对象,在对其体系结构等方面进行研究基础上,实现了qtopia-2.2.0到S3C2410开发板的移植,完成了嵌入式图形用户界面开发,使得系统拥有良好的操作界面。

对于播放器的功能,本文实现了Linux系统下的通用媒体播放器—Mplayer到S3C2440开发板的移植。通过对音频数据输出的研究,解决了Mp1ayer播放声音不正常的问题,实现了一个集音乐和视频、图像播放于一体的嵌入式多媒体播放系统。

作为为LCD播放器自己侧重于做LCD显示部分。本文所用的不是通常的开发板上的LCD,而是经过接口转换,最后通过VGA在大显示屏上显示,实现图像和电子表格的播放。至于操作和控制部分则是通过网络功能由上位机进行控制。

最后,总结了论文所做的工作,指出了嵌入式播放器所需要进一步解决和完善的问题。

关键词:嵌入式ARM-Linux; S3C2440; Mplayer; qtopia-2.2.0

I

Abstract

The embedded system is a specialized computer system is application-centric, based on computer technology, software and hardware can be cut to adapt applications demanding a special computer system functionality, reliability, cost, size, power consumption. As mankind enters the PC era, embedded technology has been rapid development and wide application, embedded systems have become the most popular, the most promising IT applications. Including mobile phones, electronic dictionaries, video phone, digital camera (DC), digital video cameras (DV), U-Disk, STB (Set Top Box), high-definition TV (HDTV), video games, smart toys, switches, routers, CNC equipment or instrumentation, automotive electronics, appliance control systems, medical equipment, aerospace equipment, etc. are typical embedded system. This paper presents a design and implementation of the program, the player has a VGA screen interface, but also has the function of network control based on the embedded LCD player.

First, This article detailed analysis of the embedded architecture, transplantation of embedded Linux operating system in the ARM9 microprocessor, including the cross compiler built environment, the boot loader application, transplant embedded Linux kernel and root file system,and embedded Linux to S3C2440 development board transplantation.

Due to hardware constraints of embedded systems, commonly used in PC's graphical user interface (GUI) system is not suitable for running on it. To this end, we selected Qtopia-2.2.0 as the research object, on the basis of the study in terms of its architecture, the qtopia-2.2.0 S3C2410 development board transplantation, embedded graphical user interface development, so that the system has a good user interface.

For the player, the Linux system, the universal media player-Mplayer to S3C2440 development board transplantation. Audio data output, to solve the problem is not normal for Mp1ayer play a sound, a set of music and video, image playback in one of the embedded multimedia playback system.

As for LCD player focus on a LCD display part. Used herein instead of the usual development board LCD, but via the interface converter, and finally through the VGA display on a large display screen, Player image and spreadsheets. As for the operation and control part is controlled by the host computer through the network function.

Finally, summarizes the paper work done, pointed out that the embedded player need to further address and sound

Key words: Embedded ARM-Linux; S3C2410; Mplayer; GUI ; qtopia-2.2.0

II

目 录

摘 要 ---------------------------------------------------------------------------------------------------------------------------- I Abstract --------------------------------------------------------------------------------------------------------------------------II 目 录 ------------------------------------------------------------------------------------------------------------------------- III 第一章 绪论 ------------------------------------------------------------------------------------------------------------------ 1

1.1系统研究背景 ------------------------------------------------------------------------------------------------------ 1

1.1.2 嵌入式多媒体播放器国内外发展现状 ----------------------------------------------------------- 2 1.2 嵌入式处理器 ----------------------------------------------------------------------------------------------------- 3 1.3 嵌入式系统 -------------------------------------------------------------------------------------------------------- 5

1.3.1嵌入式系统的概述 --------------------------------------------------------------------------------------- 5 1.3.2 嵌入式操作系统的选择 -------------------------------------------------------------------------------- 5

1.4 本文的意义和主要工作 ----------------------------------------------------------------------------------------- 7 第二章 系统软硬件平台的搭建 ------------------------------------------------------------------------------------------ 8

2.1 硬件开发平台的介绍 ------------------------------------------------------------------------------------------ 8

2.1.1 核心板 ------------------------------------------------------------------------------------------------------ 8 2.1.2 外设板[11] ------------------------------------------------------------------------------------------------- 8 2.1.3 设计所用硬件介绍 ------------------------------------------------------------------------------------- 9 2.2 硬件平台的设计方案 ------------------------------------------------------------------------------------------ 9

2.2.1 核心板设计 ---------------------------------------------------------------------------------------------- 9 2.2.2 外设电路设计 ------------------------------------------------------------------------------------------- 12 2.3 嵌入式软件开发环境 ------------------------------------------------------------------------------------------ 13

2.3.1 引导装载程序 ------------------------------------------------------------------------------------------- 14 2.3.2 宿主机开发环境配置 --------------------------------------------------------------------------------- 15 2.3.3 交叉开发环境的建立 --------------------------------------------------------------------------------- 16 2.3.4 内核的编译 ---------------------------------------------------------------------------------------------- 16 2.3.5 制作文件系统 ------------------------------------------------------------------------------------------- 17 2.3.6 图形化界面qtopia-2.2.0 ---------------------------------------------------------------------------- 19

第三章 Mplayer的移植 --------------------------------------------------------------------------------------------------- 20 3.1 Mplayer的简介 ------------------------------------------------------------------------------------------------- 20

III

[1]

3.2 Mplayer的移植 ------------------------------------------------------------------------------------------------- 21

3.2.1 交叉编译libmad --------------------------------------------------------------------------------------- 21 3.2.2安装Mplayer -------------------------------------------------------------------------------------------- 22 3.2.3测试 -------------------------------------------------------------------------------------------------------- 23

第四章 嵌入式LCD播放器的设计------------------------------------------------------------------------------------ 24

4.1 设计框图 --------------------------------------------------------------------------------------------------------- 24 4.2 嵌入式LCD播放器所用到Linux编程知识 -------------------------------------------------------------- 24

4.2.1 内存管理和使用---------------------------------------------------------------------------------------- 25 4.2.2 进程、线程的使用[8] ---------------------------------------------------------------------------------- 26 4.2.3 Linux下的网络编程 ----------------------------------------------------------------------------------- 27 4.2.4 信息交换与同步---------------------------------------------------------------------------------------- 29 4.4 静态图片和电子表格的显示 -------------------------------------------------------------------------------- 33 4.5上位机的制作 ---------------------------------------------------------------------------------------------------- 33

4.5.1基于vb2008Socket的建立[9][10] ------------------------------------------------------------------- 34 4.5.2 VB2008对EXCEL的操作。 ----------------------------------------------------------------------- 34

第五章 总结与展望 -------------------------------------------------------------------------------------------------------- 35

5.1 本文主要完成的工作及结论 -------------------------------------------------------------------------------- 35 5.2 完善与展望 ------------------------------------------------------------------------------------------------------ 36 致 谢 ------------------------------------------------------------------------------------------------------------------------- 37 参考文献: ------------------------------------------------------------------------------------------------------------------- 38

附录1嵌入式LCD播放器的主体程序: ----------------------------------------------------------------------- 39 附录2上位机的主体程序: --------------------------------------------------------------------------------------- 52

IV

5.2 完善与展望

虽然目前已经做了不少工作,但是考虑到系统功能扩展性的需求,今后一段时间可以在以下方面继续展开工作:

(1) 由于本设计为了节约开发成本和缩短开发周期,所有的开发都是在广州天嵌科技的TQ2440开发板上实现的,其开发板上具备了些我们所不需要的外设和功能,这并不符合嵌入式开发优秀的可裁剪性的特点。

(2) 本文所设计的LCD播放器完全是基于上位机远程控制的,其在一定意义上并不能完全的运用好系统图形化界面的功能,如是以后有机会还用结合触摸屏和VGA接口来开发,使其能够通过小的触摸屏控制大的显示屏;

(3) 在做显示电子表格这一块,本设计做得并不是很好,这是由于我们是直接操作显示屏的原因,因其对显示字库的要求,并不能正真做到完整的显示原电子表格的样子,要实现嵌入式linux上的显示和windows显示的同步,还因通过其他途径来解决。

36

致 谢

该设计及论文的撰写都是在莫太平老师的悉心指导下和同学们的帮助下,我才得以完论文的所有工作,莫老师对工作认真负责,为我们提供良好的实验环境与指导,及时督促我们认真对待毕业设计,更是时时刻刻关心我们设计的进展情况,并及时为我们解答疑难,让我们能够踏踏实实地、认真地完成设计。在此,我由衷地感谢莫老师教导我们做人的道理及传授很多专业知识,这一切将会使我受益终生。

此外,还要感谢曾经给予我帮助的同学以及Linux公社、百度知道上的朋友对我的指点和帮助。

37

参考文献:

[1] 王森林.基于嵌入式Linux的多媒体播放器设计,西安交通大学硕士研究生学位论文.2007 [2] S3C2440用户手册 7~8

[3] 马维华.嵌入式系统原理及应用.北京邮电大学出版社.2008 1~2

[4] 孙少华,徐立中. 基于嵌入式Linux系统的图形用户界面综述. 微型机与应用. 2005. 第4期.

4~6

[5] 詹瑾瑜. 基于嵌入式操作系统的图形用户界面(GUI)系统的研究与实现. 电子科技大学. 2003.

1~10

[6] 康鹏. 机顶盒设备GUI系统的设计与实现. 北京工业大学. 2003. 1~4 [7] 吕凌欧. 嵌入式人机界面组态软件研究. 大连理工大学. 2006. 1~2 [8] 弓雷. ARM嵌入式Linux系统开发详解. 清华大学出版社. 2010

[9] 洪一新,吴灿铭. Visual Basic 2008 程序设计完全自学教程. 清华大学出版社. 2009 [10]杨富国. Visual Basic.NET 网络编程案例解析. 清华大学出版社. 2009 [11]广州天嵌科技.TQ2440开发板使用手册V2.5. 2010 8~10

38

附 录

附录1嵌入式LCD播放器的主体程序: #include\ static struct lcd_info_t *lcdinfo = NULL; static int clientfd; static struct send_data data_s; pthread_mutex_t mutex_s; pthread_mutex_t mutex_rpipe; pthread_mutex_t mutex_dpipe; pthread_cond_t cond_rpipe; pthread_cond_t cond_dpipe; char cmd_lock = 1; char player_lock = 0; char buff_get[100] = { }; char buff_send[100] = { }; char recv_buf[100]; int fd_pipe[2]; //管道 int fd2_pipe[2]; char buff_p[100]; //父进程的管道 char buff_c[100]; //子进程的管道 char msg_buf[100]; char rdpipe_flag = 0; char song[20][100]; int song_num = 0; int song_num_max = 0; char tu[20][100]; int tu_num = 0; int tu_num_max = 0; int main() { pid_t pid; pthread_t tid1, tid2, tid3, tid4, tid5; int sockfd; struct sockaddr_in clienAdd; socklen_t len; lcdinfo = lcd_init(LCD_DEVICE); /* LCDinit */ if (NULL == lcdinfo) err_exit(\ clear_screen(lcdinfo, 0xf0); show16bpp(lcdinfo, 0, 0, 480, 272, (u16 *) logo480272); unlink(\ if (mkfifo(\//创建有名管道,用于写命令 { perror(\ exit(1); } if (pipe(fd_pipe) != 0) {

39

fprintf(stderr, \ return 0; } if (pipe(fd2_pipe) != 0) { fprintf(stderr, \ return 0; } pid = fork(); if (-1 == pid) { printf(\ return 0; } else if (pid == 0) { //子进程用来执行播放器 printf(\ LCD_player(); } else { //父进程用来处理信息 //======================互斥锁与条件变量===================== if (pthread_mutex_init(&mutex_s, NULL)) perror(\ if (pthread_mutex_init(&mutex_rpipe, NULL)) perror(\ if (pthread_mutex_init(&mutex_dpipe, NULL)) perror(\ if (pthread_cond_init(&cond_rpipe, NULL)) perror(\ if (pthread_cond_init(&cond_dpipe, NULL)) perror(\ if (pthread_create(&tid3, NULL, pipe_read_pthread, NULL)) perror(\if (pthread_create(&tid4, NULL, song_msg_dispose_pthread, NULL)) perror(\get_dir_song(); get_dir_tu(); sockfd = Socket_init(); while (1) { len = sizeof(clienAdd); clientfd = accept(sockfd, (struct sockaddr *) &clienAdd, &len); if (clientfd <= 0) { printf(\ close(sockfd); return 0; } if (pthread_create(&tid1, NULL, send_info, NULL)) { perror(\ return 0; } if (pthread_create(&tid2, NULL, recv_info, NULL)) { perror(\ return 0; } /*if (pthread_create(&tid5, NULL, dipose_thread, NULL)) { 40

4.2.2 进程、线程的使用[8]

在本设计需要创建一个进程来执行mplayer,同时还需要建立接收线程,发送线程等线程。现代的计算机操作系统除了硬件控制就是资源管理这两大功能了,资源管理主要是对软件资源的管理,由于操作系统都是基于多任务的,因此学会进程和线程的应用是非常必要的。

Linux系统通过fork()系统调用创建一个进程,fork()函数定义如下 #include #include Pid_t fork(void); 调用fork()函数后,系统会创建一个新的进程,称作字进程,原来的进程则为父进程。对于子进程来说,fork()返回的是0,对于父进程来说返回的是子进程的进程号,因此通过判断返回值即可知道是在进程还是父进程。创建失败则返回-1在本设计中创建了一个子进程用于运行mplayer,引用如下 int main() { pid_t pid; pid = fork(); if (-1 == pid) { printf(\ return 0; } else if (pid == 0) { //子进程用来执行播放器 printf(\ LCD_player(); } else { } } //父进程用来处理信息 线程时一种轻量级的进程,进程有自己的系统资源,而线程则没有。我们可以理解为一个进程是由一个或是多个线程组成的,在操作系统中,内核是按照线程为最小单位来调度资源的,在一个进程内部,多个线程的资源是共享的。

Linux系统开发多线程使用的是pthread库,它不是C的标准库,但是符合POSIX线程标准的,创建线程函数pthread_create()被定义在pthread.h中,定义如下 #include Int pthread_create(pthread_t *restrict thread , const pthread_attr_t *restrict attr, Void *(*start_routine)(void*), void *restrict arg) 创建成功thread参数会返回一个线程的ID,失败则整个函数会返回-1.其中attr用来设置线程的属性,通常为NULL,start_routine是函数指针,整个函数就是线程中所要执行的代码,arg则为传入该函数的参数,在需要传入多个参数时,可以使用结构体传入。

26

在多线程的程序中,通常要等待线程,以达到线程同步,这时可以调用pthread_join函数等待线程的结束。如果等待成功函数返回0,其他情况则返回出错代码。

#include Int pthread_join(pthread_t thread ,void **value_ptr) 本设计中线程函数的引用如下: pthread_t tid1, tid2, tid3, tid4, tid5; if (pthread_create(&tid1, NULL, send_info, NULL)) { //创建发送线程 perror(\ return 0; } if (pthread_create(&tid2, NULL, recv_info, NULL)) { //创建接收线程 perror(\ return 0; } if (pthread_create(&tid3, NULL, pipe_read_pthread, NULL)) //创建读取管道线程 perror(\if (pthread_create(&tid4, NULL, song_msg_dispose_pthread, NULL)) //创建分析管道线程 perror(\对于进程和线程的应用其实还有更多的内容,如若要用好这来那个资源,还需更深入的学习。作者在这里只是简单的做个介绍。 4.2.3 Linux下的网络编程

本设计需要用有线网络跟windows下的上位机进行通讯,因此要用到网络编程。本文选用基于TCP/IP协议的Socket通信。Socket常被翻译成套接字或是插口,它实际上就是网络通信的断点。使用者或是应用程序只要连接到socket便可以和网络上任何一个通信端点连接,传送数据。正所谓,网络上一切皆Socket。在linux编程中,我们可以不用管socket如何通信,Socket为我们提供类似文件描述符的操作方法,我们只需用该描述符来读写数据。根据传输方式,socket可以分为面向连接的数据流通信和无连接的数据报通信。其中面向连接的数据流通信就是基于TCP/IP协议的通信,可以是一对多的,而无连接的数据报通信则是基于UDP协议的通信,他是点对点的通信。

设计中要在开发板嵌入式Linux系统上建立Socket通讯的服务端,用到的函数有 使用socket()函数创建Socket;

#include #include Int socket(int domain,int type,int protocol); 使用bind()函数把创建的socket句柄绑定到指定的TCP端口; Int bind (int sockfd ,struct sockaddr *my_addr ,socklen_t addrlen); 使用listen()函数使socket处于监听状态,并设置监听队列的大小; Int listen(int s ,int backlog); 当客户端发送连接请求后,调用accept()函数接收客户连接请求,并建立连接 Int accept(int s,struct sockaddr *addr, socklen_t *addrlen)

27

连接好后便可以像读写文件一样对句柄进行读写,已带到发送和接收的目的,当然也可以用send()和recv()函数来进行数据传输。

Ssize_t send(int s, const void *buf,size_t len, int flags) Ssize_t recv(int s, void *buf, size_t len, int flags) 在本设计中,首先就是在父进程中创建了Socket,然后再分别创建发送线程和接收线程来进行发送和接收的。 int Socket_init(void) { int sock_fd; struct sockaddr_in serv_addr; sock_fd = socket(AF_INET, SOCK_STREAM, 0); if (sock_fd == -1) { perror(\ return 0;} else {printf(\ bzero(&serv_addr, sizeof(serv_addr)); //初始化结构占用的内存 serv_addr.sin_family = AF_INET; //设置地址传输层类型 serv_addr.sin_port = htons(EHCO_PORT); //设置监听端口 serv_addr.sin_addr.s_addr = htons(INADDR_ANY); //设置服务器地址 bzero(&(serv_addr.sin_zero), 8); if (bind(sock_fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) != 0) { perror(\ close(sock_fd); return 0;} else { printf(\ if (listen(sock_fd, MAX_CLIENT_NUM) != 0) { perror(\ close(sock_fd); return 0;} else { printf(\ return sock_fd; } 在主函数中调用Socket_init()函数,然后循环等待客户连接。

sockfd = Socket_init(); while (1) { len = sizeof(clienAdd); clientfd = accept(sockfd, (struct sockaddr *) &clienAdd, &len); if (clientfd <= 0) { printf(\ close(sockfd); return 0; } if (pthread_create(&tid1, NULL, send_info, NULL)) { perror(\ return 0; } if (pthread_create(&tid2, NULL, recv_info, NULL)) { perror(\ return 0; } }close(sockfd);} 28

4.2.4 信息交换与同步

在多进程程序中,系统资源是独立的,子进程只是把父进程的变量和资源复制下来,形成了独立的资源,因此,解决进程间的通讯时我们的一个任务。同时,在多线程的中,资源是共享的,如何让变量保持同步,也是一个重大问题。在设计中,我们所遇到的信息交换问题不单单是上诉两个,由于linux和windows(VB是基于windows文件机制的)的文件机制不同,在传输信息时,也需要进行相应的处理。

进程间的通讯方法很多,如通过共享内存,或是通过管道的读取都可以达到通讯目的。本设计使用了有名管道往mplayer中写信息,以达到控制mplayer的目的,同时建立无名管道读取mplayer返回的歌曲信息。建立方法和本文的引用在下一章中给出。

在多线程编程中,由于线程共享内存资源,因此本文使用全局变量的方式来进行信息传输。然后此时遇到的问题是如何能够达到信息同步,在linux编程中,可以使用互斥锁和条件变量来实现。所谓的互斥锁在本文理解为在多线程中的互斥变量,即,在线程1中,互斥变量被锁定了,且还没有解锁,当线程2中同样需要对该互斥变量操作时,则会检查该变量是否锁定了,如果该互斥量被线程1锁定了,则线程2需要一直等待互斥量的解锁,才能往下执行。而条件变量也是一样的工作原理,只不过,条件变量在进程中不是以锁定的方式,而是让线程睡眠,当第二线程需要它工作时才通过条件变量把该线程唤醒。我们在编程中,只需要把信息变量都写在互斥锁的操作中,就能保证多线程中的信息同步。在使用条件变量时,要把对条件变量的沉睡和唤醒操作放在互斥锁的保护中,以便能时刻监听条件的改变。线程和条件变量的创建和引用如下:

条件变量和互斥锁的创建: if (pthread_mutex_init(&mutex_s, NULL)) //发送数据的互斥锁 perror(\if (pthread_mutex_init(&mutex_rpipe, NULL)) //读取管道信息的互斥锁 perror(\if (pthread_mutex_init(&mutex_dpipe, NULL))//分析管道信息的互斥锁 perror(\if (pthread_cond_init(&cond_rpipe, NULL)) //读取管道信息的条件变量 perror(\if (pthread_cond_init(&cond_dpipe, NULL)) //分析管道信息的条件变量 perror(\ 条件变量和互斥锁的使用

pthread_mutex_lock(&mutex_s); //互斥锁保护发送数据的同步 strcpy(data_s.buff_s, buff_temp); pthread_mutex_unlock(&mutex_s); pthread_mutex_lock(&mutex_dpipe); pthread_cond_wait(&cond_dpipe, &mutex_dpipe); //在管道信息分析线程中,条件变量沉睡线程 pthread_mutex_unlock(&mutex_dpipe); pthread_mutex_lock(&mutex_dpipe); pthread_cond_signal(&cond_dpipe); //接收线程中当条件成立时唤醒管道信息处理线程 pthread_mutex_unlock(&mutex_dpipe);

29

至于linux和windows的通讯则需注意,通过Socket发送信息,windows接收的结束符是\\n\\t 而linux的是\\n 因此,在发送数据中,一定要在结尾加上\\n\\t 否则VB编的的上位机会一直找不到结束符而一直处于信息接收状态,直到缓冲区被刷爆。在进行中文传输时,由于windows和linux采用的编码方式不同,windows采用的是GB2313编码,而linux采用的是UTF-8编码,因此在传输和接收时都要进行编码转化。Linux的编码转换库可以在网上下载最新的编码库libiconv。libiconv库为需要做转换的应用提供了一个iconv()的函数,以实现一个字符编码到另一个字符编码的转换。由于libconv库时要在我们的开发板实验平台上使用的,因此要用4.3.3交叉编译器对libiconv库进行编译。之后还要把编译好的库移到嵌入式文件系统的lib中,同时要修改linux的环境,在/etc/profile 添加libicov的绝对地址。本文对libiconv库的使用在myiconv.c文件中给出。

int code_convert(char *from_charset, char *to_charset, char *inbuf, int inlen, char *outbuf, int outlen) { iconv_t cd; char **pin = &inbuf; char **pout =& outbuf; cd = iconv_open(to_charset, from_charset); if (cd == (iconv_t)-1) { perror(\ return -1;} memset(outbuf, 0, outlen); int rc = iconv(cd, pin, (size_t *) &inlen, pout, (size_t *) &outlen); if (rc == (size_t)-1) { perror(\ return -1;} iconv_close(cd); return outlen; } //UNICODE码转为gb18030码 int u2g(char *inbuf, int inlen, char *outbuf, int outlen) { int size=0; size=code_convert((char *) \ if(size==-1)printf(\ return size; } //gb18030码转为UNICODE码 int g2u(char *inbuf, int inlen, char *outbuf, int outlen) { int size=0; size=code_convert((char *) \ if(size==-1)printf(\ return size; } 4.3 linux下编程实现mplayer播放器

MPlayer是一款开源的多媒体播放器,以GNU通用公共许可证发布。此款软件可在各主流作业系统使用,例如Linux和其他类Unix作业系统、微软的视窗系统及苹果电脑的Mac OS X系统。MPlayer是建基于命令行界面,在各作业系统可选择安装不同的图形界面。

30

因为linux下都是命令行的操作方式,所以对mplayer的各种操作都是用命令来实现的,这次主要用的是它的slave工作方式,来是实现编程。要进入mplayer的slave模式只需在执行mplayer的条件中加入-slave即可,例mplayer -slave -quiet 。在slave模式下,MPlayer为后台运行其他程序,不再截获键盘事件,MPlayer会从标准输入读一个换行符(/n)分隔开的命令。Slave模式下的命令及其功能有:

oadfile string //参数string 为 歌曲名字。 volume 100 1 //设置音量 中间的为音量的大小。 mute 1/0 //静音开关 pause //暂停/取消暂停

get_time_length //返回值是播放文件的长度,以秒为单位。 seek value //向前查找到文件的位置播放 参数value为秒数。 get_percent_pos //返回文件的百分比(0--100)

get_time_pos //打印出在文件的当前位置用秒表示,采用浮点数 volume [abs] //增大/减小音量,或将其设置为 get_file_name //打印出当前文件名

get_meta_album //打印出当前文件的'专辑'的元数据 get_meta_artist //打印出当前文件的'艺术家'的元数据 get_meta_comment //打印出当前文件的'评论'的元数据 get_meta_genre //打印出当前文件的'流派'的元数据 get_meta_title //打印出当前文件的'标题'的元数据 get_meta_year //打印出当前文件的'年份'的元数据

本设计是用execlp系统函数来调用执行mplayer,基于execlp的使用,他会创建新的进程来代替原进程执行execlp所调用的程序,当程序运行完后会退出当前进程。由于本文设计中需要执行其他各种任务,如不停的监听上位发来的信息,以及发送信息,因此,在调用execlp函数使,我们会新建好一个子进程,这样即使mplayer运行完毕,退出也不会把整个程序退出了。在子进程中execlp的调用如下:

execlp(\ \参数:\用的mad解码器

\运行在slave模式下,在关于slave模式,MPlayer为后台运行,不再截获键盘事件,MPlayer 从标准输入读取以新行 (/n) 分隔开的命令行

\使得控制台消息少输出冗余信息;

\通过命名管道获取命令。 “/qiuchen/songdir/1.mp3” 是歌曲的路径字符串的首地址

本设计是在父进程中建立有名管道(fifo),通过往管道中写入上述的slave模式下

31

的命令来控制子进程中的mplayer。

unlink(FIFO);//如果管道存在,先删除 if(mkfifo(\T|0x744)==-1)//创建有名管道 { perror(\ exit(1);} #mplayer -slave -input file= //用户可以通过往管道里写入slave命令来实现对应的功能 void send_cmd(char *cmd) //往管道中发送名来来控制mplayer { int fd; if ((fd = open(\ perror(\ exit(1);} fflush(stdout); if ((write(fd, cmd, strlen(cmd))) != strlen(cmd)) perror(\

同时在建立无名管道来接收mplayer的输出信息。按理mplayer的输出信息应该输出到标准输出上的,我们调试的标准输出是串口终端。因此在创建完无名管道后,我们还要重定向mplayer的输出到无名管道上。其中无名管道的创建和重定向输出做法如下: if (pipe(fd_pipe) != 0) { //创建无名管道,用于读取mplayer的输出 fprintf(stderr, \ return 0;} Dup2(fd_pipe[pipe_write], 1); //重定向标准输出到无名管道上

在父进程中主要是创建接收和发送线程来和上位机通讯,同时还建立了两个线程用来从管道中读取和分析mplayer的返回的信息。本来这两个任务可以放到同个线程中执

if (pthread_create(&tid3, NULL, pipe_read_pthread, NULL))//创建读无名管道的线程 perror(\if (pthread_create(&tid4, NULL, song_msg_dispose_pthread, NULL))//创建分析歌曲信息的线程 perror(\行的,可是用起来不怎么好用。所以只能建立两个线程。

这两个线程都在条件变量的控制下执行。

至此一个简单的通过上位控制的mplayer播放器完成。上位机可以控制mplayer播放和暂停,读取歌曲或视频的各种信息。本设计还有一个任务是读取歌曲的目录,以便可以在上位机上选择要播放的视频会音频。本设计通过opendir()函数获取文件夹的句柄,还记得在linux中一切皆是文件的说法吗?文件夹在linux中也是文件,在获取文件夹的句柄后,就可以像操作文件的方式一样读取文件夹的内容readdir(fd)。把读到的内容进过处理就可以放到发送线程中发送给上位机了。

fd = opendir(tudir); if (!fd) { perror(\while ((tu_list = readdir(fd)) != NULL) { if (strcmp(tu_list->d_name, \ continue;; strcat(buf2_tmp, buf1_tmp);}

32

if (closedir(fd) == -1) perror(\

4.4 静态图片和电子表格的显示

本文在设计之初,也想移植一个类似mplayer一样的有编程接口的图片查看器。在linux中有很多很好的图片观察器,如pho 只需在终端上执行./pho 便可以显示你要显示的图片。同时linux上的EXCEL有很多,如宏中的openoffice软件可以打开excel表格。但是基于这些软件的可移植性和移植难度,我们还是选择直接操作linux上的显示接口来显示图片和电子表格。通过ioctl()系统函数来控制系统中的LCD设备文件,在对LCD直接操作,其中的一些操作和显示函数lcd.c中给出: struct lcd_info_t *lcd_init(const char *lcd_device); //LCD设备初始化 void show16bpp(struct lcd_info_t *lcdinfo, int xp, int yp, int w, int h, u16 *video);//显示图片 void lcd_put_ascii(struct lcd_info_t *lcdinfo, int xp, int yp, const unsigned char ch, u16 color, u16 bgc, u8 bg); //显示字符 void lcd_put_hz(struct lcd_info_t *lcdinfo, int xp, int yp, u16 al, u16 color, u16 bgc, u8 bg);//显示汉字 上位机即通过发送图片和电子表格的内容到linux系统中,而我们设计的linux播放器则负责显示的部分即可了。

4.5上位机的制作

在现代嵌入式LCD播放器的设计中,网络功能正在不断地完善。通过网络功能可以提供视频的下载和上传等功能。由于本身设计的LCD播放器可以通过上位机进行远程控制,为小型的机顶盒的设计提供研究的意义和最初方案。结合第四章我们的设计方案,所编写的上位机提供了播放器必要的控制,以及对电子表格的读取.

图4-2 基于VB2008编写的上位机

33

4.5.1基于vb2008Socket的建立[9][10]

能够通讯是编写上位机的前提,上位机可以通过串口或者Socket以下位机连接,以达到信息传输的目的。本设计是基于Socket建立的连接的。嵌入式linux系统建立了Socket的服务端,则上位机只需要对IP地址和网络端口进行监听就可以建立链接了。本小结将会对上位socket部分的编写进行介绍。

VB2008是在VB6.0以及VB.NET版本之后的升级,其具有VB.NET强大的网络功能。在VB2008中创建一个基于TCP/IP的Socket,需用到TCPListenter类和TCPClient类。它们都位于Sytem.NET.Sockets命名空间中。通过文件流的方式,对监听嵌入式linux服务端地址的文件流进行读写,以达到相互通讯的目的。下面列出主要部分的程序。

Imports System.IO Imports System.Net Imports System.Net.Sockets Imports System.Text Imports Microsoft.Office.Interop.Excel Public Class Form1 Dim tcpClient As TcpClient Dim netStream As NetworkStream Dim rdStream As StreamReader Dim wtStream As StreamWriter Private mulu_temp As String Dim flag As Integer = 0 Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click Try 'Dim IP As IPAddress = IPAddress.Parse(\ tcpClient = New TcpClient(IPadrBox1.Text, 8080) netStream = tcpClient.GetStream() rdStream = New StreamReader(netStream) wtStream = New StreamWriter(netStream) MessageBox.Show(\连接服务器\ flag = 1 Catch ex As Exception MessageBox.Show(\无法连接服务器\ flag = 0 End Try End Sub 4.5.2 VB2008对EXCEL的操作。

本嵌入式系统的一个任务是能显示电子表格,由于在嵌入式linux系统中直接对电子表格的操作有一定的难度,而在windows中操作则会容易些。因此本设计对电子表格操作的思想是在上位机上操作,而linux系统只是执行显示部分的程序。由于VB2008和Microsoft Excel 2010同属于微软公司的产品,因此他们本身就有很好的接口。本设计正是利用了VB2008对Excel宏的操作,来提取或更改电子表格的内容,最后送到Linux系统上处理和显示。

34

VB2008对Microsoft Excel 2010的简单操作有

(1)添加引用--com---microsoft excel 11.0 object library; (2)声明命名空间Imports Microsoft.Office.Interop.Excel; (3)在需要访问excel的过程中定义操作量

dim exapp as excel.application '定义excel应用程序 dim exbook as excel.workbook ‘定义工作簿 dim exsheet as excel.worksheet ‘定义工作表 dim exrange as excel.range '定义工作区域 (4)基本操作

exapp.visible=true '显示excel 程序

exbook=exapp.workbooks.add '添加新工作簿 或 exbook=exapp.workbooks.open (\薄名\ / 打开已在工作薄 exsheet=exbook.sheets(n) '获得第n个工作表的控制句柄

exsheet.cells(row,col)=值 '对指定单元格赋值,取单元格的内容也是如此操作

第五章 总结与展望

5.1 本文主要完成的工作及结论

(1) 通过对嵌入式系统的概念、发展特点,现在的市场现状的了解,以及对嵌入式各种处理器和嵌入式系统的各种操作系统的分析对比,得出“ARM9+LINUX”在嵌入式系统应用开发中具有很大的发展优势。

(2) 通过对基于S3C2440芯片的linux嵌入式系统的学习,了解了嵌入式系统构造和整个开发流程,其中包括软硬件平台的实现、交叉环境的构建、bootloader的移植、系统内核的移植、文件系统的移植、qtopia2.2.0图像化界面的移植、以及应用程序的开发方法等;

(3) 在了解Mplayer的基础上,通过修改和调试,实现播放器Mplayer到开发板的移植,并基于此基础上,对Mplayer进行编程和应用,完成了基于嵌入式系统LCD播放器的设计和实现,并能够通过上位机控制播放器播放音视频,图片和电子表格;

(4) 了解了VB2008的编程过程。并能编写上位机,与嵌入式Linux建立连接,实现控制和信息传输。同时还了解了VB2008对Excl宏的操作。

(5) 最后,在熟悉ARM平台和Linux的基础之上对系统进行了测试及验证。

35

百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库基于嵌入式系统LCD播放器的设计在线全文阅读。

基于嵌入式系统LCD播放器的设计.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.70edu.com/wenku/194476.html(转载请注明文章来源)
Copyright © 2020-2025 70教育网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:370150219 邮箱:370150219@qq.com
苏ICP备16052595号-17
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:7 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219