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

上传人:b****1 文档编号:15360266 上传时间:2022-10-29 格式:DOCX 页数:16 大小:51.18KB
下载 相关 举报
嵌入式系统课程设计多线程实现环形缓冲区数据的输入输出控制Word文档下载推荐.docx_第1页
第1页 / 共16页
嵌入式系统课程设计多线程实现环形缓冲区数据的输入输出控制Word文档下载推荐.docx_第2页
第2页 / 共16页
嵌入式系统课程设计多线程实现环形缓冲区数据的输入输出控制Word文档下载推荐.docx_第3页
第3页 / 共16页
嵌入式系统课程设计多线程实现环形缓冲区数据的输入输出控制Word文档下载推荐.docx_第4页
第4页 / 共16页
嵌入式系统课程设计多线程实现环形缓冲区数据的输入输出控制Word文档下载推荐.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

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

《嵌入式系统课程设计多线程实现环形缓冲区数据的输入输出控制Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《嵌入式系统课程设计多线程实现环形缓冲区数据的输入输出控制Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。

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

2.2.2模块的功能4

2.3技术实现10

2.3.1模块的实现10

2.3.2问题的解决11

2.4总结15

参考文献15

第一章绪论

1.1课题目的和重点问题

1.1.1目的和意义

通过使用Linux环境下的C语言编程,完成环形缓冲区数据的输入输出控制。

来加深对Linux多线程编程实现的认识和操作。

1.1.2重点解决的问题

在解决环形缓冲区数据的输入输出控制的实验中,一是要解决实现多线程的同步工作问题,二是如何使用串口发送数据。

1.1.3系统实现的具体功能

利用ARM9的开发平台在Linux操作系统中,程序设计一个环形缓冲区,A线程不断填充缓冲区数据(按串口收到的初始值开始,每次减一填入;

串口发来的初始化数据更改能及时更新缓冲区),B线程每隔1ms从缓冲区读出数据(若此时缓冲区空,则打印一个警告信息),缓冲区每读到一个特定数据则控制Led灯点亮一次(3个灯不同的特定数据控制),点亮灯由C线程控制,串口的输入响应由D线程实现。

当串口输入一个非数字则整个程序退出。

第二章正文

2.1功能需求分析

2.1.1功能需求分析

在这个课题中,需要创建一个环形缓冲区,往这个环形缓冲区中填写和读取数据。

多线程的编程对于Linux系统开发是必须了解和掌握的。

因为在实现这个课程目标时,需要几个功能模块同步协调完成。

发送数据和读取数据线程要协调进行,不能发生冲突,同时还需要从串口发送数据进程不断获取刷新数据,所以在进行多线程编程时要做好进程的协调。

2.1.2功能实现环境分析

硬件:

up-Star认证考试实践板、PC机Pentium500以上,硬盘10G以上。

软件:

PC机操作系统REDHATLINUX9.0+MINICOM+ARM-LINUX+xshell开发环境

2.2系统设计

2.2.1功能框图

图2.2.1系统功能框图

2.2.2模块的功能

本次课题中共有三大功能模块:

串口数据发送模块、缓冲区数据填充模块、读取缓冲区数据模块。

基本程序框架:

structprodcons/*设置一个整数的圆形缓冲区*/

{

intbuffer[BUFFER_SIZE];

/*缓冲区数组*/

pthread_mutex_tlock;

/*互斥锁*/

intreadpos,writepos;

/*读写的位置*/

pthread_cond_tnotempty;

/*缓冲区非空信号*/

pthread_cond_tnotfull;

/*缓冲区非满信号*/

};

/*--------------------------------------------------------*/

voidwarn(structprodcons*b)

if(b->

writepos!

=b->

readpos)

{

printf("

warning:

thebufferisempty\n"

);

}

}

/*初始化缓冲区*/

voidinit(structprodcons*b)

pthread_mutex_init(&

b->

lock,NULL);

pthread_cond_init(&

notempty,NULL);

notfull,NULL);

b->

readpos=0;

writepos=0;

/*向缓冲区中写入一个整数*/

voidput(structprodcons*b,intdata)

pthread_mutex_lock(&

lock);

/*等待缓冲区非满*/

while((b->

writepos+1)%BUFFER_SIZE==b->

readpos){

waitfornotfull\n"

pthread_cond_wait(&

notfull,&

}

/*写数据并且指针前移*/

b->

buffer[b->

writepos]=data;

writepos++;

if(b->

writepos>

=BUFFER_SIZE)b->

/*设置缓冲区非空信号*/

pthread_cond_signal(&

notempty);

pthread_mutex_unlock(&

/*从缓冲区中读出一个整数*/

intget(structprodcons*b)

intdata;

/*等待缓冲区非空*/

while(b->

writepos==b->

waitfornotempty\n"

notempty,&

/*读数据并且指针前移*/

data=b->

readpos];

readpos++;

readpos>

/*设置缓冲区非满信号*/

notfull);

pthread_mutex_unlock(&

returndata;

voidled(inton_off,intled_number)//led控制函数

intfd;

fd=open("

/dev/led"

0);

if(fd<

0)

exit

(1);

ioctl(fd,on_off,led_number);

close(fd);

voidleds(intd)//对读取的特定数值进行判断

if(d==200)

led(0,0);

usleep(200000);

led(1,0);

if(d==400)

led(0,1);

led(1,1);

if(d==600)

led(0,2);

led(1,2);

void*keyboard(void*data)//键盘输入线程

intd=0,i=0,m=0,n=0,t=0,p=0,b=0;

for(;

;

)/*读取串口发送数据*/

d=getchar();

bis:

%d\n"

d);

if((d==ENDMINITERM1)||(d==ENDMINITERM2)||(d>

=65&

&

d<

=122))

{/*如果是非数字或退出则程序结束*/

STOP=TRUE;

break;

}

else/*读取向串口发送初值*/

{

p=d-'

0'

m=getchar();

p=p*10+m-'

n=getchar();

p=p*10+n-'

s=p;

/*将发送的值赋给全局变量s*/

t=getchar();

printf("

tis%d\n"

t);

sis%d\n"

s);

returnNULL;

void*producer(void*data)//向缓冲区填充数据线线程

while(s==0);

intn=s;

intd=s;

n>

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);

printf("

Pthread_Astopped!

\n"

void*consumer(/*structprodcons*b,*/void*data)//读取缓冲区数据线程

intd;

while(STOP==FALSE)

d=get(&

buffer);

leds(d);

//调用led函数对特定数值进行判断

if(d==OVER)break;

%d-->

get\n"

d);

consumerstopped!

intmain()//主函数

{

structsigactionsa;

intok;

pthread_tth_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