2009-11-25 24 views
7

Esiste una funzione memcpy asincrona in linux? Voglio che funzioni con DMA e avvisami quando viene completato.memcpy asincrono in linux?

+0

Quale piattaforma? È questo x86? –

+1

E 'un processore ARM9, un microcontrollore Freescale iMX233. – SunnyShah

risposta

7

Per quanto ne so, non CPU/non può fare DMA a se stesso. Quindi hai bisogno di un hardware esterno sul bus per fare il trucco per te.

Tuttavia la maggior parte hardware non può indirizzare tutta la memoria fisica, quindi un clone esatto memcpy non è possibile se non si hanno definizioni molto rigorosi su intervalli di indirizzi di memoria nel caso d'uso. Altrimenti il ​​kernel dovrebbe memcpare il blocco al proprio blocco di memoria stesso che ucciderebbe lo scopo della clonazione memcpy in primo luogo :)

Ma ancora se si vuole creare un "clone" di un blocco di memoria senza usare memcpy (ancora una cattiva idea, a proposito perché l'accesso alla memoria DMA è di solito più lento di quello della CPU) è possibile inviare il blocco di memoria alla scheda video e rimetterlo in un altro buffer. Potresti anche essere in grado di inserire il blocco nella memoria video (putbitmap()? :)) e fare un bitblt() accelerato dall'hardware per creare una copia al volo.

ti dispiace condividere il vostro obiettivo reale così forse la gente può venire con più intelligenti/trucchi migliori?

+0

@ssg, Il mio vero obiettivo è quello di creare video player ottimizzato, In esso copio i miei dati YUV alla sua coda. Ora quella copia impiega 2 secondi, Se questa copia avviene tramite DMA piuttosto che In questo momento In un'altra discussione posso eseguire la decodifica audio. – SunnyShah

+3

@Sunny Shah, dovresti guardare una soluzione a zero copie magari usando la memoria condivisa? Perché copi così tanti pezzi di memoria? – Dipstick

+1

FFMPEG emette YUVFrame come uscita della funzione di decodifica. quando vuoi il prossimo YUVFrame, modifica solo YUVFrame esistente per crearne di nuovi. Quindi, quello che faccio è, copio YUVFrame in coda di buffer e mostrerò il frame dalla coda quando sarà il momento. Questa copia richiede circa il 7% del tempo di elaborazione. – SunnyShah

3

Su un processore multicore o anche solo su un processore con hyper-threading, è possibile eseguire l'ordinario (in modo sincrono) memcpy in un thread separato. Non sto dicendo che sia una buona idea, solo sottolineando l'ovvio.

1

Si può fare qualche gioca con mremap. Oppure puoi hackerare FFmpeg per usare diversi buffer per diversi frame.