環(huán)形緩沖區(qū)代碼設(shè)計(jì)_第1頁
環(huán)形緩沖區(qū)代碼設(shè)計(jì)_第2頁
環(huán)形緩沖區(qū)代碼設(shè)計(jì)_第3頁
環(huán)形緩沖區(qū)代碼設(shè)計(jì)_第4頁
環(huán)形緩沖區(qū)代碼設(shè)計(jì)_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、環(huán)形緩沖區(qū)設(shè)計(jì)文檔編制XXX審核批準(zhǔn)目錄1 任務(wù)概述31.1 任務(wù)描述31.2 功能需求31.3 開發(fā)環(huán)境及工具32 總體設(shè)計(jì)32.1 基本設(shè)計(jì)概念和處理流程32.2 循環(huán)緩沖區(qū)數(shù)據(jù)變化過程及讀寫指針變化過程42.3 系統(tǒng)流程圖63 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)74 接口設(shè)計(jì)85 測試用例106 修訂記錄101 任務(wù)概述1.1 任務(wù)描述環(huán)形緩沖區(qū)設(shè)計(jì)。環(huán)形緩沖區(qū)是嵌入式系統(tǒng)中一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。主要用于生產(chǎn)者消費(fèi)者環(huán)境。生產(chǎn)者往緩沖區(qū)中生產(chǎn)數(shù)據(jù),消費(fèi)者從緩沖區(qū)中消費(fèi)數(shù)據(jù)。本設(shè)計(jì)緩沖區(qū)有一個(gè)讀指針和 一個(gè)寫指針。讀指針指向環(huán)形緩沖區(qū)中可讀的數(shù)據(jù),寫指針指向環(huán)形緩沖區(qū)中可寫的數(shù)據(jù)。通過移動讀指針和寫指針實(shí)現(xiàn)

2、緩沖區(qū)的數(shù)據(jù)讀取和寫入。1.2 功能需求環(huán)形緩沖區(qū)的讀用戶(消費(fèi)者)僅僅影響讀指針,寫用戶(生產(chǎn)者)僅僅會影響寫指針。當(dāng)僅僅有一個(gè)讀用戶和一個(gè)寫用戶,那么不需要互斥保護(hù)機(jī)制就可保證數(shù)據(jù)的正確性。但當(dāng)有多個(gè)讀寫用戶是,需要有相應(yīng)的互斥保護(hù)機(jī)制來確保緩沖區(qū)的互斥訪問及數(shù)據(jù)的安全性。1.3 開發(fā)環(huán)境及工具編輯工具:Source Insight編譯及運(yùn)行系統(tǒng)環(huán)境:linux操作系統(tǒng)2 總體設(shè)計(jì)2.1 基本設(shè)計(jì)概念和處理流程本設(shè)計(jì)主要是通過讀寫指針的移動來實(shí)現(xiàn)緩沖區(qū)的環(huán)形化。環(huán)形緩沖區(qū)與傳統(tǒng)緩沖區(qū)相比緩沖區(qū)的利用率更高。緩沖區(qū)的大小是手動輸入的,即大小可變。緩沖區(qū)的讀寫位置是通過基地址加偏移量來計(jì)算的,

3、偏移量即為讀寫指針的值。互斥訪問存在于多個(gè)讀用戶或者多個(gè)寫用戶之間;讀寫線程之間本應(yīng)該是不存在互斥關(guān)系的,但因?yàn)樽x寫數(shù)據(jù)的大小是手動輸入的,所以本設(shè)計(jì)在讀寫線程之間設(shè)計(jì)了一個(gè)終端訪問互斥量。對于寫緩沖區(qū)用戶線程來說,線程的正常結(jié)束有兩種可能,一種是源文件讀到末尾;另一種是等待超時(shí);但正常情況下一般都是第一種情況。讀緩沖區(qū)用戶來說,線程的正常結(jié)束只有等待超時(shí),因?yàn)榇藭r(shí)可能寫緩沖線程已經(jīng)結(jié)束,緩沖區(qū)長時(shí)間處于為空的狀態(tài)下。等待分寫緩沖區(qū)線程等待和讀緩沖區(qū)線程等待。當(dāng)緩沖區(qū)滿的時(shí)候,寫緩沖線程就會阻塞,等待緩沖區(qū)可寫的條件信號的發(fā)生。當(dāng)緩沖區(qū)空的時(shí)候,讀緩沖線程就會阻塞,等待緩沖區(qū)可讀的條件信號的發(fā)

4、生。寫緩沖線程在每寫一次數(shù)據(jù)到緩沖區(qū)之后,都會發(fā)送一次緩沖區(qū)可讀的條件信號,讀緩沖線程在每從緩沖區(qū)讀一次數(shù)據(jù)之后,都會發(fā)送一次緩沖區(qū)可寫的條件信號。主程序?qū)谒凶泳€程結(jié)束之后,才會結(jié)束。 2.2 循環(huán)緩沖區(qū)數(shù)據(jù)變化過程及讀寫指針變化過程dataLen = (writeldx readldx + bufLen) % bufLen;初始化后: dataLen = 0 寫1 讀0 后: dataLen = 1寫8 讀0 后: dataLen = 9 (該狀態(tài)判定為buf滿,即dataLen = bufLen 1時(shí))寫0 讀3 后: dataLen = 6寫5 讀3 后: dataLen = 8寫

5、0 讀6 后: dataLen = 2寫0 讀2 后: dataLen = 0 (該狀態(tài)判定為buf空,即 dataLen = 0 時(shí))2.3 系統(tǒng)流程圖3 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)typedef void* HANDLE;int END_OF_FILE = 0; / 源文件結(jié)束標(biāo)志pthread_mutex_t write_mutex; / 寫緩沖區(qū)用戶互斥量pthread_mutex_t read_mutex; / 讀緩沖區(qū)用戶互斥量pthread_cond_t write_cond; / 寫緩沖區(qū)用戶條件變量pthread_cond_t read_cond; / 讀緩沖區(qū)用戶條件變量說明:END_O

6、F_FILE 是源文件的文件結(jié)束標(biāo)志,當(dāng)寫緩沖區(qū)用戶讀到源文件末尾的時(shí)候,則將END_OF_FILE 置為1,表示源文件已經(jīng)讀完,其將作為讀寫用戶線程結(jié)束的判斷信息。write_mutex 是多個(gè)寫緩沖區(qū)用戶間的寫互斥量。read_mutex 是多個(gè)讀緩沖區(qū)用戶間的讀互斥量。write_cond 是寫緩沖區(qū)用戶條件變量,當(dāng)緩沖區(qū)滿的時(shí)候,則寫緩沖區(qū)用戶解鎖阻塞等待條件write_cond 的發(fā)生,該條件由讀緩沖區(qū)用戶發(fā)送。read_cond 是讀緩沖區(qū)用戶條件變量,當(dāng)緩沖區(qū)空的時(shí)候,則讀緩沖區(qū)用戶解鎖阻塞等待條件read_cond的發(fā)生,該條件是由寫緩沖區(qū)用戶發(fā)送的。/*環(huán)形緩沖區(qū)數(shù)據(jù)結(jié)構(gòu)*/

7、typedef structunsigned char *bufBase; / 環(huán)形緩沖區(qū)地址int bufLen; / 環(huán)形緩沖區(qū)大小int writeldx; / 環(huán)形緩沖區(qū)寫指針int readldx; / 環(huán)形緩沖區(qū)讀指針int dataLen; / 環(huán)形緩沖區(qū)內(nèi)容長度#ifdef OS_LINUXpthread_mutex_t mutex; / 讀寫用戶終端互斥量#elif OS_WINDOWS CRITICAL_SECTION g_cs; / 環(huán)形緩沖區(qū)關(guān)鍵代碼段#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 接口設(shè)計(jì)/* Function: ringbuf_init ( )* Description: 循環(huán)緩沖區(qū)初始化函數(shù)* Access Level: public* Input: bufSize - - - 循環(huán)緩沖區(qū)大小* Output: N/A* Return: 循環(huán)緩沖區(qū)句柄 - - - 成

9、功/NULL - - - 失敗*/HANDLE ringbuf_init ( int bufSize ) ;/* Function: ringbuf_write ( ) * Description: 循環(huán)緩沖區(qū)寫入數(shù)據(jù)函數(shù)* Input: hRingBuf - - - 循環(huán)緩沖區(qū)句柄 pSrcBuf - - - 待寫入數(shù)據(jù)源地址 len - - - 待寫入數(shù)據(jù)長度* Output: N/A* Return: 實(shí)際寫入數(shù)據(jù)的長度 - - - 成功/ -1 - - - 失敗*/int ringbuf_write ( HANDLE hRingBuf , unsigned char* pSrcBuf

10、, int len ) ;/* Function: ringbuf_read ( ) * Description: 循環(huán)緩沖區(qū)讀取數(shù)據(jù)函數(shù)* Input: hRingBuf - - - 循環(huán)緩沖區(qū)句柄 pDstBuf - - - 讀取數(shù)據(jù)的目的地地址 len - - - 待讀取數(shù)據(jù)長度* Output: N/A* Return: 實(shí)際讀取數(shù)據(jù)的長度 - - - 成功/ -1 - - - 失敗*/int ringbuf_read ( HANDLE hRingBuf , unsigned char* pDstBuf , int len ) ;/* Function: ringbuf_datelen

11、 ( )* Description: 獲取循環(huán)緩沖區(qū)有效數(shù)據(jù)長度* Input: hRingBuf - - - 循環(huán)緩沖區(qū)句柄* Output: N/A* Return: 循環(huán)緩沖區(qū)有效數(shù)據(jù)的長度- - -成功/ -1 - - -失敗*/int ringbuf_datelen ( HANDLE hRingBuf ) ;/* Function: ringbuf_destroy ( )* Description: 循環(huán)緩沖區(qū)銷毀函數(shù)* Input: hRingBuf - - - 循環(huán)緩沖區(qū)句柄* Output: N/A* Return: OK/ERROR*/int ringbuf_destroy

12、( HANDLE hRingBuf ) ;/* Function: thread_ringbuf_write ( )* Description: 寫入數(shù)據(jù)線程調(diào)用函數(shù)* Input: pSourceFile - - -源文件路徑句柄* Return: OK/ERROR*/void * thread_ringbuf_write ( void * pSourceFile ) ;/* Function: thread_ringbuf_read ( )* Description: 讀取數(shù)據(jù)線程調(diào)用函數(shù)* Input: pNewFile - - -目的文件路徑句柄* Return: OK/ERROR*/void * thread_ringbuf_read ( void * pNewFile ) ;5 測試用例按要求測試為:一個(gè)線程寫入一個(gè)固定文件內(nèi)容、一個(gè)線程讀取數(shù)據(jù)并寫入到另一個(gè)文件。測試:源文件路徑:"/mnt/hgfs/ubuntu_share/Yan2Task/sourcefile.txt"目的文件路徑:"/mnt/hgfs/ubuntu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論