嵌入式系统课程设计__多线程实现环形缓冲区数据的输入输出控制

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

物理与电子工程学院

《嵌入式系统与应用》课程设计报告

题目多线程实现环形缓冲区数据的输入输出控制

系别物理与电子工程学院

年级专业

班级学号

学生姓名

指导教师职称

设计时间2015.6.4 ~2015.6.28

目录

第一章绪论 (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 系统设计 (4)

2.2.1 功能框图 (4)

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机Pentium 500 以上, 硬盘10G 以上。

软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX + xshell开发环境

2.2 系统设计

2.2.1 功能框图

图2.2.1 系统功能框图

2.2.2 模块的功能

本次课题中共有三大功能模块:串口数据发送模块、缓冲区数据填充模块、读取缓冲区数据模块。

基本程序框架:

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

{

int buffer[BUFFER_SIZE]; /* 缓冲区数组*/

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 empty\n");

}

}

/*初始化缓冲区*/

void init(struct prodcons * b)

{

pthread_mutex_init(&b->lock, NULL);

pthread_cond_init(&b->notempty, NULL);

pthread_cond_init(&b->notfull, NULL);

b->readpos = 0;

b->writepos = 0;

}

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

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

void put(struct prodcons * b, int data)

{

pthread_mutex_lock(&b->lock);

/*等待缓冲区非满*/

while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) { printf("wait for not full\n");

pthread_cond_wait(&b->notfull, &b->lock);

}

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

b->buffer[b->writepos] = data;

b->writepos++;

相关文档
最新文档