环形缓冲区代码设计_第1页
环形缓冲区代码设计_第2页
环形缓冲区代码设计_第3页
环形缓冲区代码设计_第4页
环形缓冲区代码设计_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、环形缓冲区设计文档编制XXX审核批准目录1 任务概述31.1 任务描述31.2 功能需求31.3 开发环境及工具32 总体设计32.1 基本设计概念和处理流程32.2 循环缓冲区数据变化过程及读写指针变化过程42.3 系统流程图63 数据结构设计74 接口设计85 测试用例106 修订记录101 任务概述1.1 任务描述环形缓冲区设计。环形缓冲区是嵌入式系统中一种常见的重要的数据结构。主要用于生产者消费者环境。生产者往缓冲区中生产数据,消费者从缓冲区中消费数据。本设计缓冲区有一个读指针和 一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的数据。通过移动读指针和写指针实现

2、缓冲区的数据读取和写入。1.2 功能需求环形缓冲区的读用户(消费者)仅仅影响读指针,写用户(生产者)仅仅会影响写指针。当仅仅有一个读用户和一个写用户,那么不需要互斥保护机制就可保证数据的正确性。但当有多个读写用户是,需要有相应的互斥保护机制来确保缓冲区的互斥访问及数据的安全性。1.3 开发环境及工具编辑工具:Source Insight编译及运行系统环境:linux操作系统2 总体设计2.1 基本设计概念和处理流程本设计主要是通过读写指针的移动来实现缓冲区的环形化。环形缓冲区与传统缓冲区相比缓冲区的利用率更高。缓冲区的大小是手动输入的,即大小可变。缓冲区的读写位置是通过基地址加偏移量来计算的,

3、偏移量即为读写指针的值。互斥访问存在于多个读用户或者多个写用户之间;读写线程之间本应该是不存在互斥关系的,但因为读写数据的大小是手动输入的,所以本设计在读写线程之间设计了一个终端访问互斥量。对于写缓冲区用户线程来说,线程的正常结束有两种可能,一种是源文件读到末尾;另一种是等待超时;但正常情况下一般都是第一种情况。读缓冲区用户来说,线程的正常结束只有等待超时,因为此时可能写缓冲线程已经结束,缓冲区长时间处于为空的状态下。等待分写缓冲区线程等待和读缓冲区线程等待。当缓冲区满的时候,写缓冲线程就会阻塞,等待缓冲区可写的条件信号的发生。当缓冲区空的时候,读缓冲线程就会阻塞,等待缓冲区可读的条件信号的发

4、生。写缓冲线程在每写一次数据到缓冲区之后,都会发送一次缓冲区可读的条件信号,读缓冲线程在每从缓冲区读一次数据之后,都会发送一次缓冲区可写的条件信号。主程序将会在所有子线程结束之后,才会结束。 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写

5、0 读6 后: dataLen = 2写0 读2 后: dataLen = 0 (该状态判定为buf空,即 dataLen = 0 时)2.3 系统流程图3 数据结构设计typedef void* HANDLE;int END_OF_FILE = 0; / 源文件结束标志pthread_mutex_t write_mutex; / 写缓冲区用户互斥量pthread_mutex_t read_mutex; / 读缓冲区用户互斥量pthread_cond_t write_cond; / 写缓冲区用户条件变量pthread_cond_t read_cond; / 读缓冲区用户条件变量说明:END_O

6、F_FILE 是源文件的文件结束标志,当写缓冲区用户读到源文件末尾的时候,则将END_OF_FILE 置为1,表示源文件已经读完,其将作为读写用户线程结束的判断信息。write_mutex 是多个写缓冲区用户间的写互斥量。read_mutex 是多个读缓冲区用户间的读互斥量。write_cond 是写缓冲区用户条件变量,当缓冲区满的时候,则写缓冲区用户解锁阻塞等待条件write_cond 的发生,该条件由读缓冲区用户发送。read_cond 是读缓冲区用户条件变量,当缓冲区空的时候,则读缓冲区用户解锁阻塞等待条件read_cond的发生,该条件是由写缓冲区用户发送的。/*环形缓冲区数据结构*/

7、typedef structunsigned char *bufBase; / 环形缓冲区地址int bufLen; / 环形缓冲区大小int writeldx; / 环形缓冲区写指针int readldx; / 环形缓冲区读指针int dataLen; / 环形缓冲区内容长度#ifdef OS_LINUXpthread_mutex_t mutex; / 读写用户终端互斥量#elif OS_WINDOWS CRITICAL_SECTION g_cs; / 环形缓冲区关键代码段#endif RING_BUFFER;#define OK 0#define ERROR -1#define SOURC

8、EFILE "/mnt/hgfs/ubuntu_share/Yan2Task/sourcefile.txt" /源文件路径#define NEWFILE "/mnt/hgfs/ubuntu_share/Yan2Task/newfile.txt" /目的文件路径4 接口设计/* Function: ringbuf_init ( )* Description: 循环缓冲区初始化函数* Access Level: public* Input: bufSize - - - 循环缓冲区大小* Output: N/A* Return: 循环缓冲区句柄 - - - 成

9、功/NULL - - - 失败*/HANDLE ringbuf_init ( int bufSize ) ;/* Function: ringbuf_write ( ) * Description: 循环缓冲区写入数据函数* Input: hRingBuf - - - 循环缓冲区句柄 pSrcBuf - - - 待写入数据源地址 len - - - 待写入数据长度* Output: N/A* Return: 实际写入数据的长度 - - - 成功/ -1 - - - 失败*/int ringbuf_write ( HANDLE hRingBuf , unsigned char* pSrcBuf

10、, int len ) ;/* Function: ringbuf_read ( ) * Description: 循环缓冲区读取数据函数* Input: hRingBuf - - - 循环缓冲区句柄 pDstBuf - - - 读取数据的目的地地址 len - - - 待读取数据长度* Output: N/A* Return: 实际读取数据的长度 - - - 成功/ -1 - - - 失败*/int ringbuf_read ( HANDLE hRingBuf , unsigned char* pDstBuf , int len ) ;/* Function: ringbuf_datelen

11、 ( )* Description: 获取循环缓冲区有效数据长度* Input: hRingBuf - - - 循环缓冲区句柄* Output: N/A* Return: 循环缓冲区有效数据的长度- - -成功/ -1 - - -失败*/int ringbuf_datelen ( HANDLE hRingBuf ) ;/* Function: ringbuf_destroy ( )* Description: 循环缓冲区销毁函数* Input: hRingBuf - - - 循环缓冲区句柄* Output: N/A* Return: OK/ERROR*/int ringbuf_destroy

12、( HANDLE hRingBuf ) ;/* Function: thread_ringbuf_write ( )* Description: 写入数据线程调用函数* Input: pSourceFile - - -源文件路径句柄* Return: OK/ERROR*/void * thread_ringbuf_write ( void * pSourceFile ) ;/* Function: thread_ringbuf_read ( )* Description: 读取数据线程调用函数* Input: pNewFile - - -目的文件路径句柄* Return: OK/ERROR*/void * thread_ringbuf_read ( void * pNewFile ) ;5 测试用例按要求测试为:一个线程写入一个固定文件内容、一个线程读取数据并写入到另一个文件。测试:源文件路径:"/mnt/hgfs/ubuntu_share/Yan2Task/sourcefile.txt"目的文件路径:"/mnt/hgfs/ubuntu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论