预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

PAGE\*MERGEFORMAT10 环形缓冲区设计文档 编制XXX审核批准 目录 TOC\o"1-3"\h\z\uHYPERLINK\l"_Toc301363866"1.任务概述 PAGEREF_Toc301363866\h3 HYPERLINK\l"_Toc301363867"1.1任务描述 PAGEREF_Toc301363867\h3 HYPERLINK\l"_Toc301363868"1.2功能需求 PAGEREF_Toc301363868\h3 HYPERLINK\l"_Toc301363869"1.3开发环境及工具 PAGEREF_Toc301363869\h3 HYPERLINK\l"_Toc301363870"2.总体设计 PAGEREF_Toc301363870\h3 HYPERLINK\l"_Toc301363871"2.1基本设计概念和处理流程 PAGEREF_Toc301363871\h3 HYPERLINK\l"_Toc301363872"2.2循环缓冲区数据变化过程及读写指针变化过程 PAGEREF_Toc301363872\h4 HYPERLINK\l"_Toc301363873"2.3系统流程图 PAGEREF_Toc301363873\h6 HYPERLINK\l"_Toc301363874"3.数据结构设计 PAGEREF_Toc301363874\h7 HYPERLINK\l"_Toc301363875"4.接口设计 PAGEREF_Toc301363875\h8 HYPERLINK\l"_Toc301363876"5.测试用例 PAGEREF_Toc301363876\h10 HYPERLINK\l"_Toc301363877"6.修订记录 PAGEREF_Toc301363877\h10  任务概述 1.1任务描述 环形缓冲区设计。环形缓冲区是嵌入式系统中一种常见的重要的数据结构。主要用于生产者——消费者环境。生产者往缓冲区中生产数据,消费者从缓冲区中消费数据。 本设计缓冲区有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的数据。通过移动读指针和写指针实现缓冲区的数据读取和写入。 1.2功能需求 环形缓冲区的读用户(消费者)仅仅影响读指针,写用户(生产者)仅仅会影响写指针。 当仅仅有一个读用户和一个写用户,那么不需要互斥保护机制就可保证数据的正确性。但当有多个读写用户是,需要有相应的互斥保护机制来确保缓冲区的互斥访问及数据的安全性。 1.3开发环境及工具 编辑工具:SourceInsight 编译及运行系统环境:linux操作系统 总体设计 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(该状态