2012-09-25 14 views
5

Mam rutynę, która przełącza GPIO pin wysoki/niski i mieć opóźnienie między wzlotów i upadków (przy użyciu udelay), a następnie próbki GPIO stan na pewien okres. Muszę się upewnić, że ta część kodu jest wykonywana bez uprzedzenia przez program planujący lub przez jakiekolwiek możliwe przerwania. Używam kodu w dwurdzeniowym systemie ARM, więc powinien to być SMP. Czy Spin_Lock_IrqSave() jest wystarczająco bezpieczny do tego celu? Mam wrażenie, że mój kod wciąż jest w jakiś sposób przerywany, ale nie ma jeszcze dowodów.W systemie Linux, jak upewnić się, że sekwencja kodu jest wykonywana bez przerwy

Wielkie dzięki.

Odpowiedz

4

Jeśli chcesz wyłączyć pierwszeństwo, użyj preempt_disable() i preempt_enable(). Jeśli chcesz wyłączyć przerwania, należy local_irq_disable() i

spin_lock_irqsave normalnie zrobić zarówno z nich, choć niektórzy „w czasie rzeczywistym” ulepszenia czasami pozwalają spinlocks zaplanować, tak jest zawsze najlepiej powiedzieć, co masz na myśli.

+0

Dziękuję bardzo za odpowiedź. Chcę wyłączyć zarówno przerwanie, jak i pierwszeństwo i upewnić się, że jedna z moich procedur może zostać wykonana bez żadnych przerw. Procedura musi wywoływać sterownik GPIO (gpio_set/reset_value, gpio_direction_input/output), a także funkcje udelay. W takim przypadku czy spin_lock_irqsave jest wystarczająco bezpieczny? Dzięki jeszcze raz – user1697356

Powiązane problemy