2009-11-25 43 views
7

在linux中是否有任何異步memcpy函數?我希望它能與DMA協同工作,並在完成時通知我。linux中的異步memcpy?

+0

什麼平臺?這是x86嗎? – 2009-11-25 20:44:33

+1

它是ARM9處理器,飛思卡爾iMX233微控制器。 – SunnyShah 2009-11-26 02:42:35

回答

7

據我所知,CPU不/不能做DMA本身。所以你需要在總線上安裝一個外部硬件來爲你解決問題。

然而,大多數硬件不能滿足所有的物理內存,所以確切的memcpy克隆是不可能的,除非你有內存地址範圍非常嚴格的定義,在您的使用案例。否則內核將不得不將memcpy塊存儲到自己的內存塊本身,這將會首先破壞memcpy的複製目的:)

但是,如果您想要在不使用memcpy的情況下創建內存塊的「克隆」 (順便說一下,由於DMA內存訪問速度通常比CPU慢),您可以將內存塊發送到視頻卡並將其拉回到另一個緩衝區。您甚至可以將該塊放入視頻內存(putbitmap()?:))中,並執行硬件加速的bitblt()以實時創建副本。

你介意分享您的實際目標,使人們或許能想出聰明/更好的招數?

+0

@ssg,我的實際目標是創建優化的視頻播放器,其中我將我的YUV數據複製到隊列中。現在複製需要2秒,如果這個複製通過DMA發生,那麼在另一個線程中,我可以做音頻解碼。 – SunnyShah 2009-11-25 16:37:34

+3

@Sunny Shah,你應該看看可能使用共享內存的零拷貝解決方案?你爲什麼要複製這麼大的內存塊? – Dipstick 2009-11-25 16:51:50

+1

FFMPEG輸出YUVFrame作爲解碼功能輸出。當你想要下一個YUVFrame時,它只是編輯現有的YUVFrame來創建新的YUVFrame。所以我所做的是將YUVFrame複製到緩衝區隊列中,並在隊列到來時顯示隊列。該副本大約需要7%的處理時間。 – SunnyShah 2009-11-25 17:05:14

3

在多核處理器或甚至只有處理器hyper-threading,您可以通過在單獨的線程中執行通常的(同步)memcpy來滿足您的需求。我不是說這是一個好主意,只是指出顯而易見的一點。

1

你可以做一些戲劇與mremap。 或者你可以破解FFmpeg,爲不同的幀使用不同的緩衝區。