Proteger la sección crítica del espacio de usuario de la interrupción

2

Estoy usando Beagle Bone Black con el sistema operativo ARM de Linux 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 de enviar un comando de lectura y recibir valores medidos causaba un problema para mí para obtener una medición válida del chip. ¿Hay alguna forma de "proteger" la parte del código que se interrumpe en la ejecución? En otras palabras, deje que la sección de envío y lectura se complete sin ninguna interrupción.

    
pregunta danteDev

4 respuestas

2

Este es un enfoque diferente a su problema, y no se trata de trabajar dentro de Linux. En su lugar, 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 de tiempo real programable e Industrial Subsistema de comunicación (PRU-ICSS), a menudo solo PRU.

Las dos PRU se ejecutan independientemente del ARM que ejecuta Linux, por lo que no se ven afectadas por la programación de Linux; Linux no los interrumpirá ni los anulará.

Las PRU están diseñadas para el procesamiento en tiempo real y tienen acceso a todas las E / S. Son núcleos RISC que funcionan a 200 MHz, por lo que deben ser lo suficientemente rápidos y ser capaces de hacer 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 de Linux' principal interactúa con una PRU.

Editar:
Este es un curso de sobre el uso de la PRU .

    
respondido por el gbulmer
1

Está buscando la solución incorrecta al problema. Corrige el software correctamente en su lugar.

SPI es completamente síncrono. Ya que eres el amo, eres dueño del reloj. Con las rutinas SPI diseñadas adecuadamente, no debería haber daño en los ciclos de robo de interrupciones de manera arbitraria. Todo lo que debería hacer es alargar el tiempo entre transiciones, lo que no debería ser un problema.

    
respondido por el Olin Lathrop
1

Ninguna interrupción debería tomar 5 ms, eso es para siempre ...

Sin embargo, es posible que se le anule, en cuyo caso puede considerar usar uno de los programadores en tiempo real de Posix en lugar del predeterminado, consulte las páginas del manual de sched_setscheduler para obtener más información.

Sin embargo, esta es una pregunta de software mucho más que una de hardware.

Saludos, Dan.

    
respondido por el Dan Mills
0

Si ocurre con poca frecuencia, establezca una marca 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 dicha bandera.

    
respondido por el Andy aka

Lea otras preguntas en las etiquetas