專利名稱:一種在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理技術(shù),特別是涉及一種在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法。
背景技術(shù):
數(shù)字信號處理器(DSP,Digital Signal Processor)通常應(yīng)用于要求對采集到的數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的場合中。例如,在一個(gè)音/視頻的采集系統(tǒng)中,DSP對采集到的音/視頻數(shù)據(jù)進(jìn)行壓縮編碼處理,然后由中央處理單元(CPU,Central Processing Unit)從DSP中讀取數(shù)據(jù),對這些數(shù)據(jù)進(jìn)行后續(xù)處理。在上述應(yīng)用中,DSP是作為CPU的外設(shè),CPU需要首先讀取DSP的數(shù)據(jù),然后將所讀取的數(shù)據(jù)寫入內(nèi)存,然后在內(nèi)存中對數(shù)據(jù)進(jìn)行后續(xù)處理。也就是說,將數(shù)據(jù)從外設(shè)讀取并寫入到內(nèi)存中需要CPU的參與,這樣就會(huì)占用CPU的處理能力。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法,以實(shí)現(xiàn)在不需要CPU參與的情況下,在內(nèi)存和DSP之間傳送數(shù)據(jù),從而節(jié)約CPU的處理能力,提高系統(tǒng)的整體性能。
為了達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的一種在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法,包括A1、判斷數(shù)字信號處理器DSP的上行郵箱是否有需要傳送給內(nèi)存的數(shù)據(jù),如果有則執(zhí)行步驟B1,否則結(jié)束當(dāng)前流程;B1、判斷內(nèi)存是否可寫,如果是,則執(zhí)行步驟C1,否則結(jié)束當(dāng)前流程;C1、從DSP的上行郵箱中讀取數(shù)據(jù),并將所讀取的數(shù)據(jù)寫入到內(nèi)存中。
其中,在DSP的上行郵箱中設(shè)置表示是否有數(shù)據(jù)需要傳送的校驗(yàn)字,步驟A1所述判斷DSP的上行郵箱是否有需要傳送給內(nèi)存的數(shù)據(jù)為判斷上行郵箱的校驗(yàn)字是否為主機(jī)可操作,如果是則認(rèn)為有需要傳送給內(nèi)存的數(shù)據(jù),否則認(rèn)為沒有;在步驟C1之后進(jìn)一步包括將上行郵箱的校驗(yàn)字設(shè)置為主機(jī)不可操作。
其中,在DSP的上行郵箱中設(shè)置表示待傳送數(shù)據(jù)長度的長度字,步驟C1所述從DSP的上行郵箱中讀取數(shù)據(jù)為根據(jù)所述長度字,從DSP的上行郵箱中讀取數(shù)據(jù)。
其中,設(shè)置先入先出FIFO隊(duì)列,步驟C1所述從DSP的上行郵箱中讀取數(shù)據(jù)為從DSP的上行郵箱中讀取數(shù)據(jù)并放入FIFO中;步驟C1所述將所讀取的數(shù)據(jù)寫入到內(nèi)存中為將FIFO中的數(shù)據(jù)寫入內(nèi)存中。
其中,為DSP的上行郵箱設(shè)置上行緩沖區(qū)描述符BD隊(duì)列,以及分別指向上行BD隊(duì)列中BD的BD上行寫指針和BD上行讀指針,步驟B1所述判斷內(nèi)存是否可寫為判斷所述BD上行寫指針指向的上行BD,是否為所述BD上行讀指針指向的上行BD的前一個(gè)上行BD,如果是則認(rèn)為內(nèi)存不可寫,否則認(rèn)為內(nèi)存可寫;步驟C1之后進(jìn)一步包括判斷所述BD上行寫指針是否指向上行BD隊(duì)列中的最后一個(gè)上行BD,如果是則修改所述BD上行寫指針指向上行BD隊(duì)列的第一個(gè)上行BD,否則修改所述BD上行寫指針指向上行BD隊(duì)列的下一個(gè)上行BD。
其中,所述上行BD包括數(shù)據(jù)所在內(nèi)存的地址域和內(nèi)存中數(shù)據(jù)的長度域,步驟C1所述將所讀取的數(shù)據(jù)寫入到內(nèi)存中為根據(jù)BD上行寫指針?biāo)赶虻纳闲蠦D中的數(shù)據(jù)所在內(nèi)存的地址域,將數(shù)據(jù)寫入到內(nèi)存中,并且根據(jù)所寫入的數(shù)據(jù)長度,修改BD上行寫指針?biāo)赶虻纳闲蠦D的內(nèi)存中數(shù)據(jù)的長度域。
其中,在步驟C1之后進(jìn)一步包括判斷是否需要通知中央處理單元CPU處理內(nèi)存中的數(shù)據(jù),如果需要?jiǎng)t通知CPU,否則結(jié)束當(dāng)前流程。
其中,設(shè)置上行錯(cuò)誤信息寄存器,步驟C1進(jìn)一步包括判斷在從DSP的上行郵箱中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到內(nèi)存中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,如果出現(xiàn)則將所述錯(cuò)誤記錄在所述上行錯(cuò)誤信息寄存器中,并通知CPU查詢所述上行錯(cuò)誤信息寄存器。
其中,所述上行BD進(jìn)一步包括出錯(cuò)信息域,步驟C1進(jìn)一步包括判斷在從DSP的上行郵箱中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到內(nèi)存中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,如果出現(xiàn),則將所述錯(cuò)誤記錄在所述上行BD的出錯(cuò)信息域中。
其中,設(shè)置先入先出FIFO隊(duì)列,步驟C1所述從DSP的上行郵箱中讀取數(shù)據(jù)為從DSP的上行郵箱中讀取數(shù)據(jù)并放入FIFO中;步驟C1所述將所讀取的數(shù)據(jù)寫入到內(nèi)存中為將FIFO中的數(shù)據(jù)寫入內(nèi)存中;所述判斷在從DSP的上行郵箱中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到內(nèi)存中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤為判斷是否發(fā)生FIFO滿荷的情況,如果出現(xiàn)則認(rèn)為出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,否則認(rèn)為未出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤。
一種在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法,包括A2、判斷數(shù)字信號處理器DSP的下行郵箱是否可以寫入,如果可以寫入,則執(zhí)行步驟B2,否則結(jié)束當(dāng)前流程;B2、判斷內(nèi)存中是否有需要傳送給DSP的數(shù)據(jù),如果有則執(zhí)行步驟C2,否則結(jié)束當(dāng)前流程;C2、從內(nèi)存中讀取數(shù)據(jù),并將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中。
其中,在DSP的下行郵箱中設(shè)置表示是否可以寫入的校驗(yàn)字,步驟A2所述判斷DSP的下行郵箱是否有需要傳送給內(nèi)存的數(shù)據(jù)為判斷下行郵箱的校驗(yàn)字是否為主機(jī)可操作,如果是則認(rèn)為可以寫入,否則認(rèn)為不可寫入;在步驟C之后進(jìn)一步包括將下行郵箱的校驗(yàn)字設(shè)置為主機(jī)不可操作。
其中,在DSP的下行郵箱中設(shè)置表示已寫入數(shù)據(jù)長度的長度字,步驟C2在所述將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱后進(jìn)一步包括根據(jù)寫入到DSP下行郵箱的數(shù)據(jù)長度,設(shè)置所述長度字。
其中,設(shè)置先入先出FIFO隊(duì)列,步驟C2所述從內(nèi)存中讀取數(shù)據(jù)為從內(nèi)存中讀取數(shù)據(jù)并放入FIFO中;步驟C2所述將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中為將FIFO中的數(shù)據(jù)寫入到DSP的下行郵箱中。
其中,為DSP的下行郵箱設(shè)置下行緩沖區(qū)描述符BD隊(duì)列,以及分別指向下行BD隊(duì)列中BD的BD下行寫指針和BD下行讀指針,步驟B2所述判斷內(nèi)存中是否有需要傳送給DSP的數(shù)據(jù)為判斷所述BD下行寫指針指向的下行BD,是否與所述BD下行讀指針指向下行BD隊(duì)列中的同一個(gè)下行BD,如果是則認(rèn)為內(nèi)存中沒有需要傳送給DSP的數(shù)據(jù),否則認(rèn)為內(nèi)存中有需要傳送給DSP的數(shù)據(jù);步驟C之后進(jìn)一步包括判斷所述BD下行寫指針是否指向下行BD隊(duì)列中的最后一個(gè)下行BD,如果是則修改所述BD下行寫指針指向下行BD隊(duì)列的第一個(gè)下行BD,否則修改所述BD下行寫指針指向下行BD隊(duì)列的下一個(gè)下行BD。
其中,所述下行BD包括數(shù)據(jù)所在內(nèi)存的地址域和內(nèi)存中數(shù)據(jù)的長度域,步驟C2所述從內(nèi)存中讀取數(shù)據(jù)為
按照BD下行讀指針?biāo)赶虻南滦蠦D中所的數(shù)據(jù)所在內(nèi)存的地址域和內(nèi)存中數(shù)據(jù)的長度域,從內(nèi)存中讀取數(shù)據(jù)。
其中,在步驟C2之后進(jìn)一步包括判斷是否需要通知中央處理單元CPU處理內(nèi)存中的數(shù)據(jù),如果需要?jiǎng)t通知CPU,否則結(jié)束當(dāng)前流程。
其中,設(shè)置下行錯(cuò)誤信息寄存器,步驟C2進(jìn)一步包括判斷在從內(nèi)存中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,如果出現(xiàn),則將所述錯(cuò)誤記錄在所述下行錯(cuò)誤信息寄存器中,并通知CPU查詢所述下行錯(cuò)誤信息寄存器。
其中,所述下行BD進(jìn)一步包括出錯(cuò)信息域,步驟C進(jìn)一步包括判斷在從內(nèi)存中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,如果出現(xiàn),則將所述錯(cuò)誤記錄在所述下行BD的出錯(cuò)信息域中。
其中,設(shè)置等待時(shí)長,所述判斷在從內(nèi)存中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤為判斷在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱后,在所述等待時(shí)長內(nèi),是否收到DSP返回的確認(rèn)信息,如果收到則認(rèn)為未出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,否則認(rèn)為出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤。
其中,設(shè)置等待時(shí)長和最大重試次數(shù),所述判斷在從內(nèi)存中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤為D1、判斷在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱后,在所述等待時(shí)長內(nèi),是否收到DSP返回的確認(rèn)信息,如果收到則認(rèn)為未出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,否則執(zhí)行步驟D2;D2、判斷所述向DSP的下行郵箱寫入數(shù)據(jù)的操作所進(jìn)行的次數(shù),是否超過所述最大重試次數(shù),如果超過則認(rèn)為出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,否則再次將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中,返回執(zhí)行步驟D1。
其中,設(shè)置等待時(shí)長和最大重試次數(shù),步驟C2進(jìn)一步包括C21、判斷在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱后,在所述等待時(shí)長內(nèi),是否收到DSP返回的確認(rèn)信息,如果收到則釋放所讀取數(shù)據(jù)占用的FIFO存儲資源,否則執(zhí)行步驟C22;C22、判斷所述向DSP的下行郵箱寫入數(shù)據(jù)的操作所進(jìn)行的次數(shù),是否超過所述最大重試次數(shù),如果超過則釋放所讀取數(shù)據(jù)占用的FIFO存儲資源,否則再次將所讀取數(shù)據(jù)寫入到DSP的下行郵箱中,返回執(zhí)行步驟C21。
采用本發(fā)明所提供的技術(shù)方案,針對DSP內(nèi)部數(shù)據(jù)結(jié)構(gòu)和訪問方式,實(shí)現(xiàn)了在內(nèi)存和DSP之間進(jìn)行數(shù)據(jù)傳送的DMA控制器,從而實(shí)現(xiàn)了用DMA方式訪問DSP數(shù)據(jù),而不再需要CPU的參與。并且,采用本發(fā)明所提供的技術(shù)方案,由于省去了CPU用于數(shù)據(jù)傳輸?shù)奶幚砟芰?,使得CPU可以用更多的處理能力進(jìn)行所述后續(xù)處理,這樣就可以同時(shí)處理多個(gè)DSP,進(jìn)一步提高了系統(tǒng)的性能。
圖1是本發(fā)明提供的在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法所應(yīng)用的系統(tǒng)框圖;圖2(a)是本發(fā)明所提供的在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法中所用到的緩沖區(qū)描述符隊(duì)列示意圖;圖2(b)是本發(fā)明所提供的在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法中所用到的緩沖區(qū)描述符隊(duì)列示意圖;圖3(a)是本發(fā)明提供的在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法在從DSP向內(nèi)存?zhèn)魉蛿?shù)據(jù)時(shí)的流程圖;圖3(b)是本發(fā)明提供的在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法在從DSP向內(nèi)存?zhèn)魉蛿?shù)據(jù)時(shí)的流程圖;
圖4是本發(fā)明提供的在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法在從內(nèi)存向DSP傳送數(shù)據(jù)時(shí)的流程圖。
具體實(shí)施例方式
本發(fā)明的核心思想是利用可編程邏輯器件,在不需要CPU參與的情況下,在內(nèi)存和數(shù)字信號處理器之間進(jìn)行數(shù)據(jù)的傳輸。
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖及具體實(shí)施例對本發(fā)明作進(jìn)一步地詳細(xì)描述。
請參考圖1,圖1是本發(fā)明提供的在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法所應(yīng)用的系統(tǒng)框圖。
由于本發(fā)明所實(shí)現(xiàn)的,是利用DMA的方式訪問DSP數(shù)據(jù)的方法。因此在圖1中用DMA控制器來表示實(shí)現(xiàn)本發(fā)明的技術(shù)方案所需要的硬件平臺。
在圖1中,DMA控制器的一端連接到PCI總線上,CPU和內(nèi)存也連接到PCI總線上。這樣CPU、內(nèi)存和DMA控制器三者之間就可以互相訪問。DMA控制器的另一端連接到DSP專用總線上,例如增強(qiáng)型主機(jī)接口(EHPI,Enhanced Hose-Port Interface)。
所述DMA控制器,如果考慮到應(yīng)用的靈活性,可以用可編程邏輯器件實(shí)現(xiàn),例如場可編程門陣列(FPGA,F(xiàn)ield Programmable Gate Array)或者復(fù)雜可編程邏輯器件(CPLD,Complex Programmable Logic Device),這樣就可以靈活的進(jìn)行配置,比如對所支持的DSP數(shù)量等等進(jìn)行配置;當(dāng)然如果需要大批量生產(chǎn),也可以用特定用途集成電路(ASIC,Application SpecificIntegrated Circuit)實(shí)現(xiàn)。
在以下的敘述中,假設(shè)DMA控制器通過DSP專用總線接一個(gè)DSP;該DSP有8個(gè)雙向數(shù)據(jù)通道;每個(gè)數(shù)據(jù)通道有一個(gè)上行命令郵箱、一個(gè)上行數(shù)據(jù)郵箱、一個(gè)下行命令郵箱、一個(gè)下行數(shù)據(jù)郵箱以及若干個(gè)其他郵箱。其中上行命令郵箱和上行數(shù)據(jù)郵箱統(tǒng)稱為上行郵箱,用于對DSP進(jìn)行讀操作;下行命令郵箱和下行數(shù)據(jù)郵箱統(tǒng)稱為下行郵箱,用于對DSP進(jìn)行寫操作。每個(gè)郵箱包含一個(gè)校驗(yàn)字,用于表示郵箱狀態(tài)。每個(gè)上行郵箱還包括一個(gè)長度字,用于表示郵箱中的數(shù)據(jù)長度。
請參考圖2,圖2是本發(fā)明所提供的在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法中所用到的緩沖區(qū)描述符隊(duì)列示意圖。
DMA工作模式是基于緩沖區(qū)描述符(BD,Buffer Descriptor)實(shí)現(xiàn)的。一個(gè)BD至少包括兩項(xiàng)內(nèi)容內(nèi)存中數(shù)據(jù)的長度和數(shù)據(jù)所在內(nèi)存的地址,由這兩項(xiàng)內(nèi)容就可以唯一確定內(nèi)存中的一塊區(qū)域。BD本身也是存放在內(nèi)存中的。如果一個(gè)BD所確定的數(shù)據(jù)區(qū)域有數(shù)據(jù),則稱該BD為工作BD,如果一個(gè)BD所確定的數(shù)據(jù)區(qū)域被釋放,則稱該BD為空閑BD。
對于DMA控制器來說,首先需要根據(jù)初始化時(shí)由CPU提供的BD地址,從內(nèi)存中讀取BD。如果是向內(nèi)存寫入數(shù)據(jù),則將數(shù)據(jù)寫入到BD所記載的數(shù)據(jù)所在內(nèi)存的地址,并設(shè)置BD中的內(nèi)存中數(shù)據(jù)的長度;如果是從內(nèi)存讀取數(shù)據(jù),則根據(jù)BD所記載的數(shù)據(jù)所在內(nèi)存的地址和內(nèi)存中數(shù)據(jù)的長度進(jìn)行讀取。對于CPU來說,也需要記錄BD地址,然后在讀寫內(nèi)存的時(shí)候采用跟DMA控制器類似的方法。
在本發(fā)明中,對于DSP的每個(gè)通道的四個(gè)郵箱,各設(shè)置一個(gè)BD隊(duì)列和兩個(gè)BD指針。為上行郵箱設(shè)置的BD隊(duì)列為上行BD隊(duì)列,相應(yīng)的BD指針為BD上行寫指針和BD上行讀指針,這三者用于從DSP向內(nèi)存?zhèn)魉蛿?shù)據(jù);為下行郵箱設(shè)置的BD隊(duì)列為下行BD隊(duì)列,相應(yīng)的BD指針為BD下行寫指針以和BD下行讀指針,這三者用于從內(nèi)存向DSP傳送數(shù)據(jù)。
BD上行寫指針和BD上行讀指針存放在DMA控制器中。其中,BD上行寫指針表示DMA控制器已經(jīng)處理完畢的上行BD,DMA控制器可以對BD上行寫指針進(jìn)行讀寫操作,而CPU只能對BD上行寫指針進(jìn)行讀操作;BD上行讀指針表示CPU將要處理的下一個(gè)BD,CPU可以對BD上行讀指針進(jìn)行讀寫操作,而DMA控制器只能對BD上行讀指針進(jìn)行讀操作。
BD下行寫指針和BD下行讀指針也存放在DMA控制器。其中,BD下行寫指針表示CPU將要處理的下一個(gè)BD,CPU可以對BD下行寫指針進(jìn)行讀寫操作,而DMA控制器只能對BD下行寫指針進(jìn)行讀操作;BD下行讀指針表示DMA控制器將要處理的下一個(gè)BD,DMA控制器可以對BD下行讀指針進(jìn)行讀寫操作,而CPU只能對BD下行讀指針進(jìn)行讀操作。
圖2(a)表示了本發(fā)明中為DSP數(shù)據(jù)通道設(shè)置的上行BD隊(duì)列以及對應(yīng)的BD上行讀指針和BD上行寫指針的示意圖。在圖2(a)中,BD上行寫指針指向上行BD2,說明DMA控制器已經(jīng)處理完上行BD2,將要處理的下一個(gè)上行BD為上行BD3。也就是說DMA控制器向內(nèi)存中寫入數(shù)據(jù)時(shí),會(huì)將數(shù)據(jù)寫入到上行BD3所記載的數(shù)據(jù)所在內(nèi)存的地址,并設(shè)置上行BD3中的內(nèi)存中數(shù)據(jù)的長度,然后將BD上行寫指針設(shè)置為指向上行BD3。這樣上行BD3就從空閑BD轉(zhuǎn)為了工作BD。
在圖2(a)中,BD上行讀指針指向上行BD4,說明CPU將要處理的下一個(gè)上行BD為上行BD4。也就是說,CPU從內(nèi)存讀取數(shù)據(jù)時(shí),會(huì)根據(jù)上行BD4所記載的數(shù)據(jù)所在內(nèi)存的地址和內(nèi)存中數(shù)據(jù)的長度進(jìn)行讀取,然后將BD上行讀指針設(shè)置為指向上行BD5,并且釋放由上行BD4所確定的內(nèi)存區(qū)域。這樣上行BD4就從工作BD轉(zhuǎn)為了空閑BD。
圖2(b)表示了本發(fā)明中為DSP數(shù)據(jù)通道設(shè)置的下行BD隊(duì)列以及對應(yīng)的BD下行讀指針和BD下行寫指針的示意圖。在圖2(b)中,BD下行寫指針指向下行BD4,說明CPU將要處理的下一個(gè)下行BD為下行BD4。也就是說CPU向內(nèi)存中寫入數(shù)據(jù)時(shí),會(huì)將數(shù)據(jù)寫入到下行BD4所記載的數(shù)據(jù)所在內(nèi)存的地址,并設(shè)置下行BD4中的內(nèi)存中數(shù)據(jù)的長度,然后將BD下行寫指針設(shè)置為指向下行BD5。這樣下行BD4就從空閑BD轉(zhuǎn)為了工作BD。
在圖2(b)中,BD下行讀指針指向下行BD2,說明DMA控制器將要處理的下一個(gè)下行BD為下行BD2。也就是說,DMA控制器從內(nèi)存讀取數(shù)據(jù)時(shí),會(huì)根據(jù)下行BD2所記載的數(shù)據(jù)所在內(nèi)存的地址和內(nèi)存中數(shù)據(jù)的長度進(jìn)行讀取,然后將BD下行讀指針設(shè)置為指向下行BD3,并且釋放由下行BD2所確定的內(nèi)存區(qū)域。這樣下行BD2就從工作BD轉(zhuǎn)為了空閑BD。
如上所述,每個(gè)上行郵箱都有一個(gè)上行BD隊(duì)列,每個(gè)下行郵箱都有一個(gè)下行BD隊(duì)列。一般來說,CPU會(huì)在內(nèi)存中的指定一塊存儲區(qū)域,存放所有的上行BD隊(duì)列。并且,所有上行BD隊(duì)列中所包括的上行BD數(shù)目也是一樣的,也就是說所有上行BD隊(duì)列長度是一樣的。這樣,只要確定了所述存儲區(qū)域的首地址以及上行BD隊(duì)列長度,就可以根據(jù)通道號,計(jì)算出當(dāng)前上行郵箱的上行BD隊(duì)列首地址。例如,假設(shè)所述存儲區(qū)域的首地址是1000,每個(gè)上行BD隊(duì)列的長度為100,則通道0的兩個(gè)上行郵箱所對應(yīng)的上行BD隊(duì)列首地址分別為1000和1100,通道1的兩個(gè)上行郵箱所對應(yīng)的上行BD隊(duì)列首地址分別為1200和1300,通道2的兩個(gè)上行郵箱所對應(yīng)的上行BD隊(duì)列首地址分別為1400和1500,依此類推。
對于下行BD隊(duì)列也作類似處理。在系統(tǒng)初始化的時(shí)候,CPU會(huì)將存放所有通道的上行BD隊(duì)列的存儲區(qū)域的首地址以及上行BD隊(duì)列的長度通知DMA控制器;CPU也會(huì)將存放所有通道的下行BD隊(duì)列的存儲區(qū)域的首地址以及下行BD隊(duì)列的長度通知DMA控制器。
而對于每個(gè)通道的四個(gè)BD指針,也可以按照類似的方法保存在DMA控制器中。在系統(tǒng)初始化的時(shí)候,CPU會(huì)設(shè)置DMA控制器中存放所有通道的BD指針的存儲區(qū)域。
請參考圖3,圖3是本發(fā)明提供的在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法在從DSP向內(nèi)存?zhèn)魉蛿?shù)據(jù)時(shí),DMA控制器的處理流程圖。由于在數(shù)據(jù)傳送時(shí),對上行數(shù)據(jù)郵箱和上行命令郵箱的處理類似,因此可以將DSP的8個(gè)通道的8個(gè)上行數(shù)據(jù)郵箱和8個(gè)上行命令郵箱,總共16個(gè)上行郵箱統(tǒng)一編號進(jìn)行處理,例如通道0的上行數(shù)據(jù)郵箱為0號上行郵箱,通道0的上行命令郵箱為1號上行郵箱;通道1的上行數(shù)據(jù)郵箱為2號上行郵箱,通道1的上行命令郵箱為3號上行郵箱,依此類推。
步驟U01DMA控制器接收DSP中斷。
步驟U02將DSP的所有上行郵箱作為未處理上行郵箱。
如前所述,DSP有16個(gè)上行郵箱。DSP在需要向內(nèi)存發(fā)送數(shù)據(jù)時(shí),會(huì)選擇其中的一個(gè)或超過一個(gè)上行郵箱,將所要發(fā)送的數(shù)據(jù)放在被選擇上行郵箱的上行郵箱中,然后向DMA控制器發(fā)送一個(gè)中斷。但是DMA控制器并不知道DSP采用哪個(gè)或哪幾個(gè)上行郵箱進(jìn)行發(fā)送,因此在收到DSP產(chǎn)生的中斷后,需要將DSP的所有上行郵箱遍歷一遍。
步驟U03從未處理上行郵箱中取一個(gè)作為當(dāng)前上行郵箱。
步驟U04將當(dāng)前上行郵箱標(biāo)記為已處理上行郵箱。
步驟U05判斷當(dāng)前上行郵箱的校驗(yàn)字是否為主機(jī)可操作,如果是則執(zhí)行步驟U08,否則執(zhí)行步驟U06。
如前所述,每個(gè)郵箱的首地址是一個(gè)校驗(yàn)字,用于表示郵箱的狀態(tài)。對于上行郵箱來說,就是表示該郵箱中是否存放了DSP需要發(fā)送給內(nèi)存的數(shù)據(jù)。DSP在將要發(fā)送給內(nèi)存的數(shù)據(jù)放在一個(gè)上行郵箱內(nèi)后,會(huì)將所述上行郵箱的校驗(yàn)字設(shè)置為主機(jī)可操作。
DMA控制器在發(fā)現(xiàn)某個(gè)上行郵箱的校驗(yàn)字為主機(jī)可操作后,就確認(rèn)該郵箱中存放了DSP要發(fā)送給內(nèi)存的數(shù)據(jù)。
步驟U06判斷是否DSP的所有上行郵箱均為已處理上行郵箱,如果是則執(zhí)行步驟U07,否則返回執(zhí)行步驟U03。
步驟U07結(jié)束對本次中斷的處理流程,等待接收新的DSP中斷。
步驟U08判斷內(nèi)存是否可寫,如果可寫則執(zhí)行步驟U09,否則返回執(zhí)行步驟U03。
如果內(nèi)存不可寫,則終止對當(dāng)前上行郵箱的處理,處理下一個(gè)上行郵箱。
這里所說的判斷內(nèi)存是否可寫,就是判斷是否能通過PCI總線向內(nèi)存發(fā)起DMA寫操作。根據(jù)圖2中對上行BD隊(duì)列以及BD上行寫指針和BD上行讀指針的描述,DMA每次向內(nèi)存中寫入數(shù)據(jù),會(huì)將上行BD隊(duì)列中的一個(gè)空閑BD轉(zhuǎn)換成工作BD;而CPU每次從內(nèi)存中讀取數(shù)據(jù),會(huì)將上行BD隊(duì)列中的一個(gè)工作BD轉(zhuǎn)換成空閑BD。但是,由于DMA控制器向內(nèi)存寫數(shù)據(jù)和CPU從內(nèi)存讀數(shù)據(jù)是不同步的,因此有可能出現(xiàn)與當(dāng)前上行郵箱對應(yīng)的上行BD隊(duì)列中沒有空閑BD的情況,這時(shí),DMA控制器就無法向內(nèi)存中寫入數(shù)據(jù)。
DMA控制器判斷內(nèi)存是否可寫的方法是判斷所述BD上行寫指針指向的上行BD,是否為所述BD上行讀指針指向的上行BD的前一個(gè)上行BD,如果是則認(rèn)為內(nèi)存不可寫,否則認(rèn)為內(nèi)存可寫。
步驟U09根據(jù)當(dāng)前上行郵箱的長度字,從郵箱中讀取數(shù)據(jù)放入自身的先入先出(FIFO,F(xiàn)irst In First Out)隊(duì)列中。
DSP將要向內(nèi)存?zhèn)魉偷臄?shù)據(jù)放入郵箱后,不僅會(huì)設(shè)置郵箱的校驗(yàn)字為主機(jī)可操作,還會(huì)設(shè)置郵箱的長度字。
步驟U10從對應(yīng)于當(dāng)前上行郵箱的上行BD隊(duì)列中,按照對應(yīng)于當(dāng)前上行郵箱的BD上行寫指針讀取上行BD。
步驟U11按照所讀取上行BD中的記載的數(shù)據(jù)所在內(nèi)存的地址,將自身FIFO中的數(shù)據(jù)寫入到內(nèi)存中,并且修改所讀取上行BD的內(nèi)存中數(shù)據(jù)的長度。
需要說明的是,每個(gè)BD所確定的區(qū)域的存儲容量,應(yīng)該不小于DSP的上行郵箱所能存放的最大數(shù)據(jù)長度。
步驟U12修改所讀取上行BD的附加信息。
可以在上行BD中設(shè)置一些附加信息,比如當(dāng)前上行郵箱的上行郵箱號,或者寫入內(nèi)存的數(shù)據(jù)是從當(dāng)前上行數(shù)據(jù)郵箱還是上行命令郵箱所讀取的等等。
步驟U13將當(dāng)前上行郵箱的校驗(yàn)字設(shè)為主機(jī)不可操作。
DSP在需要向內(nèi)存?zhèn)魉蛿?shù)據(jù)的時(shí)候,也會(huì)查詢所有上行郵箱的校驗(yàn)字,只有校驗(yàn)字為主機(jī)不可操作的郵箱,才會(huì)被DSP用來向內(nèi)存?zhèn)魉彤?dāng)前數(shù)據(jù)。
步驟U14判斷BD上行寫指針是否到達(dá)與當(dāng)前上行郵箱對應(yīng)的上行BD隊(duì)列的最大值,如果是則執(zhí)行步驟U15,否則執(zhí)行步驟U16。
步驟U15令BD上行寫指針指向與當(dāng)前上行郵箱對應(yīng)的上行BD隊(duì)列頭,返回執(zhí)行步驟U03。
步驟U16將DB上行寫指針指向與當(dāng)前上行郵箱對應(yīng)的上行BD隊(duì)列中下一個(gè)BD,然后返回執(zhí)行步驟U03。
在圖2中,如果在執(zhí)行步驟U14時(shí),BD上行寫指針當(dāng)前指向BD4,則執(zhí)行步驟U15,即令BD上行寫指針指向上行BD1;如果在執(zhí)行步驟U14時(shí),BD上行寫指針當(dāng)前指向BD2,則執(zhí)行步驟U16,即令BD上行寫指針指向上行BD3。
在實(shí)際情況中,還可以進(jìn)一步在DMA控制器中設(shè)置中斷門限和中斷周期,然后采用中斷計(jì)數(shù)和中斷定時(shí)兩種方式通知CPU處理內(nèi)存中的數(shù)據(jù)。DMA控制器對收到的DSP中斷進(jìn)行計(jì)數(shù),當(dāng)中斷數(shù)達(dá)到所述中斷門限時(shí),通知CPU處理內(nèi)存中的數(shù)據(jù);或者DMA控制器進(jìn)行計(jì)時(shí),每次到達(dá)中斷周期后通知CPU處理內(nèi)存中的數(shù)據(jù)。這兩種中斷方式同時(shí)工作,一種方式通知CPU處理內(nèi)存中的數(shù)據(jù)后,要將另一種方式清零,從而避免重復(fù)通知CPU。也就是說,不管是中斷計(jì)數(shù)到達(dá)中斷門限,還是中斷計(jì)時(shí)到達(dá)中斷周期,DMA控制器在通知CPU處理內(nèi)存中的數(shù)據(jù)時(shí),還要將中斷計(jì)數(shù)和中斷計(jì)時(shí)全部清零。所述中斷門限和中斷周期可由CPU設(shè)置。當(dāng)然,作為一種替代方案,也可以每次將一個(gè)上行郵箱中的數(shù)據(jù)寫入內(nèi)存就進(jìn)行一次計(jì)數(shù)。
如果在執(zhí)行步驟U01到步驟U16的過程中,DMA控制器收到CPU所發(fā)出的停止向內(nèi)存進(jìn)行DMA寫入的指令,則DMA控制器并不是立即終止對內(nèi)存進(jìn)行DMA寫入。如果DMA控制器當(dāng)前正在從DSP中讀取數(shù)據(jù)到自身FIFO,則首先DMA控制器要將當(dāng)前通道的數(shù)據(jù)全部讀取到自身FIFO,接下來將FIFO中的數(shù)據(jù)全部DMA寫入到內(nèi)存中,然后才結(jié)束對內(nèi)存的DMA操作。
在上行BD中可以進(jìn)一步設(shè)置出錯(cuò)信息,用來記錄在從DSP向內(nèi)存?zhèn)魉蛿?shù)據(jù)時(shí)出現(xiàn)的數(shù)據(jù)傳輸錯(cuò)誤的情況。例如,在從DSP的當(dāng)前上行郵箱讀出數(shù)據(jù)時(shí),根據(jù)當(dāng)前上行郵箱的長度字,確定所要讀取的數(shù)據(jù)為100字節(jié),但是實(shí)際上卻只讀出了50字節(jié)。在這些情況下,DMA控制器可以就可以修改當(dāng)前上行BD的錯(cuò)誤信息。在上行BD中如何設(shè)置出錯(cuò)信息是由CPU和DMA控制器實(shí)現(xiàn)約定的,因此CPU在讀取上行BD的時(shí)候,就會(huì)處理所述出錯(cuò)信息。
同時(shí),還可以進(jìn)一步在FPGA內(nèi)部設(shè)置上行錯(cuò)誤信息寄存器,同樣用來記錄在從DSP向內(nèi)存?zhèn)魉蛿?shù)據(jù)時(shí)出現(xiàn)的訪問DSP錯(cuò)誤的情況。DMA控制器在修改所述上行錯(cuò)誤信息寄存器后,還可以通知CPU來查詢所述上行錯(cuò)誤信息寄存器。所述上行BD中的錯(cuò)誤信息和FPGA內(nèi)部的上行錯(cuò)誤信息寄存器可以只設(shè)置一個(gè)。
在步驟U09中,DMA控制器先將DSP的數(shù)據(jù)讀入到自身的FIFO;然后在步驟U10中,DMA控制器需要從內(nèi)存中讀取上行BD。實(shí)際上,在DMA控制器開始從DSP讀取數(shù)據(jù)到自身FIFO的同時(shí),DMA控制器就讀取上行BD,并且將已經(jīng)讀到FIFO中的數(shù)據(jù)寫入到所讀取的上行BD所確定的存儲區(qū)域。
DMA訪問內(nèi)存時(shí)通過PCI總線進(jìn)行的,使用PCI總線需要先向PCI總線控制器申請,在得到許可后才能使用PCI總線。這樣就有可能出現(xiàn)這樣的情況DMA控制器在讀取數(shù)據(jù)到自身FIFO后,卻一直申請不到PCI總線來將FIFO中的數(shù)據(jù)寫入內(nèi)存。這樣,F(xiàn)IFO隊(duì)列中的數(shù)據(jù)只進(jìn)不出,最終造成FIFO滿荷的情況,也就是說FIFO的存儲資源全部被占用。在對實(shí)時(shí)性要求很高的應(yīng)用中,為了避免耽誤后續(xù)數(shù)據(jù)的處理,如果出現(xiàn)FIFO滿荷的情況,DMA控制器可以釋放最先進(jìn)入FIFO的數(shù)據(jù)所占用的FIFO存儲資源,也就是丟棄最先進(jìn)入FIFO的數(shù)據(jù)。這種情況可以看作是在從DSP向內(nèi)存?zhèn)魉蛿?shù)據(jù)時(shí)出現(xiàn)的數(shù)據(jù)傳輸錯(cuò)誤的一種情況。
DMA控制器在丟棄數(shù)據(jù)的同時(shí),應(yīng)該通知CPU發(fā)生了數(shù)據(jù)丟失的情況。所述通知CPU發(fā)生了數(shù)據(jù)丟失的情況,可以是修改所述上行錯(cuò)誤信息寄存器,然后通知CPU來查詢所述上行錯(cuò)誤信息寄存器。
請參考圖4,圖4是本發(fā)明提供的在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法在從內(nèi)存向DSP傳送數(shù)據(jù)時(shí)的流程圖。由于在數(shù)據(jù)傳送時(shí),對下行數(shù)據(jù)郵箱和下行命令郵箱的處理類似,因此可以將DSP的8個(gè)通道的8個(gè)下行數(shù)據(jù)郵箱和8個(gè)下行命令郵箱,總共16個(gè)下行郵箱統(tǒng)一編號進(jìn)行處理,例如通道0的下行數(shù)據(jù)郵箱為0號下行郵箱,通道0的下行命令郵箱為1號下行郵箱;通道1的下行數(shù)據(jù)郵箱為2號下行郵箱,通道1的下行命令郵箱為3號下行郵箱,依此類推。
對于從內(nèi)存向DSP傳送數(shù)據(jù)的情況,本發(fā)明采用輪詢的方式,即由DMA控制器主動(dòng)的去檢查DSP的各個(gè)下行郵箱是否可以寫入,如果當(dāng)前下行郵箱可以寫入,則進(jìn)一步判斷當(dāng)前時(shí)刻內(nèi)存中是否有需要傳送給當(dāng)前郵箱的數(shù)據(jù),如果有則發(fā)起DMA讀操作,通過PCI總線從內(nèi)存中讀出數(shù)據(jù),并且寫入當(dāng)前郵箱。以下步驟為輪詢一個(gè)下行郵箱時(shí)的處理流程。
步驟V01判斷當(dāng)前下行郵箱的校驗(yàn)字是否為主機(jī)可操作,如果是則執(zhí)行步驟V02,否則執(zhí)行步驟V03。
在DSP內(nèi)部,如果可以通過某個(gè)下行郵箱接收數(shù)據(jù),則將該下行郵箱的校驗(yàn)字設(shè)為主機(jī)可操作。
步驟V02判斷內(nèi)存是否可讀,如果可讀則執(zhí)行步驟V04,否則執(zhí)行步驟V03。
這里所說的判斷內(nèi)存是否可讀,就是判斷是否能通過PCI總線向內(nèi)存發(fā)起DMA讀操作。根據(jù)圖2中對下行BD隊(duì)列以及BD下行寫指針和BD下行讀指針的描述,CPU每次向內(nèi)存中寫入需要傳送給DSP的數(shù)據(jù),會(huì)將下行BD隊(duì)列中的一個(gè)空閑BD轉(zhuǎn)換成工作BD;而DMA控制器每次從內(nèi)存中讀取數(shù)據(jù),會(huì)將下行BD隊(duì)列中的一個(gè)工作BD轉(zhuǎn)換成空閑BD。但是,由于CPU向內(nèi)存寫數(shù)據(jù)和DMA控制器從內(nèi)存讀數(shù)據(jù)是不同步的,因此有可能出現(xiàn)與當(dāng)前下行郵箱對應(yīng)的下行BD隊(duì)列中沒有工作BD的情況,也就是說內(nèi)存中沒有需要向當(dāng)前下行郵箱寫入的數(shù)據(jù)。這時(shí),DMA控制器就無法從內(nèi)存中讀取數(shù)據(jù)。
DMA控制器判斷內(nèi)存是否可讀的方法是判斷所述BD下行寫指針與所述BD下行讀指針是否指向同一個(gè)下行BD,如果是則認(rèn)為內(nèi)存不可讀,否則認(rèn)為內(nèi)存可讀。
步驟V03結(jié)束對當(dāng)前下行郵箱的處理。
步驟V04從對應(yīng)于當(dāng)前下行郵箱的下行BD隊(duì)列中,按照對應(yīng)于當(dāng)前下行郵箱的BD下行讀指針讀取下行BD。
步驟V05按照所讀取下行BD中的記載的數(shù)據(jù)所在內(nèi)存的地址以及內(nèi)存中數(shù)據(jù)的長度,從內(nèi)存中讀取數(shù)據(jù)到自身的FIFO中。
所讀取的下行BD中記載的數(shù)據(jù)所在內(nèi)存的地址是在系統(tǒng)初始化的時(shí)候設(shè)定的,所讀取的下行BD中記載的內(nèi)存中數(shù)據(jù)的長度是在該下行BD從空閑BD變?yōu)楣ぷ鰾D時(shí)由CPU設(shè)定的。除了設(shè)定下行BD中所記載的內(nèi)存中數(shù)據(jù)的長度,CPU還需要在傳送給DSP的數(shù)據(jù)的最開始,用長度字表明所傳送數(shù)據(jù)的長度。
如前所述,每個(gè)工作BD確定了一塊內(nèi)存區(qū)域,下行BD還可以記載要將所述內(nèi)存區(qū)域中的數(shù)據(jù)寫入到DSP的下行郵箱還是下行命令郵箱。需要說明的是,CPU在將要傳送給DSP的數(shù)據(jù)寫入下行BD所確定的存儲區(qū)域時(shí),所述要傳送給DSP的數(shù)據(jù)的長度不能超過DSP下行郵箱所能存放數(shù)據(jù)的最大長度。
步驟V06將自身FIFO中的數(shù)據(jù)寫入到當(dāng)前下行郵箱的數(shù)據(jù)郵箱。
步驟V05和步驟V06實(shí)際上是同時(shí)進(jìn)行的。
步驟V07設(shè)置當(dāng)前下行郵箱的校驗(yàn)字為主機(jī)不可操作。
在DSP內(nèi)部,DSP也會(huì)對所有下行郵箱進(jìn)行輪詢,如果發(fā)現(xiàn)某個(gè)郵箱的校驗(yàn)字為主機(jī)不可操作,則說明該郵箱中有需要DSP進(jìn)行處理的數(shù)據(jù)。DSP會(huì)進(jìn)一步根據(jù)郵箱中數(shù)據(jù)最開始的長度字,確定該郵箱中需要DSP進(jìn)行處理的數(shù)據(jù)長度。
當(dāng)然,也可以在DSP的下行郵箱內(nèi)部設(shè)置長度字。這樣,在對步驟V05的描述中,CPU在傳送給DSP的數(shù)據(jù)的最開始用長度字表明所傳送數(shù)據(jù)的長度,這個(gè)過程就可以省略。但是DMA控制器在將數(shù)據(jù)寫入下行郵箱后,需要設(shè)置所述下行郵箱內(nèi)部的長度字。同時(shí),DSP也不是根據(jù)郵箱中數(shù)據(jù)最開始的長度字來確定需要DSP進(jìn)行處理的數(shù)據(jù)長度,而是根據(jù)所述下行郵箱內(nèi)部的長度字來確定需要DSP進(jìn)行處理的數(shù)據(jù)長度。
步驟V08判斷BD下行讀指針是否到達(dá)與當(dāng)前下行郵箱對應(yīng)的下行BD隊(duì)列的最大值,如果是則執(zhí)行步驟V09,否則執(zhí)行步驟V10。
步驟V09令BD下行讀指針指向與當(dāng)前下行郵箱對應(yīng)的下行BD隊(duì)列頭,結(jié)束對當(dāng)前下行郵箱的處理。
步驟V10將DB下行讀指針指向與當(dāng)前下行郵箱對應(yīng)的下行BD隊(duì)列中下一個(gè)下行BD,結(jié)束對當(dāng)前下行郵箱的處理。
在實(shí)際情況中,也可以進(jìn)一步在DMA控制器中設(shè)置下行郵箱門限和處理周期,然后采用下行郵箱計(jì)數(shù)和處理定時(shí)兩種方式通知CPU處理內(nèi)存中的數(shù)據(jù)。DMA控制器對執(zhí)行了寫入操作的DSP下行郵箱數(shù)進(jìn)行計(jì)數(shù),當(dāng)下行郵箱數(shù)達(dá)到所述下行郵箱門限時(shí),通知CPU處理內(nèi)存中的數(shù)據(jù);或者DMA控制器進(jìn)行計(jì)時(shí),每次到達(dá)處理周期后通知CPU處理內(nèi)存中的數(shù)據(jù)。這兩種方式同時(shí)工作,一種方式通知CPU處理內(nèi)存中的數(shù)據(jù)后,要將另一種方式清零,從而避免重復(fù)通知CPU。也就是說,不管是下行郵箱計(jì)數(shù)到達(dá)下行郵箱門限,還是處理計(jì)時(shí)到達(dá)處理周期,DMA控制器在通知CPU處理內(nèi)存中的數(shù)據(jù)時(shí),還要將下行郵箱計(jì)數(shù)和處理計(jì)時(shí)全部清零。所述下行郵箱門限和處理周期可由CPU設(shè)置。
如果在執(zhí)行步驟V01到步驟V10的過程中,DMA控制器收到CPU所發(fā)出的停止從內(nèi)存進(jìn)行DMA讀出的指令,則DMA控制器也不是立即停止在對內(nèi)存進(jìn)行DMA讀出。如果DMA控制器當(dāng)前正在從內(nèi)存中讀取數(shù)據(jù)到自身的FIFO中,則首先DMA控制器需要將當(dāng)前下行BD所表示的所有數(shù)據(jù)讀取到自身FIFO,然后才結(jié)束從內(nèi)存進(jìn)行DMA讀出;接下來DMA控制器還需要將FIFO中的數(shù)據(jù)全部寫入到DSP的下行郵箱中。
在下行BD中也可以進(jìn)一步設(shè)置出錯(cuò)信息,用來記錄在從內(nèi)存向DSP傳送數(shù)據(jù)時(shí)出現(xiàn)的數(shù)據(jù)傳輸錯(cuò)誤的情況。例如,DMA控制器根據(jù)當(dāng)前BD,從內(nèi)存中讀取了100字節(jié)的數(shù)據(jù),但是在向DSP的當(dāng)前下行郵箱寫入數(shù)據(jù)時(shí),卻只寫入了50字節(jié)的數(shù)據(jù)。在這些情況下,DMA控制器可以就可以修改當(dāng)前下行BD的錯(cuò)誤信息。
同時(shí),還可以進(jìn)一步在FPGA內(nèi)部設(shè)置下行錯(cuò)誤信息寄存器,同樣用來記錄在從DSP向內(nèi)存?zhèn)魉蛿?shù)據(jù)時(shí)出現(xiàn)的訪問DSP錯(cuò)誤的情況。DMA控制器在修改所述下行錯(cuò)誤信息寄存器后,還可以通知CPU來查詢所述下行錯(cuò)誤信息寄存器。所述下行BD中的錯(cuò)誤信息和FPGA內(nèi)部的下行錯(cuò)誤信息寄存器可以只設(shè)置一個(gè)。
在步驟V05中,DMA控制器先將內(nèi)存的數(shù)據(jù)讀入到自身的FIFO;然后在步驟V06中,DMA控制器將FIFO中的數(shù)據(jù)寫入DSP的當(dāng)前下行郵箱。在本發(fā)明中,為了提高向DSP寫入數(shù)據(jù)時(shí)的可靠性,在DMA控制器向DSP的當(dāng)前下行郵箱寫完待寫入數(shù)據(jù)后,需要DSP向DMA控制器返回確認(rèn)信息。如果DMA控制器收到確認(rèn)信息,則釋放待寫入數(shù)據(jù)所占用的FIFO存儲空間;如果DMA控制器向DSP寫完數(shù)據(jù)后,在預(yù)先設(shè)定的等待時(shí)長內(nèi)沒有收到DSP返回的確認(rèn)信息,就再次嘗試向DSP的當(dāng)前下行郵箱寫入待寫入數(shù)據(jù)。
但是在實(shí)際應(yīng)用中,尤其是在對實(shí)時(shí)性要求很高的應(yīng)用中,不可能無限制的重復(fù)嘗試向DSP的當(dāng)前下行郵箱中寫入數(shù)據(jù)。這時(shí)可以設(shè)置最大重試次數(shù),DMA控制器重復(fù)向DSP的當(dāng)前下行郵箱寫入數(shù)據(jù)的次數(shù)超過所述最大重試次數(shù)時(shí),釋放待寫入當(dāng)前下行郵箱的數(shù)據(jù)占用的FIFO存儲資源,同時(shí)通知CPU發(fā)生了數(shù)據(jù)丟失的情況。所述通知CPU發(fā)生了數(shù)據(jù)丟失的情況,可以是修改所述下行錯(cuò)誤信息寄存器,然后通知CPU來查詢所述下行錯(cuò)誤信息寄存器。接下來,DMA控制器不再執(zhí)行步驟V07到步驟V10,而是直接輪詢下一個(gè)下行郵箱。這種情況也可以看作是在從DSP向內(nèi)存?zhèn)魉蛿?shù)據(jù)時(shí)出現(xiàn)的數(shù)據(jù)傳輸錯(cuò)誤的一種情況。
當(dāng)然,作為一種替代方案,DMA控制器在預(yù)先設(shè)定的等待時(shí)長內(nèi)沒有收到DSP返回的確認(rèn)信息,就直接釋放待寫入當(dāng)前下行郵箱的數(shù)據(jù)占用的FIFO存儲資源,并通知CPU發(fā)生了數(shù)據(jù)丟失的情況,而不再重試將待寫入數(shù)據(jù)寫入CPU的下行郵箱。
在步驟V01到步驟V10所述的流程中,實(shí)際上是由DMA控制器主動(dòng)的去檢查DSP的各個(gè)下行郵箱是否可以寫入,如果當(dāng)前下行郵箱可以寫入,則進(jìn)一步判斷當(dāng)前時(shí)刻內(nèi)存中是否有需要傳送給DSP的數(shù)據(jù),如果有則發(fā)起DMA讀操作,通過PCI總線從內(nèi)存中讀出數(shù)據(jù),并且寫入當(dāng)前下行郵箱。作為一種替代方案,DMA控制器也可以不主動(dòng)檢查DSP的各個(gè)下行郵箱是否可以寫入,而是在內(nèi)存中有數(shù)據(jù)需要傳送給DSP時(shí),由CPU向DMA控制器發(fā)送預(yù)先設(shè)定的指令,然后DMA控制器才開始檢查DSP各個(gè)下行郵箱的狀態(tài)。
以上敘述只針對DMA控制器支持一個(gè)DSP的情況,對于DMA控制器支持多個(gè)DSP的情況,在工作時(shí)DMA控制器可以用片選信號來選定某個(gè)DSP,然后按照圖2到圖4所述的方案進(jìn)行處理。這時(shí),有可能出現(xiàn)多個(gè)DSP同時(shí)向DMA控制器發(fā)送中斷的情況,這時(shí)候,DMA控制器也可以根據(jù)預(yù)先為每個(gè)DSP所設(shè)定的優(yōu)先級,先處理由優(yōu)先級高的DSP所發(fā)出的中斷請求。
總之,以上所述僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法,其特征在于,該方法包括A1、判斷數(shù)字信號處理器DSP的上行郵箱是否有需要傳送給內(nèi)存的數(shù)據(jù),如果有則執(zhí)行步驟B1,否則結(jié)束當(dāng)前流程;B1、判斷內(nèi)存是否可寫,如果是,則執(zhí)行步驟C1,否則結(jié)束當(dāng)前流程;C1、從DSP的上行郵箱中讀取數(shù)據(jù),并將所讀取的數(shù)據(jù)寫入到內(nèi)存中。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,在DSP的上行郵箱中設(shè)置表示是否有數(shù)據(jù)需要傳送的校驗(yàn)字,步驟A1所述判斷DSP的上行郵箱是否有需要傳送給內(nèi)存的數(shù)據(jù)為判斷上行郵箱的校驗(yàn)字是否為主機(jī)可操作,如果是則認(rèn)為有需要傳送給內(nèi)存的數(shù)據(jù),否則認(rèn)為沒有;在步驟C1之后進(jìn)一步包括將上行郵箱的校驗(yàn)字設(shè)置為主機(jī)不可操作。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,在DSP的上行郵箱中設(shè)置表示待傳送數(shù)據(jù)長度的長度字,步驟C1所述從DSP的上行郵箱中讀取數(shù)據(jù)為根據(jù)所述長度字,從DSP的上行郵箱中讀取數(shù)據(jù)。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,設(shè)置先入先出FIFO隊(duì)列,步驟C1所述從DSP的上行郵箱中讀取數(shù)據(jù)為從DSP的上行郵箱中讀取數(shù)據(jù)并放入FIFO中;步驟C1所述將所讀取的數(shù)據(jù)寫入到內(nèi)存中為將FIFO中的數(shù)據(jù)寫入內(nèi)存中。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,為DSP的上行郵箱設(shè)置上行緩沖區(qū)描述符BD隊(duì)列,以及分別指向上行BD隊(duì)列中BD的BD上行寫指針和BD上行讀指針,步驟B1所述判斷內(nèi)存是否可寫為判斷所述BD上行寫指針指向的上行BD,是否為所述BD上行讀指針指向的上行BD的前一個(gè)上行BD,如果是則認(rèn)為內(nèi)存不可寫,否則認(rèn)為內(nèi)存可寫;步驟C1之后進(jìn)一步包括判斷所述BD上行寫指針是否指向上行BD隊(duì)列中的最后一個(gè)上行BD,如果是則修改所述BD上行寫指針指向上行BD隊(duì)列的第一個(gè)上行BD,否則修改所述BD上行寫指針指向上行BD隊(duì)列的下一個(gè)上行BD。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述上行BD包括數(shù)據(jù)所在內(nèi)存的地址域和內(nèi)存中數(shù)據(jù)的長度域,步驟C1所述將所讀取的數(shù)據(jù)寫入到內(nèi)存中為根據(jù)BD上行寫指針?biāo)赶虻纳闲蠦D中的數(shù)據(jù)所在內(nèi)存的地址域,將數(shù)據(jù)寫入到內(nèi)存中,并且根據(jù)所寫入的數(shù)據(jù)長度,修改BD上行寫指針?biāo)赶虻纳闲蠦D的內(nèi)存中數(shù)據(jù)的長度域。
7.根據(jù)權(quán)利要求1所述的方法,其特征在于,在步驟C1之后進(jìn)一步包括判斷是否需要通知中央處理單元CPU處理內(nèi)存中的數(shù)據(jù),如果需要?jiǎng)t通知CPU,否則結(jié)束當(dāng)前流程。
8.根據(jù)權(quán)利要求1所述的方法,其特征在于,設(shè)置上行錯(cuò)誤信息寄存器,步驟C1進(jìn)一步包括判斷在從DSP的上行郵箱中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到內(nèi)存中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,如果出現(xiàn)則將所述錯(cuò)誤記錄在所述上行錯(cuò)誤信息寄存器中,并通知CPU查詢所述上行錯(cuò)誤信息寄存器。
9.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述上行BD進(jìn)一步包括出錯(cuò)信息域,步驟C1進(jìn)一步包括判斷在從DSP的上行郵箱中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到內(nèi)存中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,如果出現(xiàn),則將所述錯(cuò)誤記錄在所述上行BD的出錯(cuò)信息域中。
10.根據(jù)權(quán)利要求8或9所述的方法,其特征在于,設(shè)置先入先出FIFO隊(duì)列,步驟C1所述從DSP的上行郵箱中讀取數(shù)據(jù)為從DSP的上行郵箱中讀取數(shù)據(jù)并放入FIFO中;步驟C1所述將所讀取的數(shù)據(jù)寫入到內(nèi)存中為將FIFO中的數(shù)據(jù)寫入內(nèi)存中;所述判斷在從DSP的上行郵箱中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到內(nèi)存中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤為判斷是否發(fā)生FIFO滿荷的情況,如果出現(xiàn)則認(rèn)為出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,否則認(rèn)為未出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤。
11.一種在內(nèi)存和數(shù)字信號處理器之間傳送數(shù)據(jù)的方法,其特征在于,該方法包括A2、判斷數(shù)字信號處理器DSP的下行郵箱是否可以寫入,如果可以寫入,則執(zhí)行步驟B2,否則結(jié)束當(dāng)前流程;B2、判斷內(nèi)存中是否有需要傳送給DSP的數(shù)據(jù),如果有則執(zhí)行步驟C2,否則結(jié)束當(dāng)前流程;C2、從內(nèi)存中讀取數(shù)據(jù),并將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中。
12.根據(jù)權(quán)利要求11所述的方法,其特征在于,在DSP的下行郵箱中設(shè)置表示是否可以寫入的校驗(yàn)字,步驟A2所述判斷DSP的下行郵箱是否有需要傳送給內(nèi)存的數(shù)據(jù)為判斷下行郵箱的校驗(yàn)字是否為主機(jī)可操作,如果是則認(rèn)為可以寫入,否則認(rèn)為不可寫入;在步驟C之后進(jìn)一步包括將下行郵箱的校驗(yàn)字設(shè)置為主機(jī)不可操作。
13.根據(jù)權(quán)利要求11所述的方法,其特征在于,在DSP的下行郵箱中設(shè)置表示已寫入數(shù)據(jù)長度的長度字,步驟C2在所述將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱后進(jìn)一步包括根據(jù)寫入到DSP下行郵箱的數(shù)據(jù)長度,設(shè)置所述長度字。
14.根據(jù)權(quán)利要求11所述的方法,其特征在于,設(shè)置先入先出FIFO隊(duì)列,步驟C2所述從內(nèi)存中讀取數(shù)據(jù)為從內(nèi)存中讀取數(shù)據(jù)并放入FIFO中;步驟C2所述將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中為將FIFO中的數(shù)據(jù)寫入到DSP的下行郵箱中。
15.根據(jù)權(quán)利要求11所述的方法,其特征在于,為DSP的下行郵箱設(shè)置下行緩沖區(qū)描述符BD隊(duì)列,以及分別指向下行BD隊(duì)列中BD的BD下行寫指針和BD下行讀指針,步驟B2所述判斷內(nèi)存中是否有需要傳送給DSP的數(shù)據(jù)為判斷所述BD下行寫指針指向的下行BD,是否與所述BD下行讀指針指向下行BD隊(duì)列中的同一個(gè)下行BD,如果是則認(rèn)為內(nèi)存中沒有需要傳送給DSP的數(shù)據(jù),否則認(rèn)為內(nèi)存中有需要傳送給DSP的數(shù)據(jù);步驟C之后進(jìn)一步包括判斷所述BD下行寫指針是否指向下行BD隊(duì)列中的最后一個(gè)下行BD,如果是則修改所述BD下行寫指針指向下行BD隊(duì)列的第一個(gè)下行BD,否則修改所述BD下行寫指針指向下行BD隊(duì)列的下一個(gè)下行BD。
16.根據(jù)權(quán)利要求15所述的方法,其特征在于,所述下行BD包括數(shù)據(jù)所在內(nèi)存的地址域和內(nèi)存中數(shù)據(jù)的長度域,步驟C2所述從內(nèi)存中讀取數(shù)據(jù)為按照BD下行讀指針?biāo)赶虻南滦蠦D中所的數(shù)據(jù)所在內(nèi)存的地址域和內(nèi)存中數(shù)據(jù)的長度域,從內(nèi)存中讀取數(shù)據(jù)。
17.根據(jù)權(quán)利要求11所述的方法,其特征在于,在步驟C2之后進(jìn)一步包括判斷是否需要通知中央處理單元CPU處理內(nèi)存中的數(shù)據(jù),如果需要?jiǎng)t通知CPU,否則結(jié)束當(dāng)前流程。
18.根據(jù)權(quán)利要求11所述的方法,其特征在于,設(shè)置下行錯(cuò)誤信息寄存器,步驟C2進(jìn)一步包括判斷在從內(nèi)存中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,如果出現(xiàn),則將所述錯(cuò)誤記錄在所述下行錯(cuò)誤信息寄存器中,并通知CPU查詢所述下行錯(cuò)誤信息寄存器。
19.根據(jù)權(quán)利要求15所述的方法,其特征在于,所述下行BD進(jìn)一步包括出錯(cuò)信息域,步驟C進(jìn)一步包括判斷在從內(nèi)存中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,如果出現(xiàn),則將所述錯(cuò)誤記錄在所述下行BD的出錯(cuò)信息域中。
20.根據(jù)權(quán)利要求18或19所述的方法,其特征在于,設(shè)置等待時(shí)長,所述判斷在從內(nèi)存中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤為判斷在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱后,在所述等待時(shí)長內(nèi),是否收到DSP返回的確認(rèn)信息,如果收到則認(rèn)為未出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,否則認(rèn)為出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤。
21.根據(jù)權(quán)利要求18或19所述的方法,其特征在于,設(shè)置等待時(shí)長和最大重試次數(shù),所述判斷在從內(nèi)存中讀取數(shù)據(jù)的過程中,和/或,在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中的過程中是否出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤為D1、判斷在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱后,在所述等待時(shí)長內(nèi),是否收到DSP返回的確認(rèn)信息,如果收到則認(rèn)為未出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,否則執(zhí)行步驟D2;D2、判斷所述向DSP的下行郵箱寫入數(shù)據(jù)的操作所進(jìn)行的次數(shù),是否超過所述最大重試次數(shù),如果超過則認(rèn)為出現(xiàn)數(shù)據(jù)傳輸錯(cuò)誤,否則再次將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱中,返回執(zhí)行步驟D1。
22.根據(jù)權(quán)利要求14所述的方法,其特征在于,設(shè)置等待時(shí)長和最大重試次數(shù),步驟C2進(jìn)一步包括C21、判斷在將所讀取的數(shù)據(jù)寫入到DSP的下行郵箱后,在所述等待時(shí)長內(nèi),是否收到DSP返回的確認(rèn)信息,如果收到則釋放所讀取數(shù)據(jù)占用的FIFO存儲資源,否則執(zhí)行步驟C22;C22、判斷所述向DSP的下行郵箱寫入數(shù)據(jù)的操作所進(jìn)行的次數(shù),是否超過所述最大重試次數(shù),如果超過則釋放所讀取數(shù)據(jù)占用的FIFO存儲資源,否則再次將所讀取數(shù)據(jù)寫入到DSP的下行郵箱中,返回執(zhí)行步驟C21。
全文摘要
本發(fā)明公開了一種從數(shù)字信號處理器DSP向內(nèi)存?zhèn)魉蛿?shù)據(jù)的方法,包括A1、判斷DSP的上行郵箱是否有需要傳送給內(nèi)存的數(shù)據(jù),如果有則執(zhí)行步驟B1,否則結(jié)束當(dāng)前流程;B1、判斷內(nèi)存是否可寫,如果是則從DSP的上行郵箱中讀取數(shù)據(jù)并寫入到內(nèi)存中,否則結(jié)束當(dāng)前流程。本發(fā)明還公開了一種從內(nèi)存向DSP傳送數(shù)據(jù)的方法,包括A2、判斷DSP的下行郵箱是否可以寫入,如果可以,則執(zhí)行步驟B2,否則結(jié)束當(dāng)前流程;B2、判斷內(nèi)存中是否有需要傳送給DSP的數(shù)據(jù),如果有則從內(nèi)存中讀取數(shù)據(jù)并寫入到DSP的下行郵箱中,否則結(jié)束當(dāng)前流程。采用本發(fā)明所提供的技術(shù)方案,可以在不需要CPU參與的情況下,實(shí)現(xiàn)內(nèi)存和DSP之間的數(shù)據(jù)傳送。
文檔編號G06F13/00GK1851678SQ20061008747
公開日2006年10月25日 申請日期2006年6月8日 優(yōu)先權(quán)日2006年6月8日
發(fā)明者王書劍 申請人:杭州華為三康技術(shù)有限公司