2012-09-25 7 views
5

GPIO pinini yüksek/düşük değiştiren ve en yüksek ve en düşük (udelay kullanarak) gecikme olan bir rutine sahibim ve sonra GPIO'yu örneklendirir bir süre için devlet. Kodun bu kısmının programlayıcı tarafından veya herhangi bir olası kesinti tarafından önceden boşaltılmadan gerçekleştirildiğinden emin olmam gerekir. Çift çekirdekli ARM sisteminde kod çalıştırıyorum, bu yüzden SMP olmalı. Spin_Lock_IrqSave(), bu amaç için yeterince güvenli midir? Kodumun bazen bir şekilde kesintiye uğradığını ancak henüz kanıt olmadığını hissediyorum.Linux'ta, herhangi bir kesinti olmaksızın bir kod dizisinin nasıl yürütüleceğinden emin olunması

Çok teşekkürler.

cevap

4

Ön ödemeyi devre dışı bırakmak istiyorsanız, preempt_disable() ve preempt_enable()'u kullanın. Eğer kesmeler devre dışı kullanmak istiyorsanız local_irq_disable() ve

spin_lock_irqsave bazı "gerçek zamanlı" geliştirmeleri bazen spinlocks planlamak için izin, bu yüzden ne demek istediğini söylemek her zaman en iyi olsa, bunların her ikisini de normalde olacaktır.

+0

Cevabınız için çok teşekkürler. Hem ara vermek hem de engellemeyi devre dışı bırakmak ve rutinimden herhangi birinin herhangi bir kesinti olmadan yürütülebilmesini sağlamak istiyorum. Rutin GPIO sürücüsünü (gpio_set/reset_value, gpio_direction_input/output) ve ayrıca udelay işlevlerini çağırmalıdır. Bu durumda, spin_lock_irqsave yeterince güvenli mi? Tekrar teşekkürler – user1697356