




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
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 測(cè)試用例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ù)。通過移動(dòng)讀指針和寫指針實(shí)現(xiàn)
2、緩沖區(qū)的數(shù)據(jù)讀取和寫入。1.2 功能需求環(huán)形緩沖區(qū)的讀用戶(消費(fèi)者)僅僅影響讀指針,寫用戶(生產(chǎn)者)僅僅會(huì)影響寫指針。當(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ì)主要是通過讀寫指針的移動(dòng)來實(shí)現(xiàn)緩沖區(qū)的環(huán)形化。環(huán)形緩沖區(qū)與傳統(tǒng)緩沖區(qū)相比緩沖區(qū)的利用率更高。緩沖區(qū)的大小是手動(dòng)輸入的,即大小可變。緩沖區(qū)的讀寫位置是通過基地址加偏移量來計(jì)算的,
3、偏移量即為讀寫指針的值?;コ庠L問存在于多個(gè)讀用戶或者多個(gè)寫用戶之間;讀寫線程之間本應(yīng)該是不存在互斥關(guān)系的,但因?yàn)樽x寫數(shù)據(jù)的大小是手動(dòng)輸入的,所以本設(shè)計(jì)在讀寫線程之間設(shè)計(jì)了一個(gè)終端訪問互斥量。對(duì)于寫緩沖區(qū)用戶線程來說,線程的正常結(jié)束有兩種可能,一種是源文件讀到末尾;另一種是等待超時(shí);但正常情況下一般都是第一種情況。讀緩沖區(qū)用戶來說,線程的正常結(jié)束只有等待超時(shí),因?yàn)榇藭r(shí)可能寫緩沖線程已經(jīng)結(jié)束,緩沖區(qū)長(zhǎng)時(shí)間處于為空的狀態(tài)下。等待分寫緩沖區(qū)線程等待和讀緩沖區(qū)線程等待。當(dāng)緩沖區(qū)滿的時(shí)候,寫緩沖線程就會(huì)阻塞,等待緩沖區(qū)可寫的條件信號(hào)的發(fā)生。當(dāng)緩沖區(qū)空的時(shí)候,讀緩沖線程就會(huì)阻塞,等待緩沖區(qū)可讀的條件信號(hào)的發(fā)
4、生。寫緩沖線程在每寫一次數(shù)據(jù)到緩沖區(qū)之后,都會(huì)發(fā)送一次緩沖區(qū)可讀的條件信號(hào),讀緩沖線程在每從緩沖區(qū)讀一次數(shù)據(jù)之后,都會(huì)發(fā)送一次緩沖區(qū)可寫的條件信號(hào)。主程序?qū)?huì)在所有子線程結(jié)束之后,才會(huì)結(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)容長(zhǎng)度#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ù)長(zhǎng)度* Output: N/A* Return: 實(shí)際寫入數(shù)據(jù)的長(zhǎng)度 - - - 成功/ -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ù)長(zhǎng)度* Output: N/A* Return: 實(shí)際讀取數(shù)據(jù)的長(zhǎng)度 - - - 成功/ -1 - - - 失敗*/int ringbuf_read ( HANDLE hRingBuf , unsigned char* pDstBuf , int len ) ;/* Function: ringbuf_datelen
11、 ( )* Description: 獲取循環(huán)緩沖區(qū)有效數(shù)據(jù)長(zhǎng)度* Input: hRingBuf - - - 循環(huán)緩沖區(qū)句柄* Output: N/A* Return: 循環(huán)緩沖區(qū)有效數(shù)據(jù)的長(zhǎng)度- - -成功/ -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 測(cè)試用例按要求測(cè)試為:一個(gè)線程寫入一個(gè)固定文件內(nèi)容、一個(gè)線程讀取數(shù)據(jù)并寫入到另一個(gè)文件。測(cè)試:源文件路徑:"/mnt/hgfs/ubuntu_share/Yan2Task/sourcefile.txt"目的文件路徑:"/mnt/hgfs/ubuntu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/IEC TS 20540:2025 EN Information security,cybersecurity and privacy protection - Testing cryptographic modules in their field
- 2025至2030中國用藥依從性管理行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國生物硬腦膜修復(fù)行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國特藥配送行業(yè)發(fā)展趨勢(shì)分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 2025至2030中國特殊和擠壓石墨行業(yè)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 多元化創(chuàng)業(yè)培訓(xùn)與技能提升計(jì)劃
- 間冷塔培訓(xùn)課件
- 心理評(píng)估在課程設(shè)計(jì)中的重要性
- 教育投資在提升國民素質(zhì)中的作用評(píng)估
- 教育技術(shù)在教學(xué)管理中的價(jià)值與作用
- 船廠安全用電培訓(xùn)課件
- 《2025年CSCO腎癌診療指南》解讀
- 人教版九年級(jí)化學(xué)上冊(cè)暑假銜接講義(初二升初三)
- 跆拳道館技術(shù)崗位薪酬制度
- 無人駕駛車法規(guī)-深度研究
- 《寧晉縣國土空間總體規(guī)劃(2021-2035年)》
- 2024年度乳腺癌篩查與早期診斷課件
- 2024年食品檢驗(yàn)員(高級(jí))職業(yè)鑒定理論考試題庫(含答案)
- 工廠物品回收合同模板
- JJF 1168-2024便攜式制動(dòng)性能測(cè)試儀校準(zhǔn)規(guī)范
- 經(jīng)橈動(dòng)脈介入診療患者術(shù)肢并發(fā)癥預(yù)防及護(hù)理專家共識(shí)解讀
評(píng)論
0/150
提交評(píng)論