亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法及裝置的制作方法

文檔序號:6443494閱讀:314來源:國知局
專利名稱:一種用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法及裝置的制作方法
技術領域
本發(fā)明涉及圖像數(shù)據(jù)處理領域,尤其涉及的是一種用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法及裝置。
背景技術
在圖像處理中,經(jīng)常會需要采集批量數(shù)據(jù)或者及顯示多幅圖像的,保證數(shù)據(jù)的完整性是圖像處理的基本要求,因此,在圖像處理過程中數(shù)據(jù)的傳輸與通信就是關鍵。通常,數(shù)據(jù)都是從外設數(shù)據(jù)緩沖到終端設備的內存后再進行處理的,然而不論是個人電腦(PC)還是其它嵌入式設備終端,內存總是有限的,一次性地申請一個內存來緩沖這些數(shù)據(jù)是比較困難的,所以就需要使用環(huán)形數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)結構來解決這一難題。環(huán)形緩沖區(qū)是一個先進先出的循環(huán)緩沖區(qū),通常有一個讀指針和一個寫指針,程序中通過移動讀指針和寫指針就可以實現(xiàn)緩沖區(qū)的數(shù)據(jù)讀取和寫入,由于有時讀指針與寫指針是同時使用的,所以會使得緩沖區(qū)產(chǎn)生互斥問題,這會影響到數(shù)據(jù)傳輸?shù)臏蚀_性及數(shù)據(jù)傳輸?shù)男省?br>
發(fā)明內容
本發(fā)明要解決的技術問題在于,針對現(xiàn)有技術的上述缺陷,提供一種用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法及裝置,使用環(huán)形緩沖區(qū)與隊列控制相結合的方法來解決圖像處理過程中在緩沖區(qū)產(chǎn)生讀取數(shù)據(jù)與寫入數(shù)據(jù)互斥的問題。本發(fā)明解決技術問題所采用的技術方案如下
一種用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法,包括步驟
A、當有數(shù)據(jù)寫請求時,寫指針計算出在環(huán)形數(shù)據(jù)緩沖區(qū)當前要寫入數(shù)據(jù)的起始位置, 讀取外設數(shù)據(jù),從該起始位置開始向所述環(huán)形緩沖區(qū)寫入數(shù)據(jù),寫完后所述寫指針的數(shù)值加I ;
B、當收到讀數(shù)據(jù)請求時,讀指針計算當前需要讀取的數(shù)據(jù)所在的位置,從該位置開始讀取數(shù)據(jù),讀完后所述讀指針的數(shù)值加I ;
C、當所述環(huán)形數(shù)據(jù)緩沖區(qū)出現(xiàn)異常,根據(jù)異常類型執(zhí)行相應的操作,其中,所述異常的類型包括所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出或為空。優(yōu)選地,所述步驟A之前還包括
Al、定義多個緩沖區(qū),其中,所述緩沖區(qū)的個數(shù)與所述環(huán)形數(shù)據(jù)緩沖區(qū)的個數(shù)相等;
A2、建立等待列隊;
A3、申請至少一個緩沖區(qū)作為環(huán)形數(shù)據(jù)緩沖區(qū),所述緩沖區(qū)的地址單元是連續(xù)的;
A4、初始化所述讀指針、寫指針的數(shù)值,使所述讀指針、寫指針的數(shù)值均為O;
所述步驟B之前還包括
BI、判斷是否收到喚醒信號,如果是,則轉向步驟B2,否則返回等待喚醒信號;
B2、判斷當前的讀指針的絕對位置是否小于寫指針的絕對位置,如果判斷結果為是時,則進入步驟B,否則表示無數(shù)據(jù)可讀,返回所述步驟BI。優(yōu)選地,所述步驟C具體包括
Cl、當所述寫指針的相對位置超出或等于所述讀指針的相對位置,并且所述寫指針的絕對位置超出所述讀指針的絕對位置,則所述環(huán)形緩沖區(qū)溢出,發(fā)出溢出信號,并進入步驟 C3 ;
C2、當所述寫指針的相對位置等于所述讀指針的相對位置,并且所述寫指針的絕對位置與所述讀指針的絕對位置相等,則所述環(huán)形數(shù)據(jù)緩沖區(qū)為空,則返回所述環(huán)形數(shù)據(jù)緩沖區(qū)為空的信號,并進入步驟C4;
C3、調整所述讀指針及所述寫指針的絕對位置,使得所述寫指針超前所述讀指針;
C4、讀指針進入等待狀態(tài)。優(yōu)選地,所述步驟C3之后具體還包括
當所述寫指針的絕對位置等于或者超出所述讀指針的絕對位置時,并且所述寫指針的相對位置與所述讀指針的相對位置相等時,分別重新對所述讀指針及寫指針進行調整,使得所述寫指針超前所述讀指針。優(yōu)選地,所述讀指針的絕對位置是指所述讀指針相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址零位置實際所表示的數(shù)值;所述寫指針的絕對位置是指所述寫指針相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址零位置實際所表示的數(shù)值;
所述讀指針的相對位置是指所述讀指針當前的位置相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址的距離,所述寫指針的相對位置是指所述寫指針當前的位置相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址的距離。本發(fā)明還提供一種實現(xiàn)上述方法的裝置
一種用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的裝置,包括
寫指針控制單元,當有數(shù)據(jù)寫請求時,用于控制寫指針計算出在環(huán)形數(shù)據(jù)緩沖區(qū)當前要寫入數(shù)據(jù)的起始位置,讀取外設數(shù)據(jù),從該起始位置開始向所述環(huán)形緩沖區(qū)寫入數(shù)據(jù),寫完后所述寫指針的數(shù)值加I;
讀指針控制單元,當收到讀數(shù)據(jù)請求時,用于控制讀指針計算當前需要讀取的數(shù)據(jù)所在的位置,從該位置開始讀取數(shù)據(jù),讀完后所述讀指針的數(shù)值加I;
指針調整單元,當所述環(huán)形數(shù)據(jù)緩沖區(qū)出現(xiàn)異常,根據(jù)異常類型執(zhí)行相應的操作,其中,所述異常的類型包括所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出或為空。優(yōu)選地,其還包括
定義單元,用于定義多個緩沖區(qū),其中,所述緩沖區(qū)的個數(shù)與所述環(huán)形數(shù)據(jù)緩沖區(qū)的個數(shù)相等;
列隊建立單元,用于建立等待列隊;
緩沖區(qū)申請單元,用于申請至少一個緩沖區(qū)作為環(huán)形數(shù)據(jù)緩沖區(qū),所述緩沖區(qū)的地址單元是連續(xù)的;
初始化單元,用于初始化所述讀指針、寫指針的數(shù)值,使所述讀指針、寫指針的數(shù)值均為O。優(yōu)選地,所述指針調整單元包括
第一判斷模塊,用于判斷所述讀指針是否收到喚醒信號,如果為是,則喚醒所述讀指針,接著并判斷當前的讀指針的絕對位置是否小于寫指針的絕對位置;
第二判斷模塊,用于判斷所述環(huán)形數(shù)據(jù)緩沖區(qū)是否異常,根據(jù)異常類型向調整控制模塊發(fā)送相對應的所述環(huán)形數(shù)據(jù)緩沖區(qū)異常信號,其中,所述異常信號包括所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出信號或所述環(huán)形數(shù)據(jù)緩沖區(qū)為空信號;
調整控制模塊,當接收到所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出信號時,用于調整所述讀指針及所述寫指針的絕對位置,使得所述寫指針超前所述讀指針;或當接收到所述環(huán)形數(shù)據(jù)緩沖區(qū)為空信號時,用于控制所述讀指針進入等待狀態(tài)。優(yōu)選地,所述第二判斷模塊還用于再次判斷所述寫指針的絕對位置是否等于或者超出所述讀指針的絕對位置,并且判斷所述寫指針的相對位置與所述讀指針的相對位置是否相等;
所述指針調整單元還用于當所述寫指針的絕對位置等于或超出所述讀指針的絕對位置時,并且當所述寫指針的相對位置等于所述讀指針的相對位置時,分別重新對所述讀指針及寫指針進行調整,使得所述寫指針超前所述讀指針。優(yōu)選地,所述讀指針的絕對位置是指所述讀指針相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址零位置實際所表示的數(shù)值;所述寫指針的絕對位置是指所述寫指針相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址零位置實際所表示的數(shù)值;
所述讀指針的相對位置是指所述讀指針當前的位置相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址的距離,所述寫指針的相對位置是指所述寫指針當前的位置相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址的距離。本發(fā)明所提供的用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法及裝置,寫進程與讀進程分開執(zhí)行,實時監(jiān)控環(huán)形數(shù)據(jù)緩沖區(qū)的異常,當所述環(huán)形數(shù)據(jù)緩沖區(qū)出現(xiàn)異常時,調整讀指針及寫指針,使得讀數(shù)據(jù)及寫數(shù)據(jù)可以順利進行,避免了讀進程與寫進程同時進行時對環(huán)形數(shù)據(jù)緩沖區(qū)進行操作而造成的臨界資源訪問異常的問題,保證了數(shù)據(jù)傳輸?shù)男?,進一步提供了數(shù)據(jù)傳輸?shù)木_度。


圖I是本發(fā)明實施例的用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法流程圖。圖2是本發(fā)明應用實施例的寫環(huán)形緩沖區(qū)的過程流程圖。圖3是本發(fā)明應用實施例的讀環(huán)形緩沖區(qū)的過程流程圖。圖4是本發(fā)明應用實施例的環(huán)形數(shù)據(jù)緩沖區(qū)調整過程流程圖。圖5是本發(fā)明實施例的用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的裝置原理框圖。圖6是本發(fā)明應用實施例的環(huán)形緩沖區(qū)結構示意圖。
具體實施例方式本發(fā)明所提供的用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法及裝置,為使本發(fā)明的目的、技術方案及優(yōu)點更加清楚、明確,以下參照附圖并舉實施例對本發(fā)明進一步詳細說明。 應當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。本發(fā)明實施例的一種用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法,如圖I所示,主要包括以下步驟
7步驟S100、當有數(shù)據(jù)寫請求時,寫指針計算出在環(huán)形數(shù)據(jù)緩沖區(qū)當前要寫入數(shù)據(jù)的起始位置,讀取外設數(shù)據(jù),從該起始位置開始向所述環(huán)形緩沖區(qū)寫入數(shù)據(jù),寫完后所述寫指針的數(shù)值加I。本實施例中,所述數(shù)據(jù)寫請求攜帶寫入數(shù)據(jù)的數(shù)量,可以是指定單位個數(shù)據(jù),例如8192個字節(jié)的數(shù)據(jù)。本實施例中,指針的數(shù)值最小單位為1,并且該數(shù)值都是整數(shù)。進一步地,計算所述起始位置時,根據(jù)所述寫指針的絕對位置與所述環(huán)形數(shù)據(jù)緩沖區(qū)的首地址做求和運算,計算出當前需要寫入數(shù)據(jù)的起始位置。其中的計算方法可根據(jù)所述環(huán)形數(shù)據(jù)緩沖區(qū)的結構而設計,此處對此不作限制。當寫完數(shù)據(jù)時,寫指針的數(shù)值加I。步驟S200、當收到讀數(shù)據(jù)請求時,讀指針計算當前需要讀取的數(shù)據(jù)所在的位置,從該位置開始讀取數(shù)據(jù),讀完后所述讀指針的數(shù)值加I。本實施例中,進一步地,計算所述起始位置時,根據(jù)所述讀指針的絕對位置與所述環(huán)形數(shù)據(jù)緩沖區(qū)的首地址做求和運算,計算出當前需要讀取數(shù)據(jù)的起始位置。其中的計算方法可根據(jù)所述環(huán)形數(shù)據(jù)緩沖區(qū)的結構而設計,此處對此同樣不作限制。當讀取完數(shù)據(jù)時,讀指針的數(shù)值加I。步驟S300、當所述環(huán)形數(shù)據(jù)緩沖區(qū)出現(xiàn)異常,根據(jù)異常結果執(zhí)行相應的操作,其中,所述異常的體現(xiàn)包括所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出。本實施例中,當所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出時,則說明讀指針與寫指針處于異常狀態(tài),則需要調整該讀指針及寫指針。具體地,分別將所述讀指針及所述寫指針的絕對位置相對于環(huán)形緩沖區(qū)首地址的長度值取余數(shù),使得所述環(huán)形數(shù)據(jù)緩沖區(qū)處于正常狀態(tài)(即既不溢出也不是為空)。本實施例中,當環(huán)形數(shù)據(jù)緩沖區(qū)異常時,則根據(jù)異常類型執(zhí)行相應的操作,保證了數(shù)據(jù)傳輸?shù)臏蚀_性,提供數(shù)據(jù)傳輸?shù)男?。以下將通過一具體的應用實施例對本發(fā)明的用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法做進一步詳細的說明
本實用實施例中假設是數(shù)據(jù)從圖像采集外設向嵌入式終端傳輸,并在終端處理后顯示,環(huán)形緩沖區(qū)的示意圖如圖6 (假設buffer (緩沖區(qū))個數(shù)為8)。如圖2所示,本應用實施例主要包括以下步驟
SlO :定義多個緩沖區(qū),其中,所述緩沖區(qū)的個數(shù)與所述環(huán)形數(shù)據(jù)緩沖區(qū)的個數(shù)相等; 具體地,所述多個緩沖區(qū)可用BUFFER_NUM表示,進一步地,定義例如定義#define BUFFER, NUM 8 或者 const int BUFFER_NUM = 8。接著轉到步驟 Sll。Sll、建立等待列隊,具體地,啟動外設,初始化外設,申明和建立一個讀進程等待隊列項,初始化其狀態(tài)為休眠狀態(tài),將其加入到等待隊列鏈表。S12、申請至少一個緩沖區(qū)作為環(huán)形數(shù)據(jù)緩沖區(qū),具體地,所述緩沖區(qū)的地址單元是連續(xù)的;
S13、初始化所述讀指針、寫指針的數(shù)值,使所述讀指針、寫指針的數(shù)值(即絕對位置)均為O。具體地,申請固定個數(shù)連續(xù)地址單元(單元大小根據(jù)需要定)作為緩沖區(qū)(buffer),定義和初始化讀(rPtr)、寫(wPtr)指針,使其指向buffer的頭部。其中,本實施例中緩沖區(qū)個數(shù)=BUFFER_NUM,BUFFER_NUM為整數(shù)。但是“BUFFER_ NUM個連續(xù)地址單元”大小=BUFFER_NUM *每個單元大小,每個單元大小可根據(jù)需要定義,比如說8192個字節(jié)。本步驟中例如,定義所述讀指針為rPtr,所述寫指針為wPtr ;并將所述rPtr和 wPtr定義為整數(shù)或者指針類型;不管什么類型,在初始化時必須使二者指向buffer的頭部(或者首地址)。當將所述rPtr和wPtr定義為整數(shù)類型時,在初始化時使rPtr的數(shù)值(即絕對位置)=wPtr的數(shù)值(即絕對位置)=O ;當將所述rPtr和wPtr定義為指針類型時,在初始化時使讀指針rPtr和寫指針wPtr指向所述環(huán)形緩沖區(qū)的首地址。當然運行的過程中,為了保證數(shù)據(jù)的連續(xù)性和準確性,寫指針wPtr必須超前于讀指針rptr,且讀指針rptr不能追上寫指針wPtr。需要說明的是,本實施例中,既有讀數(shù)據(jù),也有寫數(shù)據(jù)的過程,開始的時候,首先進行的是寫進程,當寫進程進行到一定時候,寫進程喚醒等待隊列的讀數(shù)據(jù)進程,當寫進程及讀進程均啟動之后,但是讀數(shù)據(jù)與寫數(shù)據(jù)之間沒有嚴格的順序,此處對此不作限制,下面分別詳細說明讀數(shù)據(jù)與寫數(shù)據(jù)的具體過程
寫數(shù)據(jù)的具體過程
S14,判斷是否有數(shù)據(jù)寫請求,當判斷結果為是時進入步驟S15、當判斷結果為否時,轉向步驟S16,等待,返回重新判斷是否有數(shù)據(jù)寫請求,即等待數(shù)據(jù)寫請求的到來。S15、寫指針計算出在環(huán)形數(shù)據(jù)緩沖區(qū)當前要寫入數(shù)據(jù)的環(huán)形緩沖區(qū)的起始位置, 并讀取外設數(shù)據(jù),從該起始位置開始向所述環(huán)形緩沖區(qū)寫入指定單位個數(shù)據(jù),寫完指定單位個數(shù)據(jù)后寫指針加I。例如,當有數(shù)據(jù)到來時,先根據(jù)寫指針計算出當前要寫buffer (緩沖區(qū))的起始位置(currWritePtr),如圖6所示的寫指針指示的當前寫入的起始位置,然后讀取外設數(shù)據(jù), 從該起始位置開始向buffer (緩沖區(qū))寫指定單位個數(shù)據(jù)如N (N 一般設為I個Buffer的單位長度)個數(shù)據(jù),寫完后寫指針加I。本步驟中,使用環(huán)形數(shù)據(jù)緩沖區(qū)首位置(零位置)與寫指針wPtr的絕對位置做求和運算,所述求和運算不是數(shù)學上簡單的加,這與緩沖區(qū)buffer的數(shù)據(jù)結構有關系,緩沖區(qū) buffer數(shù)據(jù)結構不一樣,算法也不一樣,此處對此不作限制。本實施例中,所述讀指針或寫指針的數(shù)值(即絕對位置)是讀或寫指針當前的位置相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址(零位置)實際所表示的數(shù)值,其大小不定(可能會隨著寫入或讀取次數(shù)一直增加);所述相對位置是讀或寫指針當前的位置相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址的距離,其大小不會超過緩沖區(qū)的長度。另外,零地址也就是首地址。讀數(shù)據(jù)的具體過程(如圖3所示)
D40、判斷是否收到喚醒信號,如果為是,則轉向步驟D41,否則轉向步驟D43,返回等待喚醒信號。本實施例中,當沒有數(shù)據(jù)可讀的時候,讀指針處于等待列隊之中,等待寫指針寫進程的喚醒信號后才能讀取數(shù)據(jù)。D41、判斷當前的讀指針的絕對位置是否小于寫指針的絕對位置,如果判斷結果為是時,則進入步驟D42,否則表示無數(shù)據(jù)可讀,返回所述步驟D40。D42、讀指針接收讀數(shù)據(jù)請求,計算當前需要讀取的數(shù)據(jù)所在的位置,從該位置開始讀取數(shù)據(jù),讀完后所述讀指針的數(shù)值加I ;其中,當有數(shù)據(jù)到來時,讀指針計算出當前要讀buffer (緩沖區(qū))的起始位置(currReadPtr),如圖6所示的讀指針指示的當前讀取的起始位置,然后讀取外設數(shù)據(jù),從該起始位置開始向buffer (緩沖區(qū))讀指定單位個數(shù)據(jù)如N (N —般設為I個Buffer的單位長度)個數(shù)據(jù),讀完后寫指針加I。具體地,利用讀指針的數(shù)值與buffer的首地址做求和運算,所述求和運算不是數(shù)學上簡單的加,這個buffer的數(shù)據(jù)結構有關系,buffer數(shù)據(jù)結構不一樣,算法也不一樣,此處對所述算法不作限制。當讀取數(shù)據(jù)后,還對所讀取的數(shù)據(jù)進行處理。其中,可根據(jù)用戶需要來對所讀取的數(shù)據(jù)進行處理,例如將該數(shù)據(jù)轉化成圖像信號顯示處理,或者僅僅是存儲,此處對此不作限制。當讀指針與寫指針的進程進行到一定階段,就可能會出現(xiàn)讀指針與寫指針出現(xiàn)互斥的問題,例如無數(shù)據(jù)可讀,此為環(huán)形數(shù)據(jù)緩沖區(qū)為空的狀態(tài),又例如,寫指針的絕對位置等于或超出所述讀指針的絕對位置,并且所述寫指針的相對位置超過所述讀指針的相對位置時,此時為環(huán)形數(shù)據(jù)緩沖區(qū)溢出,因此,需要通過調整讀指針與寫指針的數(shù)值來保證讀數(shù)據(jù)與寫數(shù)據(jù)的順利進行。調整的詳細過程如下(如圖4所示)
Cl、判斷所述環(huán)形數(shù)據(jù)緩沖區(qū)是否異常,如果判斷結果為是則根據(jù)異常類型返回相應的環(huán)形數(shù)據(jù)緩沖區(qū)異常信號,并轉向步驟C2,否則轉向C4,返回環(huán)形數(shù)據(jù)緩沖區(qū)正常信號。具體地,所述異常信號包括所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出信號或所述環(huán)形數(shù)據(jù)緩沖區(qū)為空信號,所述環(huán)形數(shù)據(jù)緩沖區(qū)異常類型具體表現(xiàn)為
當所述寫指針的相對位置超出所述讀指針的相對位置時,并且所述所述寫指針的絕對位置等于或超出所述讀指針的絕對位置,則判定所述環(huán)形數(shù)據(jù)緩沖區(qū)為溢出,即來不及讀取數(shù)據(jù),此現(xiàn)象為所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出;或者
當所述寫指針的相對位置等于所述讀指針相的相對位置,并且所述寫指針的絕對位置與所述讀指針的絕對位置相等,則所述環(huán)形數(shù)據(jù)緩沖區(qū)為空,即此處無數(shù)據(jù)可讀。C2、根據(jù)異常類型執(zhí)行相對應的操作。具體地,當所述寫指針的相對位置超出所述讀指針的相對位置時,并且所述寫指針的絕對位置等于或超出所述讀指針的位置時,調整所述讀指針及所述寫指針的絕對位置,使得所述寫指針超前所述讀指針。當所述寫指針的相對位置等于所述讀指針的相對位置,并且所述寫指針的絕對位置與所述讀指針的絕對位置相等,則所述環(huán)形數(shù)據(jù)緩沖區(qū)為空,讀指針進入等待狀態(tài)。具體地,當所述環(huán)形數(shù)據(jù)緩沖區(qū)為溢出時,表示數(shù)據(jù)來不及讀取,因此需要調整所述讀指針及所述寫指針的絕對位置,使得所述寫指針超前所述讀指針。即保證此時所述寫指針的相對位置等于所述讀指針的相對位置,但是所述寫指針的絕對位置超出所述讀指針的絕對位置。當所述寫指針的相對位置等于所述讀指針的相對位置,并且所述寫指針的絕對位置與所述讀指針的絕對位置相等, 則所述環(huán)形數(shù)據(jù)緩沖區(qū)為空,表示此時無數(shù)據(jù)可讀取,讀指針處于等待狀態(tài),即讀進程需要等待。此時寫進程已經(jīng)處于掛起狀態(tài),而讀進程進入等待狀態(tài)。本實施例中,當所述環(huán)形數(shù)據(jù)緩沖區(qū)處于溢出狀態(tài)時,可以根據(jù)實際情況,調整寫指針、讀指針及讀與寫指針中的任意一種。以調整所述所述讀指針及寫指針的數(shù)值為例,說明所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出時調整的過程
當寫指針(wPtr)和讀指針(rPtr)相對位置相等,但是寫指針的絕對位置等于或超出讀指針的絕對位置就說明沒來的及讀走數(shù)據(jù),導致寫指針趕上了讀指針而使得所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出,可能造成之前數(shù)據(jù)被覆蓋掉,這個時候為了保證數(shù)據(jù)連貫性,本實施例中調整讀指針,使得讀指針rPtr = rPtr% BUFFER_NUM (其中,讀指針rPtr = rPtr%BUFFER_ NUM表示重新給rPtr變量賦值,假設BUFFER_NUM等于8,未執(zhí)行此步驟之前讀指針的數(shù)值(rPtr )= 17,那么經(jīng)過重新賦值后rPtr = 17%8 = 1,其中%是取余操作,此句執(zhí)行完后,讀指針的數(shù)值rPtr的值就是1,不再是17,然后將寫指針wPtr指向的相對位置仍舊不變,可保證新數(shù)據(jù)不丟失,即wPtr = rPtr + BUFFER_NUM,但是數(shù)值上超前于讀指針(rPtr )一個周期;可以理解的是寫指針wPtr相對于環(huán)形數(shù)據(jù)緩沖區(qū)首位置的零地址的位置不變,但是數(shù)值上超前讀指針rPtr —周,然后使讀指針rPtr的相對位置超前寫指針wPtr — 個單位的長度,也就是寫指針wPtr僅比讀指針rPtr多跑一圈,此時還是肩并肩,為了不肩并肩,那么就讓讀指針rPtr向前一步,即接著調整讀指針rPtr = rPtr +1,使其在相對位置上超前寫指針wPtr I個單元,此時環(huán)形數(shù)據(jù)緩沖區(qū)不會溢出,同樣也是為了數(shù)據(jù)連貫性, 這樣可保證之前的數(shù)據(jù)不丟失。需要說明的是,本實施例中,讀數(shù)據(jù)及寫數(shù)據(jù)的進程是可以多次在進行的,調整之后可能還會出現(xiàn)需要調整所述讀指針及寫指針來使得所述環(huán)形數(shù)據(jù)緩沖區(qū)處于正常狀態(tài), 因此,所述步驟C2以后還可根據(jù)實際情況的需要而再次調整所述寫指針及讀指針
C3、當所述寫指針的絕對位置等于或者超出所述讀指針的絕對位置時,并且所述寫指針的相對位置與所述讀指針的相對位置相等時,分別重新對所述讀指針及寫指針進行調整,使得所述寫指針超前所述讀指針。其中,如何對所述讀指針及寫指針調整(賦值)是根據(jù)具體情況而定,此處對此不作限制。需要說明的是,無論讀指針及寫指針的數(shù)值怎么加減,二者必須保持特定的數(shù)值和位置關系,因為寫指針控制著當前數(shù)據(jù)的寫入位置,而讀指針控制著當前讀取數(shù)據(jù)的位置,必須時刻保持有數(shù)據(jù)可讀,同時要保證要及時讀取數(shù)據(jù),使得數(shù)據(jù)讀取的連貫性,進而保證數(shù)據(jù)讀取的準確性。本實施例中,當一次寫緩沖完成后,會繼續(xù)進行一下次數(shù)據(jù)的寫入,會循環(huán)執(zhí)行步驟S14至步驟S15,循環(huán)寫入,可以防止讀進程無數(shù)據(jù)可取)。本實施例中,寫進程在寫完數(shù)據(jù)后會喚醒讀進程;寫進程和讀進程是獨立的進程, 通過讀寫指針、隊列等機制進行sync (同步),寫過程可以由硬件本身提供的中斷或者軟件查詢機制來控制,而讀進程則需要由寫進程控制,并不是每寫一次就會去讀,讀是需要滿足條件,但是寫進程至少已經(jīng)已經(jīng)寫入一個單位長度的數(shù)據(jù)后,才能啟動讀進程;有或者可能會出現(xiàn)寫了 3次了,讀進程還在等待直到讀條件滿足,而讀進程在完成一次讀取操作后,需要由軟件將其設為掛起狀態(tài)也就是休眠狀態(tài),也就是讀進程始終處于被動狀態(tài)。本實施例中,寫進程與讀進程分開執(zhí)行,但是實時監(jiān)控環(huán)形數(shù)據(jù)緩沖區(qū)的異常,當所述環(huán)形數(shù)據(jù)緩沖區(qū)出現(xiàn)異常時,調整讀指針及寫指針,使得讀數(shù)據(jù)及寫數(shù)據(jù)可以順利進行,避免了讀進程與寫進程同時進行時對環(huán)形數(shù)據(jù)緩沖區(qū)進行操作而造成的臨界資源訪問異常的問題。保證了數(shù)據(jù)傳輸?shù)男?,進一步提供了數(shù)據(jù)傳輸?shù)木_度。基于上述實施例,本發(fā)明還提供了一種用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的裝置, 如圖5所示,包括
寫指針控制單元510、讀指針控制單元520、指針調整單元530,其中,所述裝置還可包括定義單元501、列隊建立單元502、緩沖區(qū)申請單元503及初始化單元504,具體地,所述指針調整單元530包括第一判斷模塊531、第二判斷模塊532、調整控制模塊533。為了方便理解,下面詳細描述本實施例的裝置的工作原理
定義單元501定義多個緩沖區(qū),其中,所述緩沖區(qū)的個數(shù)與所述環(huán)形數(shù)據(jù)緩沖區(qū)的個數(shù)相等;具體地,所述多個緩沖區(qū)可用BUFFER_NUM表示,進一步地,定義例如定義#defineBUFFER_NUM 8或者const int BUFFER _NUM = 8。接著列隊建立單元502建立等待列隊,具體地,啟動外設,初始化外設,申明和建立一個讀進程等待隊列項,初始化其狀態(tài)為休眠狀態(tài),將其加入到等待隊列鏈表。緩沖區(qū)申請單元503申請至少一個緩沖區(qū)作為環(huán)形數(shù)據(jù)緩沖區(qū),具體地,所述緩沖區(qū)的地址單元是連續(xù)的,而所述緩沖區(qū)的數(shù)量可根據(jù)數(shù)據(jù)的大小來設計,此處對此不作限制。接著初始化單元504初始化所述讀指針、寫指針的數(shù)值,使所述讀指針、寫指針的數(shù)值均為O。具體地,申請固定個數(shù)連續(xù)地址單元(單元大小根據(jù)需要定)作為緩沖區(qū)(buffer),定義和初始化讀(rPtr)、寫(wPtr)指針,使其指向buffer的頭部。具體地,本實施例中緩沖區(qū)個數(shù)=BUFFER_NUM,BUFFER_NUM為整數(shù)。但是 “BUFFER_NUM個連續(xù)地址單元”大小=BUFFER_NUM *每個單元大小,每個單元大小可根據(jù)需要定義,比如說8192個字節(jié)。本步驟中例如,定義所述讀指針為rPtr,所述寫指針為wPtr ;并將所述rPtr和 wPtr定義為整數(shù)或者指針類型;不管什么類型,在初始化時必須使二者指向buffer的頭部 (或者首地址)。當將所述rPtr和wPtr定義為整數(shù)類型時,在初始化時使rPtr=wPtr = O ;當將所述rPtr和wPtr定義為指針類型時,在初始化時使rPtr和wPtr指向所述環(huán)形緩沖區(qū)的首地址。當然運行的過程中,為了保證數(shù)據(jù)的連續(xù)性和準確性,wPtr必須超前于rptr,且rptr 不能追上wPtr。需要說明的是,本實施例中,既有讀數(shù)據(jù),也有寫數(shù)據(jù)的過程,開始的時候,首先進行的是寫進程,當寫進程進行到一定時候(至少已經(jīng)寫入一個單位的數(shù)據(jù)后),寫進程喚醒等待隊列的讀數(shù)據(jù)進程,但是當寫進程及讀進程均啟動之后,但是讀數(shù)據(jù)與寫數(shù)據(jù)之間沒有嚴格的順序,此處對此不作限制,下面分別詳細說明讀數(shù)據(jù)與寫數(shù)據(jù)的具體過程
寫指針控制單元510接收到數(shù)據(jù)寫請求時,控制寫指針計算出在環(huán)形數(shù)據(jù)緩沖區(qū)當前要寫入數(shù)據(jù)的環(huán)形緩沖區(qū)的起始位置,并讀取外設數(shù)據(jù),從該起始位置開始向所述環(huán)形緩沖區(qū)寫入指定單位個數(shù)據(jù),寫完指定單位個數(shù)據(jù)后寫指針加I。進一步地,使用環(huán)形數(shù)據(jù)緩沖區(qū)首位置的零位置與寫指針wPtr的數(shù)值做求和運算,所述求和運算不是數(shù)學上簡單的相加,這與緩沖區(qū)buffer的數(shù)據(jù)結構有關系,緩沖區(qū) buffer數(shù)據(jù)結構不一樣,算法也不一樣,此處對此不作限制。本實施例中,所述讀指針或寫指針的數(shù)值(即絕對位置)是指相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址零位置實際所表示的數(shù)值,所述絕對位置是指針當前的位置相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址零位置實際所表示的數(shù)值,其大小不定(可能會隨著寫入或讀取次數(shù)一直增加);所述相對位置是指針當前的位置相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址的距離,其大小不會超過緩沖區(qū)的長度。另外,零地址也就是首地址。進一步地,當寫進程進行到一定程度時(此處的程度是根據(jù)實際情況而定,即保證有數(shù)據(jù)可讀的時候),所述寫指針進程會向所述讀指針發(fā)送喚醒信號,喚醒等待列隊中的讀指針讀取數(shù)據(jù),而讀指針只能在被喚醒之后才能讀取數(shù)據(jù)。讀指針控制單元520接收到喚醒信號后,觸發(fā)所述讀指針,第一判斷模塊531判斷所述讀指針的數(shù)值是否小于所述寫指針的數(shù)值,如果是則向所述讀指針控制單元520發(fā)送數(shù)據(jù)讀請求,否則向所述讀指針控制單元520返回無數(shù)據(jù)可讀信息。當接收到數(shù)據(jù)讀請求后,所述讀指針控制單元520控制讀指針計算當前需要讀取的數(shù)據(jù)所在的位置,從該位置開始讀取數(shù)據(jù),讀完后所述讀指針的數(shù)值加I ;其中,當有數(shù)據(jù)到來時,讀指針計算出當前要讀buffer (緩沖區(qū))的起始位置(currReadPtr),如圖6所示的讀指針指示的當前讀取的起始位置,然后讀取外設數(shù)據(jù),從該起始位置開始向buffer (緩沖區(qū))讀指定單位個數(shù)據(jù)如 N (N —般設為I個Buffer的單位長度)個數(shù)據(jù),讀完后寫指針加I。具體地,利用讀指針的數(shù)值與buffer的首地址做求和運算,所述求和運算不是數(shù)學上簡單的加,這個buffer的數(shù)據(jù)結構有關系,buffer數(shù)據(jù)結構不一樣,算法也不一樣,此處對所述算法不作限制。當讀取數(shù)據(jù)后,還對所讀取的數(shù)據(jù)進行處理。其中,可根據(jù)用戶需要來對所讀取的數(shù)據(jù)進行處理, 例如將該數(shù)據(jù)轉化成圖像信號顯示處理,或者僅僅是存儲,此處對此不作限制。當讀指針與寫指針的進程進行到一定階段,就可能會出現(xiàn)讀指針與寫指針出現(xiàn)互斥的問題,例如無數(shù)據(jù)可讀,此為環(huán)形數(shù)據(jù)緩沖區(qū)為空的狀態(tài),又例如,寫指針的絕對位置及相對位置均分別超前所述讀指針的絕對位置及相對位置時,此時為環(huán)形數(shù)據(jù)緩沖區(qū)溢出。因此,需要通過調整讀指針與寫指針來保證讀數(shù)據(jù)與寫數(shù)據(jù)的順利進行。因此,第二判斷模塊532判斷所述環(huán)形數(shù)據(jù)緩沖區(qū)是否異常,如果為是則根據(jù)異常類型向所述調整控制模塊533返回環(huán)形數(shù)據(jù)緩沖區(qū)異常信號,否則向所述調整控制模塊 533返回環(huán)形數(shù)據(jù)緩沖區(qū)正常信號。具體地,所述異常信號包括所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出信號或所述環(huán)形數(shù)據(jù)緩沖區(qū)為空信號,所述環(huán)形數(shù)據(jù)緩沖區(qū)異常類型表現(xiàn)為
當所述寫指針的相對位置等于所述讀指針的相對位置,并且所述所述寫指針的絕對位置等于或超前所述讀指針的絕對位置,則判定所述環(huán)形數(shù)據(jù)緩沖區(qū)為溢出,即來不及讀取數(shù)據(jù),此現(xiàn)象為異常;或者
當所述寫指針的相對位置等于所述讀指針的相對位置,并且所述寫指針的絕對位置與所述讀指針的絕對位置相等,則所述環(huán)形數(shù)據(jù)緩沖區(qū)為空,即此處無數(shù)據(jù)可讀。當所述調整控制模塊533接收到所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出信號后,調整所述讀指針及寫指針的絕對位置,使得所述寫指針超前所述讀指針?;蛘弋斔稣{整控制模塊533 接收到所述環(huán)形數(shù)據(jù)緩沖區(qū)為空信號后,控制所述讀指針進入等待狀態(tài),此時寫進程已經(jīng)處于掛起狀態(tài),而讀進程進入等待狀態(tài)。本實施例中,當判斷需要調整時,可以根據(jù)實際情況,調整寫指針、讀指針及讀與與指針中的任意一種。以調整所述讀指針及寫指針的數(shù)值為例,說明所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出時調整的過程
當寫指針(wPtr)和讀指針(rPtr)相對位置相等,但是寫指針的絕對、位置等于或者超出所述讀指針的絕對位置就說明沒來的及讀走數(shù)據(jù),導致寫指針趕上了讀指針而使得所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出,可能造成之前數(shù)據(jù)被覆蓋掉,這個時候為了保證數(shù)據(jù)連貫性,本實施例中調整讀指針,使得讀指針rPtr = rPtr% BUFFER_NUM (其中讀指針rPtr = rPtr%BUFFER_NUM表示重新給rPtr變量賦值,假設BUFFER_NUM等于8,未執(zhí)行此步驟之前讀指針的數(shù)值(rPtr ) = 17,那么經(jīng)過重新賦值后rPtr = 17%8 = 1,其中%是取余操作,此句執(zhí)行完后,讀指針的數(shù)值rPtr的值就是1,不再是17,因此此時讀指針的數(shù)值大于所述寫指針的數(shù)值,因此環(huán)形數(shù)據(jù)緩沖區(qū)不會溢出,然后將寫指針wPtr指向的相對位置仍舊不變,可保證新數(shù)據(jù)不丟失,即寫指針wPtr = rPtr + BUFFER_NUM,但是數(shù)值上超前于讀指針(rPtr ) 一個周期;可以理解的是寫指針WPtr相對于環(huán)形數(shù)據(jù)緩沖區(qū)首位置的零地址的位置不變,但是數(shù)值上超前讀指針rPtr —周,然后使讀指針rPtr的相對位置超前寫指針wPtr —個單位的長度,即寫指針wPtr僅超前讀指針rPtr —個周期,此時相對位置還是相等,但是為了寫入新數(shù)據(jù),那么就讓讀指針rPtr向前一步,即接著調整讀指針rPtr = rPtr +1,使其在相對位置上超前寫指針wPtr I個單元,此時環(huán)形數(shù)據(jù)緩沖區(qū)不會溢出,同樣是為了數(shù)據(jù)連貫性,這樣可保證之前的數(shù)據(jù)不丟失。需要說明的是,本實施例中,讀數(shù)據(jù)及寫數(shù)據(jù)的進程是可以多次在進行的,調整之后可能還會出現(xiàn)需要調整所述讀指針及寫指針來使得所述環(huán)形數(shù)據(jù)緩沖區(qū)處于正常狀態(tài), 因此,所述調整控制模塊533判斷所述寫指針的絕對位置等于或者超出所述讀指針的絕對位置時,并且所述寫指針的相對位置與所述讀指針的相對位置相等時,向所述賦值模塊534 發(fā)送調整指令,所述賦值模塊534接收到調整指令后,重新對所述讀指針及寫指針賦值,使得所述寫指針的超前所述讀指針,即保證所述寫指針的相對位置等于所述讀指針的相對位置,但是所述寫指針的絕對位置超前或等于所述讀指針的絕對位置。即尚未讀取的數(shù)據(jù)不會在未讀之前被新寫入的數(shù)據(jù)覆蓋,進而使得數(shù)據(jù)不連續(xù)。其中,如何對所述讀指針及寫指針賦值是根據(jù)具體情況而定,此處對此不作限制。需要說明的是,無論讀指針及寫指針的數(shù)值怎么加或減,二者必須保持特定的數(shù)值和位置關系,因為寫指針控制著當前數(shù)據(jù)的寫入位置,而讀指針控制著當前讀取數(shù)據(jù)的位置,必須時刻保持有數(shù)據(jù)可讀,同時要保證要及時讀取數(shù)據(jù),使得數(shù)據(jù)讀取的連貫性,進而保證數(shù)據(jù)讀取的準確性。本實施例中,寫進程在寫完數(shù)據(jù)后會喚醒讀進程;寫進程和讀進程是獨立的進程, 通過讀寫指針、隊列等機制進行sync (同步),寫過程可以由硬件本身提供的中斷或者軟件查詢機制來控制,而讀進程則需要由寫進程控制,并不是每寫一次就會去讀,讀是需要滿足條件,但是寫進程至少已經(jīng)已經(jīng)寫入一個單位長度的數(shù)據(jù)后,才能啟動讀進程;有或者可能會出現(xiàn)寫了 3次了,讀進程還在等待直到讀條件滿足,而讀進程在完成一次讀取操作后,需要由軟件將其設為掛起狀態(tài)也就是休眠狀態(tài),也就是讀進程始終處于被動狀態(tài)。本實施例中,寫進程與讀進程分開執(zhí)行,實時監(jiān)控環(huán)形數(shù)據(jù)緩沖區(qū)的異常,當所述環(huán)形數(shù)據(jù)緩沖區(qū)出現(xiàn)異常時,調整讀指針及寫指針,使得讀數(shù)據(jù)及寫數(shù)據(jù)可以順利進行,避免了讀進程與寫進程同時進行時對對環(huán)形數(shù)據(jù)緩沖區(qū)進行操作而造成的臨界資源訪問異常的問題。進一步提供了數(shù)據(jù)傳輸?shù)木_度。應當理解的是,本發(fā)明的應用不限于上述的舉例,對本領域普通技術人員來說,可以根據(jù)上述說明加以改進或變換,所有這些改進和變換都應屬于本發(fā)明所附權利要求的保護范圍。
權利要求
1 一種用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法,其特征在于,包括步驟A、當有數(shù)據(jù)寫請求時,寫指針計算出在環(huán)形數(shù)據(jù)緩沖區(qū)當前要寫入數(shù)據(jù)的起始位置, 讀取外設數(shù)據(jù),從該起始位置開始向所述環(huán)形緩沖區(qū)寫入數(shù)據(jù),寫完后所述寫指針的數(shù)值加I ;B、當收到讀數(shù)據(jù)請求時,讀指針計算當前需要讀取的數(shù)據(jù)所在的位置,從該位置開始讀取數(shù)據(jù),讀完后所述讀指針的數(shù)值加I ;C、當所述環(huán)形數(shù)據(jù)緩沖區(qū)出現(xiàn)異常,根據(jù)異常類型執(zhí)行相應的操作,其中,所述異常的類型包括所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出或為空。
2.根據(jù)權利要求I所述用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法,其特征在于,所述步驟A之前還包括Al、定義多個緩沖區(qū),其中,所述緩沖區(qū)的個數(shù)與所述環(huán)形數(shù)據(jù)緩沖區(qū)的個數(shù)相等;A2、建立等待列隊;A3、申請至少一個緩沖區(qū)作為環(huán)形數(shù)據(jù)緩沖區(qū),所述緩沖區(qū)的地址單元是連續(xù)的;A4、初始化所述讀指針、寫指針的數(shù)值,使所述讀指針、寫指針的數(shù)值均為O;所述步驟B之前還包括BI、判斷是否收到喚醒信號,如果是,則轉向步驟B2,否則返回等待喚醒信號;B2、判斷當前的讀指針的絕對位置是否小于寫指針的絕對位置,如果判斷結果為是時, 則進入步驟B,否則表示無數(shù)據(jù)可讀,返回所述步驟BI。
3.根據(jù)權利要求I所述用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法,其特征在于,所述步驟C具體包括Cl、當所述寫指針的相對位置超出或等于所述讀指針的相對位置,并且所述寫指針的絕對位置超出所述讀指針的絕對位置,則所述環(huán)形緩沖區(qū)溢出,發(fā)出溢出信號,并進入步驟 C3 ;C2、當所述寫指針的相對位置等于所述讀指針的相對位置,并且所述寫指針的絕對位置與所述讀指針的絕對位置相等,則所述環(huán)形數(shù)據(jù)緩沖區(qū)為空,則返回所述環(huán)形數(shù)據(jù)緩沖區(qū)為空的信號,并進入步驟C4;C3、調整所述讀指針及所述寫指針的絕對位置,使得所述寫指針超前所述讀指針;C4、讀指針進入等待狀態(tài)。
4.根據(jù)權利要求3所述用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法,其特征在于,所述步驟C3之后具體還包括當所述寫指針的絕對位置等于或者超出所述讀指針的絕對位置時,并且所述寫指針的相對位置與所述讀指針的相對位置相等時,分別重新對所述讀指針及寫指針進行調整,使得所述寫指針超前所述讀指針。
5.根據(jù)權利要求I至4任意一項所述用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法,其特征在于,所述讀指針的絕對位置是指所述讀指針相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址零位置實際所表示的數(shù)值;所述寫指針的絕對位置是指所述寫指針相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址零位置實際所表示的數(shù)值;所述讀指針的相對位置是指所述讀指針當前的位置相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址的距離,所述寫指針的相對位置是指所述寫指針當前的位置相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址的距離。
6.一種用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的裝置,其特征在于,包括寫指針控制單元,當有數(shù)據(jù)寫請求時,用于控制寫指針計算出在環(huán)形數(shù)據(jù)緩沖區(qū)當前要寫入數(shù)據(jù)的起始位置,讀取外設數(shù)據(jù),從該起始位置開始向所述環(huán)形緩沖區(qū)寫入數(shù)據(jù),寫完后所述寫指針的數(shù)值加I ;讀指針控制單元,當收到讀數(shù)據(jù)請求時,用于控制讀指針計算當前需要讀取的數(shù)據(jù)所在的位置,從該位置開始讀取數(shù)據(jù),讀完后所述讀指針的數(shù)值加I ;指針調整單元,當所述環(huán)形數(shù)據(jù)緩沖區(qū)出現(xiàn)異常,根據(jù)異常類型執(zhí)行相應的操作,其中,所述異常的類型包括所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出或為空。
7.根據(jù)權利要求6所述用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的裝置,其特征在于,其還包括定義單元,用于定義多個緩沖區(qū),其中,所述緩沖區(qū)的個數(shù)與所述環(huán)形數(shù)據(jù)緩沖區(qū)的個數(shù)相等;列隊建立單元,用于建立等待列隊;緩沖區(qū)申請單元,用于申請至少一個緩沖區(qū)作為環(huán)形數(shù)據(jù)緩沖區(qū),所述緩沖區(qū)的地址單元是連續(xù)的;初始化單元,用于初始化所述讀指針、寫指針的數(shù)值,使所述讀指針、寫指針的數(shù)值均為O。
8.根據(jù)權利要求7所述用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的裝置,其特征在于,所述指針調整單元包括第一判斷模塊,用于判斷所述讀指針是否收到喚醒信號,如果為是,則喚醒所述讀指針,接著并判斷當前的讀指針的絕對位置是否小于寫指針的絕對位置;第二判斷模塊,用于判斷所述環(huán)形數(shù)據(jù)緩沖區(qū)是否異常,根據(jù)異常類型向調整控制模塊發(fā)送相對應的所述環(huán)形數(shù)據(jù)緩沖區(qū)異常信號,其中,所述異常信號包括所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出信號或所述環(huán)形數(shù)據(jù)緩沖區(qū)為空信號;調整控制模塊,當接收到所述環(huán)形數(shù)據(jù)緩沖區(qū)溢出信號時,用于調整所述讀指針及所述寫指針的絕對位置,使得所述寫指針超前所述讀指針;或當接收到所述環(huán)形數(shù)據(jù)緩沖區(qū)為空信號時,用于控制所述讀指針進入等待狀態(tài)。
9.根據(jù)權利要求8所述用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的裝置,其特征在于,所述第二判斷模塊還用于再次判斷所述寫指針的絕對位置是否等于或者超出所述讀指針的絕對位置,并且判斷所述寫指針的相對位置與所述讀指針的相對位置是否相等; 所述指針調整單元還用于當所述寫指針的絕對位置等于或超出所述讀指針的絕對位置時,并且當所述寫指針的相對位置等于所述讀指針的相對位置時,分別重新對所述讀指針及寫指針進行調整,使得所述寫指針超前所述讀指針。
10.根據(jù)權利要求6至9任意一項所述用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的裝置,其特征在于,所述讀指針的絕對位置是指所述讀指針相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址零位置實際所表示的數(shù)值;所述寫指針的絕對位置是指所述寫指針相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址零位置實際所表示的數(shù)值;所述讀指針的相對位置是指所述讀指針當前的位置相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址的距離,所述寫指針的相對位置是指所述寫指針當前的位置相對于所述環(huán)形數(shù)據(jù)緩沖區(qū)首地址的距離。
全文摘要
本發(fā)明公開了一種用環(huán)形數(shù)據(jù)緩沖區(qū)讀寫批量數(shù)據(jù)的方法及裝置,所述方法包括當有數(shù)據(jù)寫請求時,寫指針計算出在環(huán)形數(shù)據(jù)緩沖區(qū)當前要寫入數(shù)據(jù)的起始位置,讀取外設數(shù)據(jù),從該起始位置開始向所述環(huán)形緩沖區(qū)寫入數(shù)據(jù),寫完后寫指針的數(shù)值加1;當收到讀數(shù)據(jù)請求時,讀指針計算當前需要讀取的數(shù)據(jù)所在的位置,從該位置開始讀取數(shù)據(jù),讀完后述讀指針的數(shù)值加1;當環(huán)形數(shù)據(jù)緩沖區(qū)出現(xiàn)異常,根據(jù)異常類型執(zhí)行相應的操作,本發(fā)明中,寫進程與讀進程分開執(zhí)行,監(jiān)控環(huán)形數(shù)據(jù)緩沖區(qū)的異常,當環(huán)形數(shù)據(jù)緩沖區(qū)出現(xiàn)異常時,調整讀指針及寫指針,使得讀數(shù)據(jù)及寫數(shù)據(jù)可以順利進行,保證了數(shù)據(jù)傳輸?shù)男?,進一步提供了數(shù)據(jù)傳輸?shù)木_度。
文檔編號G06F13/16GK102591815SQ20111044436
公開日2012年7月18日 申請日期2011年12月27日 優(yōu)先權日2011年12月27日
發(fā)明者劉亞萍 申請人:Tcl集團股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1