环形缓冲区代码设计

环形缓冲区代码设计

ID:19233604

大小:281.44 KB

页数:10页

时间:2018-09-30

上传者:U-3682
环形缓冲区代码设计_第1页
环形缓冲区代码设计_第2页
环形缓冲区代码设计_第3页
环形缓冲区代码设计_第4页
环形缓冲区代码设计_第5页
资源描述:

《环形缓冲区代码设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

环形缓冲区设计文档编制XXX审核批准10 目录1.任务概述31.1任务描述31.2功能需求31.3开发环境及工具32.总体设计32.1基本设计概念和处理流程32.2循环缓冲区数据变化过程及读写指针变化过程42.3系统流程图63.数据结构设计74.接口设计85.测试用例106.修订记录1010 1.任务概述1.1任务描述环形缓冲区设计。环形缓冲区是嵌入式系统中一种常见的重要的数据结构。主要用于生产者——消费者环境。生产者往缓冲区中生产数据,消费者从缓冲区中消费数据。本设计缓冲区有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的数据。通过移动读指针和写指针实现缓冲区的数据读取和写入。1.2功能需求环形缓冲区的读用户(消费者)仅仅影响读指针,写用户(生产者)仅仅会影响写指针。当仅仅有一个读用户和一个写用户,那么不需要互斥保护机制就可保证数据的正确性。但当有多个读写用户是,需要有相应的互斥保护机制来确保缓冲区的互斥访问及数据的安全性。1.3开发环境及工具编辑工具:SourceInsight编译及运行系统环境:linux操作系统2.总体设计2.1基本设计概念和处理流程本设计主要是通过读写指针的移动来实现缓冲区的环形化。环形缓冲区与传统缓冲区相比缓冲区的利用率更高。缓冲区的大小是手动输入的,即大小可变。缓冲区的读写位置是通过基地址加偏移量来计算的,偏移量即为读写指针的值。互斥访问存在于多个读用户或者多个写用户之间;读写线程之间本应该是不存在互斥关系的,但因为读写数据的大小是手动输入的,所以本设计在读写线程之间设计了一个终端访问互斥量。对于写缓冲区用户线程来说,线程的正常结束有两种可能,一种是源文件读到末尾;另一种是等待超时;但正常情况下一般都是第一种情况。读缓冲区用户来说,线程的正常结束只有等待超时,因为此时可能写缓冲线程已经结束,缓冲区长时间处于为空的状态下。等待分写缓冲区线程等待和读缓冲区线程等待。当缓冲区满的时候,写缓冲线程就会阻塞,等待缓冲区可写的条件信号的发生。当缓冲区空的时候,读缓冲线程就会阻塞,等待缓冲区可读的条件信号的发生。写缓冲线程在每写一次数据到缓冲区之后,都会发送一次缓冲区可读的条件信号,读缓冲线程在每从缓冲区读一次数据之后,都会发送一次缓冲区可写的条件信号。主程序将会在所有子线程结束之后,才会结束。10 2.2循环缓冲区数据变化过程及读写指针变化过程dataLen=(writeldx–readldx+bufLen)%bufLen;初始化后:dataLen=0写1读0后:dataLen=1写8读0后:dataLen=9(该状态判定为buf满,即dataLen=bufLen–1时)10 写0读3后:dataLen=6写5读3后:dataLen=8写0读6后:dataLen=2写0读2后:dataLen=0(该状态判定为buf空,即dataLen=0时)10 2.3系统流程图10 1.数据结构设计typedefvoid*HANDLE;intEND_OF_FILE=0;//源文件结束标志pthread_mutex_twrite_mutex;//写缓冲区用户互斥量pthread_mutex_tread_mutex;//读缓冲区用户互斥量pthread_cond_twrite_cond;//写缓冲区用户条件变量pthread_cond_tread_cond;//读缓冲区用户条件变量说明:END_OF_FILE是源文件的文件结束标志,当写缓冲区用户读到源文件末尾的时候,则将END_OF_FILE置为1,表示源文件已经读完,其将作为读写用户线程结束的判断信息。write_mutex是多个写缓冲区用户间的写互斥量。read_mutex是多个读缓冲区用户间的读互斥量。write_cond是写缓冲区用户条件变量,当缓冲区满的时候,则写缓冲区用户解锁阻塞等待条件write_cond的发生,该条件由读缓冲区用户发送。read_cond是读缓冲区用户条件变量,当缓冲区空的时候,则读缓冲区用户解锁阻塞等待条件read_cond的发生,该条件是由写缓冲区用户发送的。10 /*环形缓冲区数据结构*/typedefstruct{unsignedchar*bufBase;//环形缓冲区地址intbufLen;//环形缓冲区大小intwriteldx;//环形缓冲区写指针intreadldx;//环形缓冲区读指针intdataLen;//环形缓冲区内容长度#ifdefOS_LINUXpthread_mutex_tmutex;//读写用户终端互斥量#elifOS_WINDOWSCRITICAL_SECTIONg_cs;//环形缓冲区关键代码段#endif}RING_BUFFER;#defineOK0#defineERROR-1#defineSOURCEFILE"/mnt/hgfs/ubuntu_share/Yan2Task/sourcefile.txt"//源文件路径#defineNEWFILE"/mnt/hgfs/ubuntu_share/Yan2Task/newfile.txt"//目的文件路径1.接口设计/****************************************************************Function:ringbuf_init()*Description:循环缓冲区初始化函数*AccessLevel:public*Input:bufSize---循环缓冲区大小*Output:N/A*Return:循环缓冲区句柄---成功/NULL---失败***************************************************************/HANDLEringbuf_init(intbufSize);/****************************************************************Function:ringbuf_write()*Description:循环缓冲区写入数据函数*Input:hRingBuf---循环缓冲区句柄pSrcBuf---待写入数据源地址len---待写入数据长度*Output:N/A*Return:实际写入数据的长度---成功/-1---失败***************************************************************/intringbuf_write(HANDLEhRingBuf,unsignedchar*pSrcBuf,intlen);10 /****************************************************************Function:ringbuf_read()*Description:循环缓冲区读取数据函数*Input:hRingBuf---循环缓冲区句柄pDstBuf---读取数据的目的地地址len---待读取数据长度*Output:N/A*Return:实际读取数据的长度---成功/-1---失败***************************************************************/intringbuf_read(HANDLEhRingBuf,unsignedchar*pDstBuf,intlen);/****************************************************************Function:ringbuf_datelen()*Description:获取循环缓冲区有效数据长度*Input:hRingBuf---循环缓冲区句柄*Output:N/A*Return:循环缓冲区有效数据的长度---成功/-1---失败***************************************************************/intringbuf_datelen(HANDLEhRingBuf);/****************************************************************Function:ringbuf_destroy()*Description:循环缓冲区销毁函数*Input:hRingBuf---循环缓冲区句柄*Output:N/A*Return:OK/ERROR***************************************************************/intringbuf_destroy(HANDLEhRingBuf);/****************************************************************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);10 1.测试用例按要求测试为:一个线程写入一个固定文件内容、一个线程读取数据并写入到另一个文件。测试:源文件路径:"/mnt/hgfs/ubuntu_share/Yan2Task/sourcefile.txt"目的文件路径:"/mnt/hgfs/ubuntu_share/Yan2Task/newfile.txt"测试源文件目的文件问题少量英文字符10个英文字符同源文件目的文件末尾多了一个空格中量英文字符260个英文字符同源文件目的文件末尾多了一个空格中文汉字65个汉字同源文件目的文件末尾多了一个空格中英文及各种符号1758个字符同源文件目的文件末尾多了一个空格2.修订记录序号变更时间版本变更人变更说明12011/08/15V1.0.0XXX创建23410

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭