《嵌入式系统课程设计__多线程实现环形缓冲区数据的输入输出控制》由会员分享,可在线阅读,更多相关《嵌入式系统课程设计__多线程实现环形缓冲区数据的输入输出控制(17页珍藏版)》请在金锄头文库上搜索。
1、 物理与电子工程学院物理与电子工程学院嵌嵌入入式式系系统统与与应应用用 课课程程设设计计报报告告题目 多线程实现环形缓冲区数据的输入输出控制 系 别 物理与电子工程学院 年 级 专 业 班 级 学 号 学生姓名 指导教师 职 称 设计时间 2015.6.4 2015.6.28 常熟理工学院课程设计报告1目录 第一章 绪 论 .2 1.1 课题目的和重点问题 .2 1.1.1 目的和意义 .2 1.1.2 重点解决的问题 .2 1.1.3 系统实现的具体功能 .2 第二章 正 文 .3 2.1 功能需求分析 .3 2.1.1 功能需求分析 .3 2.1.2 功能实现环境分析 .3 2.2 系统设
2、计 .4 2.2.1 功能框图 .4 2.2.2 模块的功能 .4 2.3 技术实现 .10 2.3.1 模块的实现 .10 2.3.2 问题的解决 .11 2.4 总结 .15 参考文献 .15常熟理工学院课程设计报告2第一章第一章 绪绪 论论1.11.1 课题目的和重点问题课题目的和重点问题1.1.11.1.1 目的和意义目的和意义通过使用 Linux 环境下的 C 语言编程,完成环形缓冲区数据的输入输出控制。来加深对 Linux 多线程编程实现的认识和操作。1.1.21.1.2 重点解决的问题重点解决的问题在解决环形缓冲区数据的输入输出控制的实验中,一是要解决实现多线程的同步工作问题,二
3、是如何使用串口发送数据。1.1.31.1.3 系统实现的具体功能系统实现的具体功能利用 ARM9 的开发平台在 Linux 操作系统中,程序设计一个环形缓冲区,A 线程不断填充缓冲区 数据(按串口收到的初始值开始,每次减一填入;串口发来的初始化数据更改能及时更新缓冲区) ,B 线程每隔 1ms 从缓冲区读出数据(若此时缓冲区空,则打印一个警告信息) ,缓冲区每读到一个特定数据则控制 Led 灯点亮一次(3 个灯不同的特定数据控制) ,点亮灯由 C 线程控制,串口的输入响应由 D 线程实现。当串口输入一个非数字则整个程序退出。常熟理工学院课程设计报告3第二章第二章 正正 文文2.12.1 功能需
4、求分析功能需求分析2.1.12.1.1 功能需求分析功能需求分析在这个课题中,需要创建一个环形缓冲区,往这个环形缓冲区中填写和读取数据。多线程的编程对于 Linux 系统开发是必须了解和掌握的。因为在实现这个课程目标时,需要几个功能模块同步协调完成。发送数据和读取数据线程要协调进行,不能发生冲突,同时还需要从串口发送数据进程不断获取刷新数据,所以在进行多线程编程时要做好进程的协调。2.1.22.1.2 功能实现环境分析功能实现环境分析硬件:up-Star认证考试实践板、PC机Pentium 500 以上, 硬盘10G 以上。 软件:PC机操作系统REDHAT LINUX 9.0MINICOMA
5、RM-LINUX + xshell开发环境 常熟理工学院课程设计报告42.22.2 系统设计系统设计2.2.12.2.1 功能框图功能框图 l ed 图 2.2.1 系统功能框图2.2.22.2.2 模块的功能模块的功能本次课题中共有三大功能模块:串口数据发送模块、缓冲区数据填充模块、读取缓冲区数据模块。基本程序框架:struct prodcons /* 设置一个整数的圆形缓冲区 */int bufferBUFFER_SIZE; /* 缓冲区数组 */pthread_mutex_t lock; /* 互斥锁 */int readpos, writepos; /* 读写的位置*/pthread_
6、cond_t notempty; /* 缓冲区非空信号 */常熟理工学院课程设计报告5pthread_cond_t notfull; /*缓冲区非满信号 */;/*-*/void warn(struct prodcons * b)if(b-writepos != b-readpos)printf(“warning : the buffer is emptyn“);/*初始化缓冲区*/void init(struct prodcons * b)pthread_mutex_init(pthread_cond_init(pthread_cond_init(b-readpos = 0;b-writep
7、os = 0;/*-*/* 向缓冲区中写入一个整数*/void put(struct prodcons * b, int data)pthread_mutex_lock(/*等待缓冲区非满*/while (b-writepos + 1) % BUFFER_SIZE = b-readpos) printf(“wait for not fulln“);pthread_cond_wait(/*写数据并且指针前移*/常熟理工学院课程设计报告6b-bufferb-writepos = data;b-writepos+;if (b-writepos = BUFFER_SIZE) b-writepos =
8、0;/*设置缓冲区非空信号*/pthread_cond_signal(pthread_mutex_unlock(/*-*/*从缓冲区中读出一个整数 */int get(struct prodcons * b)int data;pthread_mutex_lock(/* 等待缓冲区非空*/while (b-writepos = b-readpos) printf(“wait for not emptyn“);pthread_cond_wait(/* 读数据并且指针前移 */data = b-bufferb-readpos;b-readpos+;if (b-readpos = BUFFER_SIZ
9、E) b-readpos = 0;/* 设置缓冲区非满信号*/pthread_cond_signal(pthread_mutex_unlock(return data;void led(int on_off,int led_number) /led控制函数int fd;常熟理工学院课程设计报告7fd = open(“/dev/led“, 0);if (fd=65 n-) if(STOP=TRUE) break; if(s!=d) n=s; d=s; printf(“put%dn“,n); put( if(n-1)=0) n=s+1; usleep(100000); put( printf(“P
10、thread_A stopped!n“); return NULL; void * consumer(/*struct prodcons * b, */void * data) /读取缓冲区数据线程while(s=0);常熟理工学院课程设计报告9int d;while (STOP=FALSE) d = get(leds(d);/调用led函数对特定数值进行判断if (d = OVER ) break;printf(“ %dgetn“, d);usleep(100000);printf(“consumer stopped!n“);return NULL;int main()/主函数struct
11、sigaction sa; int ok;pthread_t th_a, th_b, th_c, th_d;void * retval;init(sa.sa_handler = child_handler;sa.sa_flags = 0;sigaction(SIGCHLD, pthread_create(pthread_create(pthread_create(pthread_create(pthread_join(th_a, pthread_join(th_b, pthread_join(th_c, pthread_join(th_d, return 0;常熟理工学院课程设计报告102.3
12、2.3 技术实现技术实现2.3.12.3.1 模块的实现模块的实现在这个课题中我所需要负责的模块,是串口数据处理模块,包括串口数据的发送以及串口响应,通过串口发送一个数值作为填写环形缓冲区的初始值,以及对于发送数据的合法性进行判断。实现功能线程:void* keyboard(void * data) /键盘输入线程 int d=0,i=0,m=0,n=0,t=0,p=0,b=0; for (;) /*读取串口发送数据*/ d=getchar(); printf(“b is :%dn“,d);if( (d= ENDMINITERM1) | (d=ENDMINITERM2) |(d=65break
13、 ; else /*读取向串口发送初值*/ p=d-0; m=getchar(); p=p*10+m-0; n=getchar(); p=p*10+n-0; s=p;/*将发送的值赋给全局变量s*/ t=getchar(); printf(“t is %dn“,t); printf(“s is %dn“,s); return NULL; 通过调试证明此次修改的程序可以达到期望功能。常熟理工学院课程设计报告152.42.4 总结总结本次课程设计的内容是对前面所学的 Linux 系统开发知识的整合,比如在这次课程设计中就运用了串口实验的多线程编程的程序,以及 LED 开关程序及 LED 驱动的加载
14、。这些程序的应用,考验的是对多线程编程中对各线程功能协调的能力 这次任务最大的问题是关于串口数据的发送,之前进行的几次实现方案都无法实现函数功能,曾一度陷入死角,无法取得突破,后来多次尝试其他的方法,终于找到了解决的办法,所以对一时无法解决的问题要变换方法,当使用一种方法经多次调试无法使实现功能时应改变思路。多线程的编程是对团队合作非常好的检验。因为每个线程实现的功能都是独立的,但是所有线程功能又是同步进行的,那么这就需要每个人员,在做自己的任务时也要协调其他人的任务。当然在完成自己的任务的时候,会遇到一些困难自己无法解决,这个时候,团员之间的协作就变得很重要。不要因为自己的任务完成而不管团队的成果,团员之间应该积极地