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