ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:51.18KB ,
资源ID:15360266      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/15360266.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式系统课程设计多线程实现环形缓冲区数据的输入输出控制Word文档下载推荐.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式系统课程设计多线程实现环形缓冲区数据的输入输出控制Word文档下载推荐.docx

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