欢迎来到天天文库
浏览记录
ID:6183813
大小:281.44 KB
页数:10页
时间:2018-01-05
《环形缓冲区代码设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、环形缓冲区设计文档编制XXX审核批准10目录1.任务概述31.1任务描述31.2功能需求31.3开发环境及工具32.总体设计32.1基本设计概念和处理流程32.2循环缓冲区数据变化过程及读写指针变化过程42.3系统流程图63.数据结构设计74.接口设计85.测试用例106.修订记录10101.任务概述1.1任务描述环形缓冲区设计。环形缓冲区是嵌入式系统中一种常见的重要的数据结构。主要用于生产者——消费者环境。生产者往缓冲区中生产数据,消费者从缓冲区中消费数据。本设计缓冲区有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形
2、缓冲区中可写的数据。通过移动读指针和写指针实现缓冲区的数据读取和写入。1.2功能需求环形缓冲区的读用户(消费者)仅仅影响读指针,写用户(生产者)仅仅会影响写指针。当仅仅有一个读用户和一个写用户,那么不需要互斥保护机制就可保证数据的正确性。但当有多个读写用户是,需要有相应的互斥保护机制来确保缓冲区的互斥访问及数据的安全性。1.3开发环境及工具编辑工具:SourceInsight编译及运行系统环境:linux操作系统2.总体设计2.1基本设计概念和处理流程本设计主要是通过读写指针的移动来实现缓冲区的环形化。环形缓冲区与传统缓冲区相比缓冲区的利用率更
3、高。缓冲区的大小是手动输入的,即大小可变。缓冲区的读写位置是通过基地址加偏移量来计算的,偏移量即为读写指针的值。互斥访问存在于多个读用户或者多个写用户之间;读写线程之间本应该是不存在互斥关系的,但因为读写数据的大小是手动输入的,所以本设计在读写线程之间设计了一个终端访问互斥量。对于写缓冲区用户线程来说,线程的正常结束有两种可能,一种是源文件读到末尾;另一种是等待超时;但正常情况下一般都是第一种情况。读缓冲区用户来说,线程的正常结束只有等待超时,因为此时可能写缓冲线程已经结束,缓冲区长时间处于为空的状态下。等待分写缓冲区线程等待和读缓冲区线程等待
4、。当缓冲区满的时候,写缓冲线程就会阻塞,等待缓冲区可写的条件信号的发生。当缓冲区空的时候,读缓冲线程就会阻塞,等待缓冲区可读的条件信号的发生。写缓冲线程在每写一次数据到缓冲区之后,都会发送一次缓冲区可读的条件信号,读缓冲线程在每从缓冲区读一次数据之后,都会发送一次缓冲区可写的条件信号。主程序将会在所有子线程结束之后,才会结束。102.2循环缓冲区数据变化过程及读写指针变化过程dataLen=(writeldx–readldx+bufLen)%bufLen;初始化后:dataLen=0写1读0后:dataLen=1写8读0后:dataLen=9(
5、该状态判定为buf满,即dataLen=bufLen–1时)10写0读3后:dataLen=6写5读3后:dataLen=8写0读6后:dataLen=2写0读2后:dataLen=0(该状态判定为buf空,即dataLen=0时)102.3系统流程图101.数据结构设计typedefvoid*HANDLE;intEND_OF_FILE=0;//源文件结束标志pthread_mutex_twrite_mutex;//写缓冲区用户互斥量pthread_mutex_tread_mutex;//读缓冲区用户互斥量pthread_cond_twrite
6、_cond;//写缓冲区用户条件变量pthread_cond_tread_cond;//读缓冲区用户条件变量说明:END_OF_FILE是源文件的文件结束标志,当写缓冲区用户读到源文件末尾的时候,则将END_OF_FILE置为1,表示源文件已经读完,其将作为读写用户线程结束的判断信息。write_mutex是多个写缓冲区用户间的写互斥量。read_mutex是多个读缓冲区用户间的读互斥量。write_cond是写缓冲区用户条件变量,当缓冲区满的时候,则写缓冲区用户解锁阻塞等待条件write_cond的发生,该条件由读缓冲区用户发送。read_c
7、ond是读缓冲区用户条件变量,当缓冲区空的时候,则读缓冲区用户解锁阻塞等待条件read_cond的发生,该条件是由写缓冲区用户发送的。10/*环形缓冲区数据结构*/typedefstruct{unsignedchar*bufBase;//环形缓冲区地址intbufLen;//环形缓冲区大小intwriteldx;//环形缓冲区写指针intreadldx;//环形缓冲区读指针intdataLen;//环形缓冲区内容长度#ifdefOS_LINUXpthread_mutex_tmutex;//读写用户终端互斥量#elifOS_WINDOWSCRIT
8、ICAL_SECTIONg_cs;//环形缓冲区关键代码段#endif}RING_BUFFER;#defineOK0#defineERROR-1#de
此文档下载收益归作者所有