1、2.2.2 模块的功能 42.3 技术实现 102.3.1 模块的实现 102.3.2 问题的解决 112.4 总结 15参考文献 15第一章 绪 论1.1 课题目的和重点问题1.1.1 目的和意义通过使用Linux环境下的C语言编程,完成环形缓冲区数据的输入输出控制。来加深对Linux多线程编程实现的认识和操作。1.1.2 重点解决的问题在解决环形缓冲区数据的输入输出控制的实验中,一是要解决实现多线程的同步工作问题,二是如何使用串口发送数据。1.1.3 系统实现的具体功能利用ARM9的开发平台在Linux操作系统中,程序设计一个环形缓冲区,A线程不断填充缓冲区 数据(按串口收到的初始值开始,
2、每次减一填入;串口发来的初始化数据更改能及时更新缓冲区),B线程每隔1ms从缓冲区读出数据(若此时缓冲区空,则打印一个警告信息),缓冲区每读到一个特定数据则控制Led灯点亮一次(3个灯不同的特定数据控制),点亮灯由C线程控制,串口的输入响应由D线程实现。当串口输入一个非数字则整个程序退出。第二章 正 文2.1 功能需求分析2.1.1 功能需求分析在这个课题中,需要创建一个环形缓冲区,往这个环形缓冲区中填写和读取数据。多线程的编程对于Linux系统开发是必须了解和掌握的。因为在实现这个课程目标时,需要几个功能模块同步协调完成。发送数据和读取数据线程要协调进行,不能发生冲突,同时还需要从串口发送数
3、据进程不断获取刷新数据,所以在进行多线程编程时要做好进程的协调。2.1.2 功能实现环境分析硬件:up-Star认证考试实践板、PC机Pentium 500 以上, 硬盘10G 以上。软件:PC机操作系统REDHAT LINUX 9.0MINICOMARM-LINUX + xshell开发环境 2.2 系统设计2.2.1 功能框图图2.2.1 系统功能框图2.2.2 模块的功能 本次课题中共有三大功能模块:串口数据发送模块、缓冲区数据填充模块、读取缓冲区数据模块。基本程序框架:struct prodcons /* 设置一个整数的圆形缓冲区 */ int bufferBUFFER_SIZE; /
4、* 缓冲区数组 */ pthread_mutex_t lock; /* 互斥锁 */ int readpos, writepos; /* 读写的位置*/ pthread_cond_t notempty; /* 缓冲区非空信号 */ pthread_cond_t notfull; /*缓冲区非满信号 */;/*-*/void warn(struct prodcons * b) if(b-writepos != b-readpos) printf(warning : the buffer is emptyn); /*初始化缓冲区*/void init(struct prodcons * b) pt
5、hread_mutex_init(&b-lock, NULL); pthread_cond_init(¬empty, NULL);notfull, NULL); b-readpos = 0;writepos = 0;/* 向缓冲区中写入一个整数*/void put(struct prodcons * b, int data) pthread_mutex_lock(&lock); /*等待缓冲区非满*/ while (b-writepos + 1) % BUFFER_SIZE = b-readpos) wait for not fulln pthread_cond_wait(¬ful
6、l, & /*写数据并且指针前移*/ b-bufferb-writepos = data;writepos+; if (b-writepos = BUFFER_SIZE) b- /*设置缓冲区非空信号*/ pthread_cond_signal(¬empty); pthread_mutex_unlock(&/*从缓冲区中读出一个整数 */int get(struct prodcons * b) int data; /* 等待缓冲区非空*/ while (b-writepos = b-wait for not emptynnotempty, & /* 读数据并且指针前移 */ data =
7、 b-readpos;readpos+;readpos /* 设置缓冲区非满信号*/notfull); pthread_mutex_unlock(& return data;void led(int on_off,int led_number) /led控制函数 int fd; fd = open(/dev/led, 0); if (fd=65&d 0; n-) if(STOP=TRUE) break; if(s!=d) n=s; d=s;put-,n); put(&buffer,n); if(n-1)=0) n=s+1; usleep(100000); put(&buffer, OVER);
8、 printf(Pthread_A stopped!nvoid * consumer(/*struct prodcons * b, */void * data) /读取缓冲区数据线程 int d; while (STOP=FALSE) d = get(&buffer); leds(d); /调用led函数对特定数值进行判断 if (d = OVER ) break; %d-getn, d);consumer stopped!int main() /主函数 struct 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,&sa,NULL); pthread_create(&th_a, NULL, producer, 0);th_b, NULL, consumer, 0);th_c, NULL, send, 0); pthread_create(&th_d, NULL, keyboard, 0); pthread_join(th_a, &retval); pthread_join(th_b, & pthread_join(th_c, &
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1