2012-09-25 22 views
5

Tengo una rutina que alterna el pin GPIO alto/bajo, y tengo un retraso entre los altos y bajos (usando udelay), y luego muestras el GPIO estado por un cierto período. Necesito asegurarme de que esta parte del código se ejecute sin ser anticipada por el planificador o por posibles interrupciones. Estoy ejecutando el código en un sistema ARM de doble núcleo, por lo que debería ser SMP. ¿Es Spin_Lock_IrqSave() lo suficientemente seguro para tal fin? Tengo la sensación de que mi código todavía está siendo interrumpido de vez en cuando, pero aún no hay pruebas.En Linux, cómo asegurarme de que se ejecuta una secuencia de código sin ninguna interrupción

Muchas gracias.

Respuesta

4

Si desea deshabilitar la preferencia, use preempt_disable() y preempt_enable(). Si desea deshabilitar las interrupciones, utilice local_irq_disable() y

spin_lock_irqsave normalmente va a hacer ambas cosas, aunque algunas mejoras "en tiempo real" a veces permiten spinlocks para programar, por lo que siempre es mejor decir lo que quiere decir.

+0

Muchas gracias por su respuesta. Quiero deshabilitar tanto la interrupción como la preferencia, y asegurar que una de mis rutinas pueda ejecutarse sin interrupción. La rutina necesita llamar al controlador GPIO (gpio_set/reset_value, gpio_direction_input/output) y también a las funciones udelay. En este caso, ¿spin_lock_irqsave es lo suficientemente seguro? Gracias de nuevo – user1697356

Cuestiones relacionadas