环形缓冲区代码设计

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

环形缓冲区设计文档

目录

1.任务概述 (3)

1.1 任务描述 (3)

1.2 功能需求 (3)

1.3 开发环境及工具 (3)

2.总体设计 (3)

2.1 基本设计概念和处理流程 (3)

2.2 循环缓冲区数据变化过程及读写指针变化过程 (4)

2.3 系统流程图 (6)

3.数据结构设计 (7)

4.接口设计 (8)

5.测试用例 (10)

6.修订记录 (10)

1.任务概述

1.1 任务描述

环形缓冲区设计。环形缓冲区是嵌入式系统中一种常见的重要的数据结构。主要用于生产者——消费者环境。生产者往缓冲区中生产数据,消费者从缓冲区中消费数据。

本设计缓冲区有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的数据。通过移动读指针和写指针实现缓冲区的数据读取和写入。

1.2 功能需求

环形缓冲区的读用户(消费者)仅仅影响读指针,写用户(生产者)仅仅会影响写指针。

当仅仅有一个读用户和一个写用户,那么不需要互斥保护机制就可保证数据的正确性。但当有多个读写用户是,需要有相应的互斥保护机制来确保缓冲区的互斥访问及数据的安全性。

1.3 开发环境及工具

编辑工具:Source Insight

编译及运行系统环境:linux操作系统

2.总体设计

2.1 基本设计概念和处理流程

本设计主要是通过读写指针的移动来实现缓冲区的环形化。环形缓冲区与传统缓冲区相比缓冲区的利用率更高。

缓冲区的大小是手动输入的,即大小可变。缓冲区的读写位置是通过基地址加偏移量来计算的,偏移量即为读写指针的值。

互斥访问存在于多个读用户或者多个写用户之间;读写线程之间本应该是不存在互斥关系的,但因为读写数据的大小是手动输入的,所以本设计在读写线程之间设计了一个终端访问互斥量。

对于写缓冲区用户线程来说,线程的正常结束有两种可能,一种是源文件读到末尾;另一种是等待超时;但正常情况下一般都是第一种情况。读缓冲区用户来说,线程的正常结束只有等待超时,因为此时可能写缓冲线程已经结束,缓冲区长时间处于为空的状态下。

等待分写缓冲区线程等待和读缓冲区线程等待。当缓冲区满的时候,写缓冲线程就会阻塞,等待缓冲区可写的条件信号的发生。当缓冲区空的时候,读缓冲线程就会阻塞,等待缓冲区可读的条件信号的发生。

写缓冲线程在每写一次数据到缓冲区之后,都会发送一次缓冲区可读的条件信号,读缓冲线程在每从缓冲区读一次数据之后,都会发送一次缓冲区可写的条件信号。

主程序将会在所有子线程结束之后,才会结束。

2.2 循环缓冲区数据变化过程及读写指针变化过程

dataLen = (writeldx – readldx + bufLen) % bufLen;

初始化后: dataLen = 0

写1 读0 后: dataLen = 1

写8 读0 后: dataLen = 9 (该状态判定为buf满,即dataLen = bufLen – 1时)

写0 读3 后: dataLen = 6

写5 读3 后: dataLen = 8

写0 读6 后: dataLen = 2

写0 读2 后: dataLen = 0 (该状态判定为buf空,即dataLen = 0 时)

2.3 系统流程图

3.数据结构设计

bufLen

环形缓冲区示意图

说明:

END_OF_FILE 是源文件的文件结束标志,当写缓冲区用户读到源文件末尾的时候,则将END_OF_FILE 置为1,表示源文件已经读完,其将作为读写用户线程结束的判断信息。

write_mutex 是多个写缓冲区用户间的写互斥量。

read_mutex 是多个读缓冲区用户间的读互斥量。

write_cond 是写缓冲区用户条件变量,当缓冲区满的时候,则写缓冲区用户解锁阻塞等待条件write_cond 的发生,该条件由读缓冲区用户发送。

read_cond 是读缓冲区用户条件变量,当缓冲区空的时候,则读缓冲区用户解锁阻塞等待条件read_cond的发生,该条件是由写缓冲区用户发送的。

4.接口设计

5.测试用例

按要求测试为:一个线程写入一个固定文件内容、一个线程读取数据并写入到另一个文件。测试:

源文件路径:"/mnt/hgfs/ubuntu_share/Yan2Task/sourcefile.txt"

目的文件路径:"/mnt/hgfs/ubuntu_share/Yan2Task/newfile.txt"

6.修订记录

相关文档
最新文档