2009-11-25 20 views
7

¿Hay alguna función memcpy asincrónica en Linux? Quiero que funcione con DMA y notificarme cuando se complete.memcpy asincrónico en Linux?

+0

¿Qué plataforma? ¿Es esto x86? –

+1

Es un procesador ARM9, microcontrolador Freescale iMX233. – SunnyShah

Respuesta

7

Por lo que sé, la CPU no puede/no puede hacer DMA a sí misma. Entonces necesitas un hardware externo en el bus para hacer el truco para ti.

Sin embargo, la mayoría del hardware no puede ocupar toda la memoria física, por lo que no es posible una copia exacta de memcpy a menos que tenga definiciones muy estrictas de rangos de direcciones de memoria en su caso de uso. De lo contrario, kernel tendría que memcpy el bloque a su propio bloque de memoria que mataría el propósito de clonar memcpy en primer lugar :)

Pero aún así si quieres crear un "clon" de un bloque de memoria sin usar memcpy (aún así, es una mala idea porque el acceso a la memoria DMA suele ser más lento que el de la CPU), puede enviar el bloque de memoria a la tarjeta de video y volver a colocarlo en otro buffer. Incluso podría colocar el bloque en la memoria de video (putbitmap()? :)) y hacer un bitblt acelerado por hardware() para crear una copia sobre la marcha.

¿Te importa compartir tu objetivo real para que la gente pueda pensar en trucos más inteligentes/mejores?

+0

@ssg, Mi objetivo real es crear un reproductor de video optimizado, en él copio mis datos de YUV a su cola. Ahora esa copia tarda 2 segundos, si esta copia ocurre a través de DMA que en este momento, en otro hilo puedo hacer decodificación de audio. – SunnyShah

+3

@Sunny Shah, ¿Debería estar buscando una solución de copia cero quizás utilizando memoria compartida? ¿Por qué estás copiando grandes trozos de memoria? – Dipstick

+1

FFMPEG genera YUVFrame como salida de función de decodificación. cuando quieras el próximo YUVFrame, solo edita el YUVFrame existente para crear uno nuevo. Entonces, lo que hago es copiar IUVFrame a la cola de los buffers y mostrar el frame de la cola cuando llegue el momento. Esta copia toma alrededor del 7% del tiempo de procesamiento. – SunnyShah

3

En un procesador multinúcleo o incluso solo en un procesador con hyper-threading, puede ordenar lo que desee ejecutando el habitual (síncrono) memcpy en una secuencia separada. No digo que sea una buena idea, solo señalar lo obvio.

1

Puede hacer algunas reproducciones con mremap. O puede hackear FFmpeg para usar diferentes búferes para diferentes marcos.