2012-09-25 14 views
5

Ho una routine che commuta il pin GPIO alto/basso, e ha un ritardo tra gli alti e bassi (usando udelay), e quindi campiona il GPIO stato per un certo periodo. Ho bisogno di assicurarmi che questa parte del codice sia eseguita senza essere preclusa dallo scheduler o da eventuali interruzioni. Sto eseguendo il codice su un sistema ARM dual-core quindi dovrebbe essere SMP. Spin_Lock_IrqSave() è abbastanza sicuro per tale scopo? Ho la sensazione che il mio codice sia ancora in qualche modo interrotto occasionalmente ma nessuna prova ancora.In Linux, come assicurarsi che una sequenza di codice venga eseguita senza alcuna interruzione

Grazie mille.

risposta

4

Se si desidera disabilitare la prelazione, utilizzare preempt_disable() e preempt_enable(). Se si desidera disattivare gli interrupt, utilizzare local_irq_disable() e

spin_lock_irqsave normalmente fare entrambe le cose di questi, anche se alcuni miglioramenti "in tempo reale" a volte permettono spinlocks di programmare, quindi è sempre meglio dire quello che vuoi dire.

+0

Grazie mille per la risposta. Voglio disabilitare sia gli interrupt che i preemption e assicurarmi che una delle mie routine possa essere eseguita senza alcuna interruzione. La routine deve chiamare il driver GPIO (gpio_set/reset_value, gpio_direction_input/output) e anche le funzioni udelay. In questo caso, spin_lock_irqsave è abbastanza sicuro? Grazie ancora – user1697356

Problemi correlati