Estoy usando Beagle Bone Black con Arch Linux ARM OS para comunicarme con el chip ltc-6804 a través del puerto SPI. Llegué a un punto en el que la interrupción del sistema operativo en medio del envío del comando de lectura y la recepción de los valores medidos me causó problemas para obtener una medición válida del chip. ¿Hay alguna forma de "proteger" la parte del código que se interrumpe durante la ejecución? En otras palabras, deje que la sección de envío y lectura se complete sin ninguna interrupción.
Este es un enfoque diferente a su problema, y no se trata de trabajar dentro de Linux. En cambio, se trata de usar otros recursos de BeagleBone Black para resolver el problema.
Además del ARM Corex-A8, el BeagleBone Black también tiene dos procesadores más, llamados subsistema de unidad programable en tiempo real y subsistema de comunicación industrial (PRU-ICSS), a menudo solo PRU.
Las dos PRU se ejecutan independientemente del ARM que ejecuta Linux y, por lo tanto, no se ven afectadas por la programación de Linux; no serán interrumpidos ni reemplazados por Linux.
Las PRU están diseñadas para el procesamiento en tiempo real y tienen acceso a todas las E/S. Son núcleos RISC, cada uno de los cuales funciona a 200 MHz, por lo que deberían ser lo suficientemente rápidos y capaces de hacer todo lo que necesites. Podría dedicar uno a su tarea de comunicación SPI.
Se pueden programar en C o ensamblador. Hay varios artículos útiles en la web, este en Hackspace tiene enlaces útiles a ejemplos clave y tecnología. IIRC hay ejemplos que muestran cómo el 'procesador Linux' principal interactúa con una PRU.
Editar:
Este es un curso sobre el uso de la PRU .
Estás buscando la solución equivocada al problema. Arregle el software correctamente en su lugar.
SPI es completamente síncrono. Como eres el amo, eres el dueño del reloj. Con rutinas SPI diseñadas correctamente, no debería haber ningún daño en los ciclos de robo de interrupciones arbitrariamente. Todo lo que debería hacer es estirar el tiempo entre las transiciones, lo que no debería ser un problema.
Ninguna interrupción debería tomar 5 ms, eso es para siempre....
Sin embargo, es posible que se le esté adelantando, en cuyo caso puede considerar usar uno de los programadores posix en tiempo real en lugar del predeterminado, consulte las páginas de manual de sched_setscheduler para obtener más detalles.
Sin embargo, esto es mucho más una cuestión de software que de hardware.
Saludos, Dan.
Si sucede con poca frecuencia, establezca una bandera en la rutina de interrupción que es inspeccionada por la rutina de lectura spi. Si está configurado, repita la operación de lectura después de borrar dicho indicador.
pjc50
dantedev
pjc50
dantedev