Pregunta:
¿Qué tan rápido es GPIO + DMA? Entrada múltiple I2S
adiblol
2013-09-18 07:56:44 UTC
view on stackexchange narkive permalink

Quiero conectar varios ADC I2S a RaspberryPi y grabar audio multicanal. Calculé que requiere copiar el puerto de entrada GPIO a la RAM a 3072kHz (o cada 0.33µs). Quiero hacerlo usando DMA.

Sé que PiBlaster (PWM) y PiFM (transmisor de radio) usan DMA pero el período de muestreo más bajo fue de aproximadamente 4 µs.

Entonces, ¿es posible leer GPIO a 3072kHz, usando DMA?

Los cálculos detallados por qué necesito 3072kHz están en el foro de RaspberryPi: http://www.raspberrypi.org /phpBB3/viewtopic.php?f=44&t=55799. Aquí solo pregunto sobre el rendimiento de GPIO y DMA.

Sugeriría hacer esta pregunta sobre el intercambio de pilas de productos electrónicos. Hay algunos chicos experimentados que podrían ayudarlo.
Pertenece a la Bolsa de Electrónica
Tres respuestas:
Philip Ashmore
2013-10-24 03:20:56 UTC
view on stackexchange narkive permalink

Escribí una biblioteca de C ++ llamada v3c-raspi. Puedes descargarla de SourceForge.

Escribí un programa de ejemplo que intenta hacer exactamente lo que quieres, llamado " i2s ".

Desafortunadamente, experimenta una" anomalía del programa "en cualquier lugar, desde inmediatamente hasta un par de segundos después de iniciarse; parece que algo más usa el canal dma 0 y deja basura en el registro de direcciones del bloque.

Podría hacer que la Raspberry Pi procese alrededor de 16 millones de bloques de control DMA por segundo (en otra prueba).

Los micrófonos i2s que planeo usar son los Analog Devices ADMP441 que salida de audio de 24 bits.

A 48 kHz es una frecuencia de reloj de bits de 48000 x 32 = 1,536 MHz. El código también alterna el reloj usando dma, por lo que duplicamos la frecuencia a 3,072 MHz.

Agregue pausas de PWM y duplicará el número de bloques de control nuevamente a 6.144 millones, aún dentro de los 16 millones que podría salir del rpi.

Informé un error sobre este mismo problema a Raspbian pero no hay respuestas y et.

Resolví la mayoría de los problemas; consulte la lista de correo linux-rpi-kernel de noviembre de 2013, mensaje 000734 para obtener más información.

Está limitado a aproximadamente 2 millones de muestras / seg. podría capturar muestras de 22,1 kHz de 8 pares estéreo con él.

Hay una lista de canales DMA utilizados por la GPU. Estoy bastante seguro de que el canal 0 se usa para la pantalla.
En cmdline.txt, especifica qué canales DMA puede usar el kernel (y sus módulos). Solo busque en Google "dma.dmachans = 0x7f35" para más. En v3c-raspi / v3c / examples / i2s.cpp tomé nota de los canales dma que probé - busque "permitir que los programas en modo usuario usen DMA 0, 4, 5" .Recuerdo haber probado el canal 0 de DMA con éxito, pero no sé cómo lo maneja el video-kernel-module / GPU / binary-blob.
Podemos especificar lo que queremos. Sin embargo, si usamos los canales DMA 0, 1, 2, 3, 6 o 7 tendremos conflictos con el kernel y / o GPU.
El núcleo es donde ocurre este arbitraje.
Hender
2015-05-01 20:28:35 UTC
view on stackexchange narkive permalink

Solo mira esto.

Ejemplo de Raspberry-Pi-DMA

https://github.com/Wallacoloo/Raspberry-Pi-DMA-Example

El enlace explica cómo usar DMA para la salida GPIO, el OP pregunta sobre la entrada.
Tienes toda la razón, culpa mía. Pero mucha información sobre DMA.
Nielsvh
2013-10-18 21:41:04 UTC
view on stackexchange narkive permalink

Los pines GPIO no pueden manejar tales velocidades. Descubrí que la velocidad máxima de lectura del encabezado GPIO es de aproximadamente 1 kHz. El máximo que puede manejar la UART es de aproximadamente 1 Mbaud para una comunicación estable y 4 Mbaud es el máximo que puede manejar el kernel. Cualquier valor superior a 1 Mbaudios requiere USB o Ethernet. Según la documentación, puede acceder a DMA, cuya velocidad es sustancialmente más rápida que la de la UART. También evita la CPU, lo que hace que la operación sea más barata a largo plazo.

¿Cómo probaste eso? ¿Ha intentado utilizar una interfaz basada en mmap?
Hice que un generador de señales enviara 'a' a 1 MBaud y usé el código mmap que se encuentra [aquí] (http://elinux.org/RPi_Low-level_peripherals#C_2) y leí la información en un bucle while con la bandera O3 de gcc, cada Se me ocurrió la optimización de código y se ejecuta sin la interfaz de usuario. Lo más rápido que pudo manejar son los mensajes de 4Mbaud (el soporte del kernel se detiene en 4Mbaud). La transmisión continua de mensajes fue _realmente_ irregular y superó los 1 Mbaudios.
SPI puede manejar 32Mbps si tiene cuidado con el acondicionamiento de su señal. La velocidad máxima del encabezado GPIO es del orden de 10 Mbps. No entiendo qué error tipográfico podría haber resultado en el 1kHz de su publicación.
Bueno, la discusión aquí es sobre DMA. Bueno, que está mucho más allá de 1 kHz.


Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...